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 }