github.com/klaytn/klaytn@v1.12.1/consensus/istanbul/backend/api_test.go (about) 1 package backend 2 3 import ( 4 "testing" 5 6 "github.com/klaytn/klaytn/blockchain/types" 7 "github.com/klaytn/klaytn/common" 8 "github.com/klaytn/klaytn/consensus/istanbul" 9 istanbulCore "github.com/klaytn/klaytn/consensus/istanbul/core" 10 "github.com/klaytn/klaytn/rlp" 11 "github.com/stretchr/testify/assert" 12 ) 13 14 func TestRecoverCommittedSeals(t *testing.T) { 15 // Baobab debug.getBlockRlp(144654443) 16 var ( 17 blockRlp = "f904f1f903c1a046f5775da65a7c9e9a12d2ee4d010285df656ebd64c97cad2669c42c4aa39d8b94f90675a56a03f836204d66c0f923e00500ddc90aa0cec442b90b1d21e465474f7e5c233c3461e950bf383b39227917ad8a608653dfa004de211f466c3543bb2e3db8c976e9d046c214bc33c982d664b7e494d0c2c88aa0390d7c4c79e1e594bcc3236742112d9a7358652e66b1c97dea1c490e69276617b90100000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000002000000000000000000800000000000000000000010000020000000000000010000000000000000000000000000000000000006000000000000000000000004000000000000001240004000000000000000000000000000000000000004800000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000002000000000000000000000000000000000000000400000a00000000000000000000000000000000000000000000184089f406b8302c7158465b315d945b90187d883010c00846b6c617988676f312e32302e36856c696e757800000000000000f90164f85494571e53df607be97431a5bbefca1dffe5aef56f4d945cb1a7dccbd0dc446e3640898ede8820368554c89499fb17d324fa0e07f23b49d09028ac0919414db694b74ff9dea397fe9e231df545eb53fe2adf776cb2b841dc7dca1dc15d06e83a0a39217052ad7915d3b0f0a68f49d4b53498130a1212327b9dd5514362eb3e5f0ebb277e7d38baecad9cd045d3627d3a1f322422eeee8a01f8c9b8410a3fb9227632261c8520f1ee859c503f017701fdb92c2e39f532e190779888a63cf112cf2e530f656153ab64103558c26fb9ca43d5cf31425e62569f891e1eca00b8414a32097b87c481f145ae75ded4e8ec2ea4230c7b2feb3f3afcd2d22ea0b7d4596f4354e185d4f1f93b4d758ddb97e9203e1d306413ad0db1f4a779156879baa300b841fde66a2abb916bf314c82a2dfcd82ed356af829a98573d7cdb4a74cccb6ceecc22358750332ad31dccd9a890dbde7e0d4e21f173515011656f6c222169ba94620080808505d21dba00b860a027d1591d784686d063234bc000a8b9f829da534c41b555c867329b2b4abc5ef8f36245546adcc35c31dbc7c16b084a0d48487817b0eb191ac5b9aa8f3c908d413f19a1e784c3920fc0c0ef9180582902dc30ee8b70859e493af467bc227403a047f8b901fe5f4a3387cb6ccd5c14a00f7649247d2d2d315a652c378f328c1970f9012a31f90126830a596a850ba43b740083061a8094a317038414a275365ed4a085b786e83e761d20a580944dd5fa43054709155d5e68fadd3aeb3f853f34b0b844202ee0ed00000000000000000000000000000000000000000000000000000000000a596a0000000000000000000000000000000000000000000000000000000000000377f847f8458207f5a085d89c94a1e010f90b8e825e5321b1fff91ea748f50424448e17d5f1658498bda053936941c152ce9721447711a80c39b07fb36d42c8a8b6a258d8b071ab3b6c96945e6b99bca5a21818d40d12c56194674989146fc8f847f8458207f5a0c40d29e71cdd4f07051398fa35d41a25cc2f5db165d3ad8aa8b5eff20cc81996a01ea154d91320586165b139870e688a0ab4837137c5208a2da60cbdc60d7c7d81" 18 expectedProposer = common.HexToAddress("0x5cb1a7dccbd0dc446e3640898ede8820368554c8") 19 expectedValidators = []common.Address{ // the composition may differ by consensus node. this particular node has received following 3 votes. 20 common.HexToAddress("0x5cb1a7dccbd0dc446e3640898ede8820368554c8"), 21 common.HexToAddress("0x571e53df607be97431a5bbefca1dffe5aef56f4d"), 22 common.HexToAddress("0x99fb17d324fa0e07f23b49d09028ac0919414db6"), 23 } 24 ) 25 26 var block *types.Block 27 assert.Nil(t, rlp.DecodeBytes(common.FromHex(blockRlp), &block)) 28 extra, err := types.ExtractIstanbulExtra(block.Header()) 29 assert.Nil(t, err) 30 31 // check block seal 32 seal := extra.Seal 33 sigHash := sigHash(block.Header()) 34 proposer, _ := istanbul.GetSignatureAddress(sigHash[:], seal) 35 assert.Equal(t, proposer, expectedProposer) 36 t.Logf("%x %x -> %x\n", sigHash, seal, proposer) 37 38 // check committed seals manually 39 for i, seal := range extra.CommittedSeal { 40 sigData := istanbulCore.PrepareCommittedSeal(block.Hash()) 41 validator, _ := istanbul.GetSignatureAddress(sigData, seal) 42 assert.Equal(t, validator, expectedValidators[i]) 43 t.Logf("%x %x -> %x\n", sigData, seal, validator) 44 } 45 46 // check committed seals using RecoverCommittedSeals 47 validators, err := RecoverCommittedSeals(extra, block.Hash()) 48 assert.Nil(t, err) 49 assert.Equal(t, validators, expectedValidators) 50 }