cmd/istanbul: refactor decode/encode function

This commit is contained in:
Edwin 2017-08-08 14:56:49 +08:00
parent cc1f727e01
commit 69bda30e96
3 changed files with 70 additions and 49 deletions

View File

@ -17,14 +17,11 @@
package main
import (
"bytes"
"fmt"
"os"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/rlp"
"github.com/getamis/istanbul-tools/cmd/istanbul/extradata"
"github.com/naoina/toml"
"github.com/urfave/cli"
)
@ -67,33 +64,37 @@ func encode(ctx *cli.Context) error {
}
if len(path) != 0 {
if err := fromConfig(path); err != nil {
extraData, err := fromConfig(path)
if err != nil {
return cli.NewExitError("Failed to encode from config data", 0)
}
fmt.Println("Encoded Istanbul extra-data:", extraData)
}
if len(validators) != 0 {
if err := fromRawData(ctx.String(VanityFlag.Name), validators); err != nil {
extraData, err := fromRawData(ctx.String(VanityFlag.Name), validators)
if err != nil {
return cli.NewExitError("Failed to encode from flags", 0)
}
fmt.Println("Encoded Istanbul extra-data:", extraData)
}
return nil
}
func fromRawData(vanity string, validators string) error {
func fromRawData(vanity string, validators string) (string, error) {
vs := splitAndTrim(validators)
addrs := make([]common.Address, len(vs))
for i, v := range vs {
addrs[i] = common.HexToAddress(v)
}
return encodeExtraData(vanity, addrs)
return extradata.Encode(vanity, addrs)
}
func fromConfig(path string) error {
func fromConfig(path string) (string, error) {
file, err := os.Open(path)
if err != nil {
return cli.NewExitError(fmt.Sprintf("Failed to read config file: %v", err), 1)
return "", cli.NewExitError(fmt.Sprintf("Failed to read config file: %v", err), 1)
}
defer file.Close()
@ -103,10 +104,10 @@ func fromConfig(path string) error {
}
if err := toml.NewDecoder(file).Decode(&config); err != nil {
return cli.NewExitError(fmt.Sprintf("Failed to parse config file: %v", err), 2)
return "", cli.NewExitError(fmt.Sprintf("Failed to parse config file: %v", err), 2)
}
return encodeExtraData(config.Vanity, config.Validators)
return extradata.Encode(config.Vanity, config.Validators)
}
func decode(ctx *cli.Context) error {
@ -114,47 +115,13 @@ func decode(ctx *cli.Context) error {
return cli.NewExitError("Must supply extra data", 10)
}
return decodeExtraData(ctx.String(ExtraDataFlag.Name))
}
func encodeExtraData(vanity string, validators []common.Address) error {
newVanity, err := hexutil.Decode(vanity)
extraString := ctx.String(ExtraDataFlag.Name)
vanity, istanbulExtra, err := extradata.Decode(extraString)
if err != nil {
return err
}
if len(newVanity) < types.IstanbulExtraVanity {
newVanity = append(newVanity, bytes.Repeat([]byte{0x00}, types.IstanbulExtraVanity-len(newVanity))...)
}
newVanity = newVanity[:types.IstanbulExtraVanity]
ist := &types.IstanbulExtra{
Validators: validators,
Seal: make([]byte, types.IstanbulExtraSeal),
CommittedSeal: [][]byte{},
}
payload, err := rlp.EncodeToBytes(&ist)
if err != nil {
return err
}
fmt.Println("Encoded Istanbul extra-data:", "0x"+common.Bytes2Hex(append(newVanity, payload...)))
return nil
}
func decodeExtraData(extraData string) error {
extra, err := hexutil.Decode(extraData)
if err != nil {
return err
}
istanbulExtra, err := types.ExtractIstanbulExtra(&types.Header{Extra: extra})
if err != nil {
return err
}
fmt.Println("vanity: ", "0x"+common.Bytes2Hex(extra[:types.IstanbulExtraVanity]))
fmt.Println("vanity: ", "0x"+common.Bytes2Hex(vanity))
for _, v := range istanbulExtra.Validators {
fmt.Println("validator: ", v.Hex())

View File

@ -0,0 +1,19 @@
package extradata
import (
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types"
)
func Decode(extraData string) ([]byte, *types.IstanbulExtra, error) {
extra, err := hexutil.Decode(extraData)
if err != nil {
return nil, nil, err
}
istanbulExtra, err := types.ExtractIstanbulExtra(&types.Header{Extra: extra})
if err != nil {
return nil, nil, err
}
return extra[:types.IstanbulExtraVanity], istanbulExtra, nil
}

View File

@ -0,0 +1,35 @@
package extradata
import (
"bytes"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/rlp"
atypes "github.com/getamis/go-ethereum/core/types"
)
func Encode(vanity string, validators []common.Address) (string, error) {
newVanity, err := hexutil.Decode(vanity)
if err != nil {
return "", err
}
if len(newVanity) < atypes.IstanbulExtraVanity {
newVanity = append(newVanity, bytes.Repeat([]byte{0x00}, atypes.IstanbulExtraVanity-len(newVanity))...)
}
newVanity = newVanity[:atypes.IstanbulExtraVanity]
ist := &atypes.IstanbulExtra{
Validators: validators,
Seal: make([]byte, atypes.IstanbulExtraSeal),
CommittedSeal: [][]byte{},
}
payload, err := rlp.EncodeToBytes(&ist)
if err != nil {
return "", err
}
return "0x" + common.Bytes2Hex(append(newVanity, payload...)), nil
}