github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/types/msg_test.go (about) 1 package types 2 3 import ( 4 "bytes" 5 "fmt" 6 "math/big" 7 "math/rand" 8 "strings" 9 "testing" 10 11 ibcfee "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/29-fee" 12 tmtypes "github.com/fibonacci-chain/fbc/libs/tendermint/types" 13 14 "encoding/hex" 15 16 "github.com/ethereum/go-ethereum/common/hexutil" 17 "github.com/ethereum/go-ethereum/common/math" 18 fbexchaincodec "github.com/fibonacci-chain/fbc/app/codec" 19 20 "github.com/stretchr/testify/require" 21 22 "github.com/fibonacci-chain/fbc/app/crypto/ethsecp256k1" 23 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/codec" 24 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 25 26 ethcmn "github.com/ethereum/go-ethereum/common" 27 ethtypes "github.com/ethereum/go-ethereum/core/types" 28 "github.com/ethereum/go-ethereum/rlp" 29 30 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types/module" 31 ibctxdecode "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/ibc-tx" 32 authtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types" 33 ibctransfer "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/apps/transfer" 34 ibc "github.com/fibonacci-chain/fbc/libs/ibc-go/modules/core" 35 "github.com/fibonacci-chain/fbc/libs/tendermint/crypto/secp256k1" 36 ) 37 38 func newSdkAddress() sdk.AccAddress { 39 tmpKey := secp256k1.GenPrivKey().PubKey() 40 return sdk.AccAddress(tmpKey.Address().Bytes()) 41 } 42 43 func TestMsgEthereumTx(t *testing.T) { 44 addr := GenerateEthAddress() 45 46 msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test")) 47 require.NotNil(t, msg) 48 require.Equal(t, *msg.Data.Recipient, addr) 49 require.Equal(t, msg.Route(), RouterKey) 50 require.Equal(t, msg.Type(), TypeMsgEthereumTx) 51 require.NotNil(t, msg.To()) 52 require.Equal(t, msg.GetMsgs(), []sdk.Msg{msg}) 53 require.Panics(t, func() { msg.GetSigners() }) 54 require.Panics(t, func() { msg.GetSignBytes() }) 55 require.Equal(t, msg.GetNonce(), uint64(0)) 56 57 msg = NewMsgEthereumTxContract(0, nil, 100000, nil, []byte("test")) 58 require.NotNil(t, msg) 59 require.Nil(t, msg.Data.Recipient) 60 require.Nil(t, msg.To()) 61 62 } 63 64 func TestTxFnSignatureInfo(t *testing.T) { 65 type expected struct { 66 sig []byte 67 i int 68 } 69 testCases := []struct { 70 msg string 71 fn func() *MsgEthereumTx 72 expected expected 73 }{ 74 { 75 "receipt not nil should equal", 76 func() *MsgEthereumTx { 77 addr := ethcmn.BytesToAddress([]byte("test_address")) 78 msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test")) 79 return msg 80 }, 81 expected{ 82 []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x74, 0x65, 0x73, 0x74}, 83 0, 84 }, 85 }, 86 { 87 "payload below 4 bytes should DefaultSendCoinFnSignature", 88 func() *MsgEthereumTx { 89 addr := ethcmn.BytesToAddress([]byte("test_address")) 90 msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("t")) 91 return msg 92 }, 93 expected{ 94 DefaultSendCoinFnSignature, 95 0, 96 }, 97 }, 98 { 99 "receipt nil should be DefaultDeployContractFnSignature", 100 func() *MsgEthereumTx { 101 msg := NewMsgEthereumTx(0, nil, nil, 100000, nil, []byte("t")) 102 return msg 103 }, 104 expected{ 105 DefaultDeployContractFnSignature, 106 1, 107 }, 108 }, 109 } 110 for _, tc := range testCases { 111 msg := tc.fn() 112 r, i := msg.GetTxFnSignatureInfo() 113 require.Equal(t, tc.expected.i, i) 114 require.Equal(t, tc.expected.sig, r) 115 } 116 } 117 118 func TestMsgEthereumTxValidation(t *testing.T) { 119 testCases := []struct { 120 msg string 121 amount *big.Int 122 gasPrice *big.Int 123 expectPass bool 124 }{ 125 {msg: "pass", amount: big.NewInt(100), gasPrice: big.NewInt(100000), expectPass: true}, 126 {msg: "pass amount is zero", amount: big.NewInt(0), gasPrice: big.NewInt(100000), expectPass: true}, 127 {msg: "invalid amount", amount: big.NewInt(-1), gasPrice: big.NewInt(100000), expectPass: false}, 128 {msg: "invalid gas price", amount: big.NewInt(100), gasPrice: big.NewInt(-1), expectPass: false}, 129 {msg: "invalid gas price", amount: big.NewInt(100), gasPrice: big.NewInt(0), expectPass: false}, 130 } 131 132 for i, tc := range testCases { 133 msg := NewMsgEthereumTx(0, nil, tc.amount, 0, tc.gasPrice, nil) 134 135 if tc.expectPass { 136 require.Nil(t, msg.ValidateBasic(), "valid test %d failed: %s", i, tc.msg) 137 } else { 138 require.NotNil(t, msg.ValidateBasic(), "invalid test %d passed: %s", i, tc.msg) 139 } 140 } 141 } 142 143 func TestMsgEthereumTxRLPSignBytes(t *testing.T) { 144 addr := ethcmn.BytesToAddress([]byte("test_address")) 145 chainID := big.NewInt(3) 146 147 msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test")) 148 hash := msg.RLPSignBytes(chainID) 149 require.Equal(t, "5BD30E35AD27449390B14C91E6BCFDCAADF8FE44EF33680E3BC200FC0DC083C7", fmt.Sprintf("%X", hash)) 150 } 151 152 func TestMsgEthereumTxRLPEncode(t *testing.T) { 153 addr := ethcmn.BytesToAddress([]byte("test_address")) 154 msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test")) 155 156 raw, err := rlp.EncodeToBytes(&msg) 157 require.NoError(t, err) 158 require.Equal(t, ethcmn.FromHex("E48080830186A0940000000000000000746573745F61646472657373808474657374808080"), raw) 159 } 160 161 func TestMsgEthereumTxRLPDecode(t *testing.T) { 162 var msg MsgEthereumTx 163 164 raw := ethcmn.FromHex("E48080830186A0940000000000000000746573745F61646472657373808474657374808080") 165 addr := ethcmn.BytesToAddress([]byte("test_address")) 166 expectedMsg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test")) 167 168 err := rlp.Decode(bytes.NewReader(raw), &msg) 169 require.NoError(t, err) 170 require.Equal(t, expectedMsg.Data, msg.Data) 171 172 // value size exceeds available input length of stream 173 mockStream := rlp.NewStream(bytes.NewReader(raw), 1) 174 require.Error(t, msg.DecodeRLP(mockStream)) 175 } 176 177 func TestMsgEthereumTxHomestead(t *testing.T) { 178 zeroChainID := big.NewInt(0) 179 180 priv1, _ := ethsecp256k1.GenerateKey() 181 addr1 := ethcmn.BytesToAddress(priv1.PubKey().Address().Bytes()) 182 183 // require valid signature passes validation 184 msg := NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test")) 185 186 // zero chainID 187 err := msg.Sign(zeroChainID, priv1.ToECDSA()) 188 require.Nil(t, err) 189 err = msg.VerifySig(zeroChainID, 0) 190 require.Nil(t, err) 191 } 192 193 func TestMsgEthereumTxSig(t *testing.T) { 194 chainID, zeroChainID := big.NewInt(3), big.NewInt(0) 195 196 priv1, _ := ethsecp256k1.GenerateKey() 197 priv2, _ := ethsecp256k1.GenerateKey() 198 addr1 := ethcmn.BytesToAddress(priv1.PubKey().Address().Bytes()) 199 trimed := strings.TrimPrefix(addr1.Hex(), "0x") 200 201 fmt.Printf("%s\n", trimed) 202 addrSDKAddr1, err := sdk.AccAddressFromHex(trimed) 203 require.NoError(t, err) 204 addr2 := ethcmn.BytesToAddress(priv2.PubKey().Address().Bytes()) 205 206 // require valid signature passes validation 207 msg := NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test")) 208 err = msg.Sign(chainID, priv1.ToECDSA()) 209 require.Nil(t, err) 210 211 err = msg.VerifySig(chainID, 0) 212 require.NoError(t, err) 213 require.Equal(t, addr1, msg.EthereumAddress()) 214 require.NotEqual(t, addr2, msg.EthereumAddress()) 215 216 signers := msg.GetSigners() 217 require.Equal(t, 1, len(signers)) 218 require.True(t, addrSDKAddr1.Equals(signers[0])) 219 220 // zero chainID 221 err = msg.Sign(zeroChainID, priv1.ToECDSA()) 222 require.Nil(t, err) 223 err = msg.VerifySig(zeroChainID, 0) 224 require.Nil(t, err) 225 226 // require invalid chain ID fail validation 227 msg = NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test")) 228 err = msg.Sign(chainID, priv1.ToECDSA()) 229 require.Nil(t, err) 230 } 231 232 func TestMsgEthereumTx_ChainID(t *testing.T) { 233 chainID := big.NewInt(3) 234 priv, _ := ethsecp256k1.GenerateKey() 235 addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes()) 236 msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test")) 237 err := msg.Sign(chainID, priv.ToECDSA()) 238 require.Nil(t, err) 239 240 require.True(t, chainID.Cmp(msg.ChainID()) == 0) 241 242 msg.Data.V = big.NewInt(27) 243 require.NotNil(t, msg.ChainID()) 244 245 msg.Data.V = math.MaxBig256 246 expectedChainID := new(big.Int).Div(new(big.Int).Sub(math.MaxBig256, big.NewInt(35)), big.NewInt(2)) 247 require.True(t, expectedChainID.Cmp(msg.ChainID()) == 0) 248 } 249 250 func TestGetTxFnSignatureInfo(t *testing.T) { 251 chainID := big.NewInt(3) 252 priv, _ := ethsecp256k1.GenerateKey() 253 addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes()) 254 msg := NewMsgEthereumTx(0, &addr, nil, 100000, nil, []byte("test")) 255 err := msg.Sign(chainID, priv.ToECDSA()) 256 require.Nil(t, err) 257 } 258 259 func TestMsgEthereumTxGetter(t *testing.T) { 260 priv, _ := ethsecp256k1.GenerateKey() 261 addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes()) 262 amount, gasPrice, gasLimit := int64(1024), int64(2048), uint64(100000) 263 expectedFee := gasPrice * int64(gasLimit) 264 expectCost := expectedFee + amount 265 msg := NewMsgEthereumTx(0, &addr, big.NewInt(amount), gasLimit, big.NewInt(gasPrice), []byte("test")) 266 267 require.Equal(t, gasLimit, msg.GetGas()) 268 require.True(t, big.NewInt(expectedFee).Cmp(msg.Fee()) == 0) 269 require.True(t, big.NewInt(expectCost).Cmp(msg.Cost()) == 0) 270 271 expectedV, expectedR, expectedS := big.NewInt(1), big.NewInt(2), big.NewInt(3) 272 msg.Data.V, msg.Data.R, msg.Data.S = expectedV, expectedR, expectedS 273 v, r, s := msg.RawSignatureValues() 274 require.True(t, expectedV.Cmp(v) == 0) 275 require.True(t, expectedR.Cmp(r) == 0) 276 require.True(t, expectedS.Cmp(s) == 0) 277 } 278 279 func TestMsgEthereumTx_Amino(t *testing.T) { 280 priv, _ := ethsecp256k1.GenerateKey() 281 addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes()) 282 amount, gasPrice, gasLimit := int64(1024), int64(2048), uint64(100000) 283 msg := NewMsgEthereumTx(0, &addr, big.NewInt(amount), gasLimit, big.NewInt(gasPrice), []byte("test")) 284 err := msg.Sign(big.NewInt(3), priv.ToECDSA()) 285 require.NoError(t, err) 286 hash := ethcmn.BigToHash(big.NewInt(2)) 287 288 testCases := []*MsgEthereumTx{ 289 msg, 290 { 291 Data: TxData{ 292 AccountNonce: 2, 293 Price: big.NewInt(3), 294 GasLimit: 1, 295 Recipient: &addr, 296 Amount: big.NewInt(4), 297 Payload: []byte("test"), 298 V: big.NewInt(5), 299 R: big.NewInt(6), 300 S: big.NewInt(7), 301 Hash: &hash, 302 }, 303 }, 304 { 305 Data: TxData{ 306 Price: big.NewInt(math.MinInt64), 307 Recipient: ðcmn.Address{}, 308 Amount: big.NewInt(math.MinInt64), 309 Payload: []byte{}, 310 V: big.NewInt(math.MinInt64), 311 R: big.NewInt(math.MinInt64), 312 S: big.NewInt(math.MinInt64), 313 Hash: ðcmn.Hash{}, 314 }, 315 }, 316 { 317 Data: TxData{ 318 AccountNonce: math.MaxUint64, 319 Price: big.NewInt(math.MaxInt64), 320 GasLimit: math.MaxUint64, 321 Amount: big.NewInt(math.MaxInt64), 322 V: big.NewInt(math.MaxInt64), 323 R: big.NewInt(math.MaxInt64), 324 S: big.NewInt(math.MaxInt64), 325 }, 326 }, 327 } 328 329 for _, msg := range testCases { 330 raw, err := ModuleCdc.MarshalBinaryBare(msg) 331 require.NoError(t, err) 332 333 var msg2 MsgEthereumTx 334 err = ModuleCdc.UnmarshalBinaryBare(raw, &msg2) 335 require.NoError(t, err) 336 337 var msg3 MsgEthereumTx 338 v, err := ModuleCdc.UnmarshalBinaryBareWithRegisteredUnmarshaller(raw, &msg3) 339 require.NoError(t, err) 340 msg3 = *v.(*MsgEthereumTx) 341 require.EqualValues(t, msg2, msg3) 342 } 343 } 344 345 func BenchmarkMsgEthereumTxUnmarshal(b *testing.B) { 346 cdc := ModuleCdc 347 priv, _ := ethsecp256k1.GenerateKey() 348 addr := ethcmn.BytesToAddress(priv.PubKey().Address().Bytes()) 349 amount, gasPrice, gasLimit := int64(1024), int64(2048), uint64(100000) 350 msg := NewMsgEthereumTx(123456, &addr, big.NewInt(amount), gasLimit, big.NewInt(gasPrice), []byte("test")) 351 _ = msg.Sign(big.NewInt(66), priv.ToECDSA()) 352 353 raw, _ := cdc.MarshalBinaryBare(msg) 354 rlpRaw, err := rlp.EncodeToBytes(&msg) 355 require.NoError(b, err) 356 b.ResetTimer() 357 358 b.Run("amino", func(b *testing.B) { 359 b.ReportAllocs() 360 for i := 0; i < b.N; i++ { 361 var msg2 MsgEthereumTx 362 err := cdc.UnmarshalBinaryBare(raw, &msg2) 363 if err != nil { 364 b.Fatal(err) 365 } 366 } 367 }) 368 369 b.Run("unmarshaler", func(b *testing.B) { 370 b.ReportAllocs() 371 for i := 0; i < b.N; i++ { 372 var msg3 MsgEthereumTx 373 v, err := cdc.UnmarshalBinaryBareWithRegisteredUnmarshaller(raw, &msg3) 374 if err != nil { 375 b.Fatal(err) 376 } 377 msg3 = v.(MsgEthereumTx) 378 } 379 }) 380 381 b.Run("rlp", func(b *testing.B) { 382 b.ReportAllocs() 383 for i := 0; i < b.N; i++ { 384 var msg MsgEthereumTx 385 err = rlp.DecodeBytes(rlpRaw, &msg) 386 if err != nil { 387 b.Fatal(err) 388 } 389 } 390 }) 391 } 392 393 func TestMarshalAndUnmarshalLogs(t *testing.T) { 394 var cdc = codec.New() 395 396 logs := []*ethtypes.Log{ 397 { 398 Address: ethcmn.BytesToAddress([]byte{0x11}), 399 TxHash: ethcmn.HexToHash("0x01"), 400 // May need to find workaround since Topics is required to unmarshal from JSON 401 Topics: []ethcmn.Hash{}, 402 Removed: true, 403 }, 404 {Address: ethcmn.BytesToAddress([]byte{0x01, 0x11}), Topics: []ethcmn.Hash{}}, 405 } 406 407 raw, err := codec.MarshalJSONIndent(cdc, logs) 408 require.NoError(t, err) 409 410 var logs2 []*ethtypes.Log 411 err = cdc.UnmarshalJSON(raw, &logs2) 412 require.NoError(t, err) 413 414 require.Len(t, logs2, 2) 415 require.Equal(t, logs[0].Address, logs2[0].Address) 416 require.Equal(t, logs[0].TxHash, logs2[0].TxHash) 417 require.True(t, logs[0].Removed) 418 419 emptyLogs := []*ethtypes.Log{} 420 421 raw, err = codec.MarshalJSONIndent(cdc, emptyLogs) 422 require.NoError(t, err) 423 424 err = cdc.UnmarshalJSON(raw, &logs2) 425 require.NoError(t, err) 426 } 427 428 func TestMsgString(t *testing.T) { 429 expectedUint64, expectedSDKAddr := uint64(1024), newSdkAddress() 430 expectedPayload, err := hexutil.Decode("0x1234567890abcdef") 431 require.NoError(t, err) 432 expectedOutput := fmt.Sprintf("nonce=1024 gasPrice=1 gasLimit=1024 recipient=%s amount=1 data=0x1234567890abcdef from=%s", 433 expectedSDKAddr, expectedSDKAddr) 434 435 expectedHexAddr := ethcmn.BytesToAddress([]byte{0x01}) 436 expectedBigInt := big.NewInt(1024) 437 expectedOutput = fmt.Sprintf("nonce=1024 price=1024 gasLimit=1024 recipient=%s amount=1024 data=0x1234567890abcdef v=0 r=0 s=0", expectedHexAddr.Hex()) 438 msgEthereumTx := NewMsgEthereumTx(expectedUint64, &expectedHexAddr, expectedBigInt, expectedUint64, expectedBigInt, expectedPayload) 439 require.True(t, strings.EqualFold(msgEthereumTx.String(), expectedOutput)) 440 } 441 442 func newProxyDecoder() *codec.CodecProxy { 443 ModuleBasics := module.NewBasicManager( 444 ibc.AppModuleBasic{}, 445 ibctransfer.AppModuleBasic{}, 446 ibcfee.AppModuleBasic{}, 447 ) 448 cdc := fbexchaincodec.MakeCodec(ModuleBasics) 449 interfaceReg := fbexchaincodec.MakeIBC(ModuleBasics) 450 protoCodec := codec.NewProtoCodec(interfaceReg) 451 codecProxy := codec.NewCodecProxy(protoCodec, cdc) 452 return codecProxy 453 } 454 455 // TODO error fix 456 func TestMsgIBCTxValidate(t *testing.T) { 457 tmtypes.UnittestOnlySetMilestoneVenus1Height(1) 458 459 IBCRouterKey := "ibc" 460 cpcdc := newProxyDecoder() 461 marshaler := cpcdc.GetProtocMarshal() 462 decode := ibctxdecode.IbcTxDecoder(marshaler) 463 var err error 464 //ex1 encode txBytes1 465 txBytes1, err := hex.DecodeString("0a8d030a8a030a232f6962632e636f72652e636c69656e742e76312e4d7367437265617465436c69656e7412e2020aab010a2b2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436c69656e745374617465127c0a056962632d311204080110031a040880ac4d22040880df6e2a0308d80432003a05080110940342190a090801180120012a0100120c0a02000110211804200c300142190a090801180120012a0100120c0a02000110201801200130014a07757067726164654a1075706772616465644942435374617465500158011286010a2e2f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e436f6e73656e737573537461746512540a0c0892cbde930610a0ff9fe20212220a208acb6977f3cac564f6b015ff1de209e6c167e3454e6a754780e601efe340a5dd1a20cade35b27c5c32afead6cbed10d219c3903b8789b3fee9bf52b893efd6e2b8501a296578316a35657535716775376472686c737277346867326a766a3930707a766132373272347479763812720a4e0a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a210361469c236406f73459385bfe6d265ad8f293166b4661228d7bf6dd2f305236d912040a02080112200a1a0a0377656912133230343034393530303030303030303030303010e1a6081a40c951cde5885ab43d5e6c1ed88ef8adfd28311bfcba5461baa5bf4c9ad849e50837184dfde85ccb793f9859283553d3ef78113e5960aa353e885a9deb983e802a") 466 txBytes2, err := hex.DecodeString("0af8080aeb070a232f6962632e636f72652e636c69656e742e76312e4d7367557064617465436c69656e7412c3070a0f30372d74656e6465726d696e742d301284070a262f6962632e6c69676874636c69656e74732e74656e6465726d696e742e76312e48656164657212d9060ac9040a8c030a02080b12056962632d3118b907220c08d3dcde930610908ce5b3022a480a206241f13d50332dca5df961e0d1b0ab4c9dd36a8f05af2951ee23a0e1b1ff8913122408011220c2ed8f17294c68e683f31c0deaa1b34fe3966244a7ed52db9a716b9f9c200f703220d3f78b59cbb111d27452a4c0c71c614a6fada163ef175f8954f59007bc5d56df3a20f2473fff8995411fcde70619e3fa3a2e0a865e82edaae3c3ec072c8efaf10c014220c2c257672210f3023ae63cc03ac71b4517479b84ebee227719f06edd7b5aa60a4a20c2c257672210f3023ae63cc03ac71b4517479b84ebee227719f06edd7b5aa60a5220048091bc7ddc283f77bfbf91d73c44da58c3df8a9cbc867405d8b7f3daada22f5a208f988bd1fd57bc996fcba5b40814ee75d4dcc883d2f8eaa873b814ccdaa8acb66220e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b8556a20e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85572143ff4a1ab7900d093bddea8d832c34f654207201a12b70108b9071a480a2025909a026179293b314c647573c4ee85b1a820b526e188cc42196e70b7d5622a122408011220ab82b5731b0b954a0fb947b897f522d51557c015632e040682edc607377111672268080212143ff4a1ab7900d093bddea8d832c34f654207201a1a0c08d4dcde93061090d0b8f2022240374206b5b047546cb08abd6994ddf6ec67a736940b286ea11627f20eb4b7668e8bc0ff55f6ab7a29e8fe23a98c672d23cfd926d363204408be729845f72fd1001280010a3e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d06123e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d061a05080110a4072280010a3e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d06123e0a143ff4a1ab7900d093bddea8d832c34f654207201a12220a204d72a5c949a4140d889f39074a3302a07801134bb3a2f751ad7200cbb6da5a2e18a08d061a29657831737061787a64376b37797a716467766b6e7568743671333870673530757530387666716135710a87010a2d2f6962632e636f72652e636f6e6e656374696f6e2e76312e4d7367436f6e6e656374696f6e4f70656e496e697412560a0f30372d74656e6465726d696e742d3012180a0f30372d74656e6465726d696e742d301a050a036962632a29657831737061787a64376b37797a716467766b6e75687436713338706735307575303876667161357112760a500a460a1f2f636f736d6f732e63727970746f2e736563703235366b312e5075624b657912230a210311219a285ff5fd852d664a06279ce4cb60eb266be2cc2e24c33525895baade6612040a020801180112220a1c0a03776569121531363632323130303030303030303030303030303010cd920a1a403c793cbaa9d512f7e154511e1656a1cac1fff878d10b9b0a1d49596168bdad04786b9beb78fa1f58c33d580f1a09a345629211116dab2eda98276eb6edf05feb") 467 txBytesArray := [][]byte{ 468 txBytes1, txBytes2, 469 } 470 expectedMsgType := []string{ 471 "/ibc.core.client.v1.MsgCreateClient", 472 "/ibc.core.client.v1.MsgUpdateClient", 473 } 474 for i, txbytes := range txBytesArray { 475 require.NoError(t, err) 476 ibctx, err := decode(txbytes) 477 require.NoError(t, err) 478 require.NotNil(t, ibctx) 479 require.Equal(t, ibctx.StdTx.Msgs[0].Route(), IBCRouterKey) 480 require.Equal(t, ibctx.StdTx.Msgs[0].Type(), expectedMsgType[i]) 481 //tx validator 482 require.NoError(t, ibctx.StdTx.Msgs[0].ValidateBasic()) 483 } 484 } 485 486 func TestMsgIbcTxMarshalSignBytes(t *testing.T) { 487 chainID := "fbc-101" 488 accnum := 1 489 sequence := 0 490 memo := "memo" 491 authInfoBytes := []byte("authinfobytes") 492 bodyBytes := []byte("bodyBytes") 493 494 fee := authtypes.StdFee{ 495 Amount: []sdk.DecCoin{ 496 sdk.DecCoin{ 497 Denom: "test", 498 Amount: sdk.NewDecFromBigInt(big.NewInt(10)), 499 }, 500 }, 501 Gas: 100000, 502 } 503 504 signBytes := authtypes.IbcDirectSignBytes( 505 chainID, 506 uint64(accnum), 507 uint64(sequence), 508 fee, 509 nil, 510 memo, 511 authInfoBytes, 512 bodyBytes, 513 ) 514 515 expectedHexResult := "0A09626F64794279746573120D61757468696E666F62797465731A076662632D3130312001" 516 517 require.Equal(t, expectedHexResult, fmt.Sprintf("%X", signBytes)) 518 519 } 520 521 func BenchmarkEvmTxVerifySig(b *testing.B) { 522 chainID := big.NewInt(3) 523 priv1, _ := ethsecp256k1.GenerateKey() 524 addr1 := ethcmn.BytesToAddress(priv1.PubKey().Address().Bytes()) 525 526 // require valid signature passes validation 527 msg := NewMsgEthereumTx(0, &addr1, nil, 100000, nil, []byte("test")) 528 _ = msg.Sign(chainID, priv1.ToECDSA()) 529 530 b.ResetTimer() 531 532 b.Run("firstVerifySig", func(b *testing.B) { 533 b.ReportAllocs() 534 for i := 0; i < b.N; i++ { 535 _, err := msg.firstVerifySig(chainID) 536 if err != nil { 537 b.Fatal(err) 538 } 539 } 540 }) 541 } 542 543 func TestRlpPointerEncode(t *testing.T) { 544 bz := make([]byte, 512) 545 rand.Read(bz) 546 547 h1 := rlpHash([]interface{}{bz}) 548 h2 := rlpHash([]interface{}{&bz}) 549 550 require.Equal(t, h1, h2) 551 }