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  }