Skip to content

Commit

Permalink
hardfork: add bsc chainID to encodeSigHeader when submitting evidence…
Browse files Browse the repository at this point in the history
… for slashing (#312)
  • Loading branch information
randyahx authored Dec 21, 2022
1 parent 727e8a1 commit f2247f4
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 40 deletions.
25 changes: 16 additions & 9 deletions bsc/header.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@ import (
"io"
"math/big"

"github.com/cosmos/cosmos-sdk/bsc/rlp"
"github.com/tendermint/tendermint/crypto/secp256k1"
"golang.org/x/crypto/sha3"

"github.com/cosmos/cosmos-sdk/bsc/rlp"
)

type Header struct {
Expand Down Expand Up @@ -162,12 +161,12 @@ func (h *Header) GetSignature() ([]byte, error) {
return signature, nil
}

func (h *Header) ExtractSignerFromHeader() (signer Address, err error) {
func (h *Header) ExtractSignerFromHeader(chainID *big.Int) (signer Address, err error) {
signature, err := h.GetSignature()
if err != nil {
return
}
pubKey, err := secp256k1.RecoverPubkey(SealHash(h).Bytes(), signature)
pubKey, err := secp256k1.RecoverPubkey(SealHash(h, chainID).Bytes(), signature)
if err != nil {
return
}
Expand All @@ -185,15 +184,21 @@ func Keccak256(data ...[]byte) []byte {
}

// SealHash returns the hash of a block prior to it being sealed.
func SealHash(header *Header) (hash Hash) {
func SealHash(header *Header, chainID *big.Int) (hash Hash) {
hasher := sha3.NewLegacyKeccak256()
encodeSigHeader(hasher, header)
encodeSigHeader(hasher, header, chainID)
hasher.Sum(hash[:0])
return hash
}

func encodeSigHeader(w io.Writer, header *Header) {
err := rlp.Encode(w, []interface{}{
func encodeSigHeader(w io.Writer, header *Header, chainId *big.Int) {
var err error
var content = make([]interface{}, 0, 16)

if chainId != nil {
content = append(content, chainId)
}
content = append(content, []interface{}{
header.ParentHash,
header.UncleHash,
header.Coinbase,
Expand All @@ -209,7 +214,9 @@ func encodeSigHeader(w io.Writer, header *Header) {
header.Extra[:len(header.Extra)-65], // this will panic if extra is too short, should check before calling encodeSigHeader
header.MixDigest,
header.Nonce,
})
}...)
err = rlp.Encode(w, content)

if err != nil {
panic("can't encode: " + err.Error())
}
Expand Down
44 changes: 22 additions & 22 deletions bsc/header_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,40 @@ package bsc

import (
"encoding/hex"
"math/big"
"testing"

"github.com/stretchr/testify/require"
)

func TestHeader_UnmarshalJSON(t *testing.T) {
chainID := big.NewInt(56)
h := &Header{}
jsonStr := `{"difficulty":"0x2",
"extraData":"0xd98301090a846765746889676f312e31322e3137856c696e75780000000000005b28385ac3a02a84c391c5d90b3aa0a62365136d80892c5e6158797b394f436c70c697f8d44d6dcfa49d4871897d2ff132356496f066d0adf28ddb3b7099ff5d00",
"gasLimit":"0x2625a00",
"gasUsed":"0xd752e8",
"hash":"0x14c62182b7138b45c400afccbebda3c68a78ca7a6100d3e1fe9e1e8e71ef2b66",
"logsBloom":"0x984e3983604a6120412617213b05004281984c60680c0cd0070200181d240016810500880001002b00055a0470461c09201145010c4e0729408998810a8800400a280247010848590804014800800454317020c88041a40248321010229290e68000011a808068002a56e2c41087114422a9841921a24ea709000430069010315e2c120124080610200cc18c137a0021206170070de90887502148600090002a50440040800905028a640401210c004089c20c4000e44054100cd00907642b4040900a920126454158b64181002d10014e80820508201c0480492880008c84102b0614804474840400413818940819042084c0042a002040498000c201309400",
"miner":"0xfffffffffffffffffffffffffffffffffffffffe",
"mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"nonce":"0x0000000000000000",
"number":"0x1b4",
"parentHash":"0xbfbb0f930378e623c27c1b6888694abd63926581697cf70a268a7455497e1011",
"receiptsRoot":"0x32a9e85c5b51c5b99ce76dac6d1a75dd603bd7406b36d62cf8e74475c2be7462",
"sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size":"0xd73c",
"stateRoot":"0xa20ff6190c7d8a7993a50a3d60bdeca460c19128ba363413f5bff57670ddccb1",
"timestamp":"0x5e79a878",
"totalDifficulty":"0x365",
"transactionsRoot":"0x8f192c648a6d9035adbf72a55cab5652e3c0d7549c378be45bd3d5248d4b3ac5"
}`
jsonStr := `{"parentHash":"0xa9c482b74a276389681eabff076b19bef53cae9b5e44f02224e70e3bfc4e9142",
"sha3Uncles":"0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"miner":"0x72b61c6014342d914470ec7ac2975be345796c2b",
"stateRoot":"0xacd5bca0bc33ed07cb35a635fa674e4ce06211ba201500564dd14dcdaf53e5a9",
"transactionsRoot":"0xcb374b870584bd587dec2e82af38924a5c0d5765913568434c50448856f97a2c",
"receiptsRoot":"0x6f2dc6ade8cf9422d62abd8e8386f20576a6b1f31cc00aa83dba140d183cff16",
"logsBloom":"0xfcfef2ce9d78d29fcbfefbff9dfdf3afb23eff54be7efe7ffdb47abcffdff35fff7bf5de80e257fc836eb97fab43eef33dc7b7ffdfb7fcebfb3df6efff7fecfef473d6fe31dcbcebf7ffeff957b6fbbc6d1efb7ebfddbd3bddfeffded78df79ef3ff9ffd4fd67fcfdfdfff3fecdeddefddadf6ef802b5feaf6f4debffbd7ff9b1fcffff73ceb76fddcfd5f73ffff61bed4be7fb59fe77baebb746f4bcefbdebb76df77fdfb8b73bd2ffcf763b33ff7a6cfeefd7e36f6ed275ffa7fff7fbb996ff33bfbdfe76f23bfecf1ffcfceff3fefbd57b5f5dbfd7fde75cffff77ffffa7feefdf7ddef66f7db77fffd47efa6e5bf55f7fef3ebfbbdf3b1fe77f93ffacedf",
"difficulty":"0x2",
"number":"0x161d4e8",
"gasLimit":"0x7355c0c",
"gasUsed":"0x2134d60",
"timestamp":"0x6378bdd7",
"extraData":"0xd883010111846765746888676f312e31392e32856c696e757800000040fc9c67c61ee4a053e5ec524393cb2608e7a1b0de9a91f880095cd7bfc009b8e0ab5de96c2085a484239f38ca437bc805d2df9b88ea2a9a2a1ce9f5ab6005ae3464b17601",
"mixHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"nonce":"0x0000000000000000",
"baseFeePerGas":null,
"hash":"0x8b6eeece6cedbb23038e7e5c2ce647fbdffa04972247d60a7564e81897e8bc30"}`
err := h.UnmarshalJSON([]byte(jsonStr))
require.NoError(t, err)

signature, err := h.GetSignature()
require.NoError(t, err)
require.Equal(t, "5b28385ac3a02a84c391c5d90b3aa0a62365136d80892c5e6158797b394f436c70c697f8d44d6dcfa49d4871897d2ff132356496f066d0adf28ddb3b7099ff5d00", hex.EncodeToString(signature))
require.Equal(t, "c61ee4a053e5ec524393cb2608e7a1b0de9a91f880095cd7bfc009b8e0ab5de96c2085a484239f38ca437bc805d2df9b88ea2a9a2a1ce9f5ab6005ae3464b17601", hex.EncodeToString(signature))

signer, err := h.ExtractSignerFromHeader()
signer, err := h.ExtractSignerFromHeader(chainID)
require.NoError(t, err)
require.Equal(t, "0xB12fA6F899a16C156B67dBcb124d3733E72A164E", signer.String())
require.Equal(t, "0x72b61c6014342d914470eC7aC2975bE345796c2b", signer.String())
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ require (
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/zondax/hid v0.9.0 // indirect
golang.org/x/net v0.0.0-20191021144547-ec77196f6094 // indirect
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect
golang.org/x/sys v0.2.0 // indirect
golang.org/x/text v0.3.2 // indirect
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb // indirect
google.golang.org/grpc v1.23.0 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -273,6 +273,8 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4=
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
Expand Down
1 change: 1 addition & 0 deletions types/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ const (
BEP128 = "BEP128" //https://github.com/bnb-chain/BEPs/pull/128
BEP153 = "BEP153" //https://github.com/bnb-chain/BEPs/pull/153
BEP173 = "BEP173" //https://github.com/bnb-chain/BEPs/pull/173
FixDoubleSignChainId = "FixDoubleSignChainId"
)

var MainNetConfig = UpgradeConfig{
Expand Down
23 changes: 23 additions & 0 deletions x/slashing/handler.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,32 @@
package slashing

import (
"fmt"
"math/big"
"strings"

sdk "github.com/cosmos/cosmos-sdk/types"
)

var (
SideChainIdBsc = big.NewInt(56)
SideChainIdChapel = big.NewInt(97)
SideChainIdRialto = big.NewInt(714)
)

func SideChainIdFromText(str string) (*big.Int, error) {
switch strings.ToLower(str) {
case "bsc":
return SideChainIdBsc, nil
case "chapel":
return SideChainIdChapel, nil
case "rialto":
return SideChainIdRialto, nil
default:
return nil, fmt.Errorf("Provided sidechain name is not supported.")
}
}

func NewHandler(k Keeper) sdk.Handler {
return func(ctx sdk.Context, msg sdk.Msg) sdk.Result {
// NOTE msg already has validate basic run
Expand Down
22 changes: 19 additions & 3 deletions x/slashing/handler_sidechain.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"fmt"
"time"

"github.com/cosmos/cosmos-sdk/bsc"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/fees"
)
Expand All @@ -16,13 +17,28 @@ func handleMsgBscSubmitEvidence(ctx sdk.Context, msg MsgBscSubmitEvidence, k Kee
return ErrInvalidSideChainId(DefaultCodespace).Result()
}

chainID, err := SideChainIdFromText(sideChainId)
if err != nil {
return ErrInvalidEvidence(DefaultCodespace, err.Error()).Result()
}

header := ctx.BlockHeader()
sideConsAddr, err := msg.Headers[0].ExtractSignerFromHeader()

var sideConsAddr bsc.Address
var sideConsAddr2 bsc.Address
var err2 error

if sdk.IsUpgrade(sdk.FixDoubleSignChainId) {
sideConsAddr, err = msg.Headers[0].ExtractSignerFromHeader(chainID)
sideConsAddr2, err2 = msg.Headers[1].ExtractSignerFromHeader(chainID)
} else {
sideConsAddr, err = msg.Headers[0].ExtractSignerFromHeader(nil)
sideConsAddr2, err2 = msg.Headers[1].ExtractSignerFromHeader(nil)
}
if err != nil {
return ErrInvalidEvidence(DefaultCodespace, fmt.Sprintf("Failed to extract signer from block header, %s", err.Error())).Result()
}
sideConsAddr2, err := msg.Headers[1].ExtractSignerFromHeader()
if err != nil {
if err2 != nil {
return ErrInvalidEvidence(DefaultCodespace, fmt.Sprintf("Failed to extract signer from block header, %s", err.Error())).Result()
}
if bytes.Compare(sideConsAddr.Bytes(), sideConsAddr2.Bytes()) != 0 {
Expand Down
Loading

0 comments on commit f2247f4

Please sign in to comment.