github.com/kotalco/kotal@v0.3.0/clients/ethereum/extradata.go (about)

     1  package ethereum
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/hex"
     6  	"strings"
     7  
     8  	"github.com/ethereum/go-ethereum/common"
     9  	"github.com/ethereum/go-ethereum/rlp"
    10  	"github.com/kotalco/kotal/apis/shared"
    11  )
    12  
    13  // createExtraDataFromSigners creates extraDta genesis field value from initial signers
    14  func createExtraDataFromSigners(signers []shared.EthereumAddress) string {
    15  	extraData := "0x"
    16  	// vanity data
    17  	extraData += strings.Repeat("00", 32)
    18  	// signers
    19  	for _, signer := range signers {
    20  		// append address without the 0x
    21  		extraData += string(signer)[2:]
    22  	}
    23  	// proposer signature
    24  	extraData += strings.Repeat("00", 65)
    25  	return extraData
    26  }
    27  
    28  // createExtraDataFromValidators creates extraDta genesis field value from initial validators
    29  func createExtraDataFromValidators(validators []shared.EthereumAddress) (string, error) {
    30  	data := []interface{}{}
    31  	extraData := "0x"
    32  
    33  	// empty vanity bytes
    34  	vanity := bytes.Repeat([]byte{0x00}, 32)
    35  
    36  	// validator addresses bytes
    37  	decodedValidators := []interface{}{}
    38  	for _, validator := range validators {
    39  		validatorBytes, err := hex.DecodeString(string(validator)[2:])
    40  		if err != nil {
    41  			return extraData, err
    42  		}
    43  		decodedValidators = append(decodedValidators, validatorBytes)
    44  	}
    45  
    46  	// no vote
    47  	var vote []byte
    48  
    49  	// round 0, must be 4 bytes
    50  	round := bytes.Repeat([]byte{0x00}, 4)
    51  
    52  	// no committer seals
    53  	committers := []interface{}{}
    54  
    55  	// pack all required info into data
    56  	data = append(data, vanity)
    57  	data = append(data, decodedValidators)
    58  	data = append(data, vote)
    59  	data = append(data, round)
    60  	data = append(data, committers)
    61  
    62  	// rlp encode data
    63  	payload, err := rlp.EncodeToBytes(data)
    64  	if err != nil {
    65  		return extraData, err
    66  	}
    67  
    68  	return extraData + common.Bytes2Hex(payload), nil
    69  
    70  }