github.com/klaytn/klaytn@v1.12.1/consensus/istanbul/backend/randao_test.go (about) 1 package backend 2 3 import ( 4 "math/big" 5 "testing" 6 7 "github.com/klaytn/klaytn/common" 8 "github.com/klaytn/klaytn/common/hexutil" 9 "github.com/klaytn/klaytn/crypto/bls" 10 "github.com/stretchr/testify/assert" 11 ) 12 13 // Test low-level computation components 14 func TestCalcRandao(t *testing.T) { 15 var ( 16 skhex = hexutil.MustDecode("0x6c605527c8e4f31c959478801d51384d690a22dfc6438604646f7709032c893a") 17 sk, _ = bls.SecretKeyFromBytes(skhex) 18 pk = sk.PublicKey() 19 20 // block_num_to_bytes() = num.to_bytes(32, byteorder="big") 21 num = big.NewInt(31337) 22 msg = common.HexToHash("0x0000000000000000000000000000000000000000000000000000000000007a69") 23 24 // mix2 = xor(mix1, keccak256(sig)) 25 sig = hexutil.MustDecode("0xadfe25ced45819332cbf088f01cdd2807686dd6309b11d7440237dd623624f401d4753747f5fb92374235e997edcd18318bae2806a1675b1e685e792abd1fbdf5c50ec1e148cc7fe861984d8bc3204c1b2136725b176902bc52eeb595919df3b") 26 mix1 = hexutil.MustDecode("0x8019df1a2a9f833dc7f400a15b33e54a5c80295165c5953dc23891aab9203810") 27 mix2 = hexutil.MustDecode("0x8772d58248bdf34e81ecbf36f28299cfa758b61ccf3f64e1dc0646687a55892f") 28 ) 29 30 // Calculate RandomReveal and MixHash 31 assert.Equal(t, msg, calcRandaoMsg(num)) 32 assert.Equal(t, sig, bls.Sign(sk, msg[:]).Marshal()) 33 assert.Equal(t, mix2, calcMixHash(sig, mix1)) 34 35 // Verify signature 36 ok, err := bls.VerifySignature(sig, msg, pk) 37 assert.Nil(t, err) 38 assert.True(t, ok) 39 } 40 41 func TestRandao_Prepare(t *testing.T) { 42 config := testRandaoConfig.Copy() 43 44 ctx := newTestContext(1, config, nil) 45 chain, engine := ctx.chain, ctx.engine 46 defer ctx.Cleanup() 47 48 header := ctx.MakeHeader(chain.Genesis()) 49 assert.Nil(t, engine.Prepare(chain, header)) 50 51 assert.Len(t, header.RandomReveal, 96) 52 assert.Len(t, header.MixHash, 32) 53 assert.NotEqual(t, header.RandomReveal, make([]byte, 96)) 54 assert.NotEqual(t, header.MixHash, make([]byte, 32)) 55 } 56 57 func TestRandao_Verify(t *testing.T) { 58 config := testRandaoConfig.Copy() 59 60 ctx := newTestContext(1, config, nil) 61 chain, engine := ctx.chain, ctx.engine 62 defer ctx.Cleanup() 63 64 block := ctx.MakeBlockWithCommittedSeals(chain.Genesis()) 65 header := block.Header() 66 assert.Nil(t, engine.VerifyHeader(chain, header, false)) 67 }