Skip to content

Commit a37a10c

Browse files
author
HuangYi
committed
Problem: evm transfer is not efficient
Solution: - override the Transfer callback in block context. Update CHANGELOG.md Signed-off-by: yihuang <[email protected]> test reverted sdk update deps align input checks
1 parent be00d15 commit a37a10c

File tree

9 files changed

+56
-12
lines changed

9 files changed

+56
-12
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,12 @@ Ref: https://keepachangelog.com/en/1.0.0/
4343
- (feemarket) [#433](https://github.com/crypto-org-chain/ethermint/pull/433) Fix sdk int conversion panic with baseFee.
4444
* (rpc) [#434](https://github.com/crypto-org-chain/ethermint/pull/434) No need gasPrice when patch gasUsed for `eth_getTransactionReceipt`.
4545
* (rpc) [#439](https://github.com/crypto-org-chain/ethermint/pull/439), [#441](https://github.com/crypto-org-chain/ethermint/pull/441) Align trace response for failed tx with go-ethereum.
46+
47+
### Improvements
48+
4649
* (statedb) [#446](https://github.com/crypto-org-chain/ethermint/pull/446) Re-use the cache store implementation with sdk.
4750
* (evm) [#447](https://github.com/crypto-org-chain/ethermint/pull/447) Deduct fee through virtual bank transfer.
51+
* (evm) [#448](https://github.com/crypto-org-chain/ethermint/pull/448) Refactor the evm transfer to be more efficient.
4852

4953
### State Machine Breaking
5054

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,12 @@ require (
242242

243243
replace (
244244
// release/v0.50.x
245-
cosmossdk.io/store => github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240402015425-ec314e8e2d07
245+
cosmossdk.io/store => github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240402064432-829c54275894
246246
// use cosmos keyring
247247
github.com/99designs/keyring => github.com/cosmos/keyring v1.2.0
248248
github.com/cockroachdb/pebble => github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811
249249
// release/v0.50.x
250-
github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240402015425-ec314e8e2d07
250+
github.com/cosmos/cosmos-sdk => github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240402064432-829c54275894
251251
github.com/ethereum/go-ethereum => github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e
252252
// Fix upstream GHSA-h395-qcrw-5vmq vulnerability.
253253
// TODO Remove it: https://github.com/cosmos/cosmos-sdk/issues/10409

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,10 +413,10 @@ github.com/creachadair/tomledit v0.0.24 h1:5Xjr25R2esu1rKCbQEmjZYlrhFkDspoAbAKb6
413413
github.com/creachadair/tomledit v0.0.24/go.mod h1:9qHbShRWQzSCcn617cMzg4eab1vbLCOjOshAWSzWr8U=
414414
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
415415
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
416-
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240402015425-ec314e8e2d07 h1:XVb9zfI9joZzroBIBiiopd1Un4hWf0Wq2/iLfWTpSY8=
417-
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240402015425-ec314e8e2d07/go.mod h1:nRk8EA8/fEG4zSme2i/Rq5z3k7TrlsHkOYhrY79hhD8=
418-
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240402015425-ec314e8e2d07 h1:LlaT9o3Fly1MGX4MRGa/UcwAQzl7tewjryyJ2xTV9jg=
419-
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240402015425-ec314e8e2d07/go.mod h1:lfuLI1f4o+0SGtlHQS4x5qsjRcZZfYqG8bp3k8hM0M8=
416+
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240402064432-829c54275894 h1:kzSBRO3fTg3Rys51eB0kxspOCECJheUrbDSPTn48lTI=
417+
github.com/crypto-org-chain/cosmos-sdk v0.46.0-beta2.0.20240402064432-829c54275894/go.mod h1:nRk8EA8/fEG4zSme2i/Rq5z3k7TrlsHkOYhrY79hhD8=
418+
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240402064432-829c54275894 h1:bMirI/jNhEVw5xJrg1+qnc74bR/J9EuJSxfdgGkjhuQ=
419+
github.com/crypto-org-chain/cosmos-sdk/store v0.0.0-20240402064432-829c54275894/go.mod h1:lfuLI1f4o+0SGtlHQS4x5qsjRcZZfYqG8bp3k8hM0M8=
420420
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e h1:vnyepPQ/m25+19xcTuBUdRxmltZ/EjVWNqEjhg7Ummk=
421421
github.com/crypto-org-chain/go-ethereum v1.10.20-0.20231207063621-43cf32d91c3e/go.mod h1:+a8pUj1tOyJ2RinsNQD4326YS+leSoKGiG/uVVb0x6Y=
422422
github.com/danieljoos/wincred v1.2.0 h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=

gomod2nix.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ schema = 3
4141
version = "v1.3.0"
4242
hash = "sha256-EEFK43Cr0g0ndhQhkIKher0FqV3mvkmE9z0sP7uVSHg="
4343
[mod."cosmossdk.io/store"]
44-
version = "v0.0.0-20240402015425-ec314e8e2d07"
44+
version = "v0.0.0-20240402064432-829c54275894"
4545
hash = "sha256-0yj6ToF5tiOsJ7B3sBS9lLLEDVrKJxi1tNlqRcWauDw="
4646
replaced = "github.com/crypto-org-chain/cosmos-sdk/store"
4747
[mod."cosmossdk.io/tools/confix"]
@@ -161,8 +161,8 @@ schema = 3
161161
version = "v1.0.0-beta.4"
162162
hash = "sha256-5Kn82nsZfiEtuwhhLZqmMxdAY1tX/Fi3HJ0/MEaRohw="
163163
[mod."github.com/cosmos/cosmos-sdk"]
164-
version = "v0.46.0-beta2.0.20240402015425-ec314e8e2d07"
165-
hash = "sha256-kp8xXSle0X8PW4uIHXmfkGHjj3y6KTpcbvW+oJHsLzI="
164+
version = "v0.46.0-beta2.0.20240402064432-829c54275894"
165+
hash = "sha256-6Kq/hlyQ4D3v6odGK40wliSfzlvz1J7CbbGs+Uma1js="
166166
replaced = "github.com/crypto-org-chain/cosmos-sdk"
167167
[mod."github.com/cosmos/go-bip39"]
168168
version = "v1.0.0"

x/evm/keeper/state_transition.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func (k *Keeper) NewEVM(
5555
zero := common.BigToHash(big.NewInt(0))
5656
blockCtx := vm.BlockContext{
5757
CanTransfer: core.CanTransfer,
58-
Transfer: core.Transfer,
58+
Transfer: statedb.Transfer,
5959
GetHash: k.GetHashFn(ctx),
6060
Coinbase: cfg.CoinBase,
6161
GasLimit: ethermint.BlockGasLimit(ctx),

x/evm/keeper/statedb.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ func (k *Keeper) ForEachStorage(ctx sdk.Context, addr common.Address, cb func(ke
7272
}
7373
}
7474

75+
func (k *Keeper) Transfer(ctx sdk.Context, sender, recipient sdk.AccAddress, coins sdk.Coins) error {
76+
return k.bankKeeper.SendCoins(ctx, sender, recipient, coins)
77+
}
78+
7579
func (k *Keeper) AddBalance(ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) error {
7680
if err := k.bankKeeper.MintCoins(ctx, types.ModuleName, coins); err != nil {
7781
return err

x/evm/statedb/interfaces.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
type Keeper interface {
2828
GetParams(sdk.Context) evmtypes.Params
2929

30+
Transfer(ctx sdk.Context, sender, recipient sdk.AccAddress, coins sdk.Coins) error
3031
AddBalance(ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) error
3132
SubBalance(ctx sdk.Context, addr sdk.AccAddress, coins sdk.Coins) error
3233
SetBalance(ctx sdk.Context, addr common.Address, amount *big.Int, denom string) error

x/evm/statedb/statedb.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ type revision struct {
4343
journalIndex int
4444
}
4545

46+
func Transfer(db vm.StateDB, sender, recipient common.Address, amount *big.Int) {
47+
db.(*StateDB).Transfer(sender, recipient, amount)
48+
}
49+
4650
var _ vm.StateDB = &StateDB{}
4751

4852
// StateDB structs within the ethereum protocol are used to store anything
@@ -382,11 +386,33 @@ func (s *StateDB) Context() sdk.Context {
382386
* SETTERS
383387
*/
384388

389+
// Transfer from one account to another
390+
func (s *StateDB) Transfer(sender, recipient common.Address, amount *big.Int) {
391+
if amount.Sign() == 0 {
392+
return
393+
}
394+
if amount.Sign() < 0 {
395+
panic("negative amount")
396+
}
397+
398+
coins := sdk.NewCoins(sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigIntMut(amount)))
399+
senderAddr := sdk.AccAddress(sender.Bytes())
400+
recipientAddr := sdk.AccAddress(recipient.Bytes())
401+
if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error {
402+
return s.keeper.Transfer(ctx, senderAddr, recipientAddr, coins)
403+
}); err != nil {
404+
s.err = err
405+
}
406+
}
407+
385408
// AddBalance adds amount to the account associated with addr.
386409
func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) {
387-
if amount.Sign() <= 0 {
410+
if amount.Sign() == 0 {
388411
return
389412
}
413+
if amount.Sign() < 0 {
414+
panic("negative amount")
415+
}
390416
coins := sdk.Coins{sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigInt(amount))}
391417
if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error {
392418
return s.keeper.AddBalance(ctx, sdk.AccAddress(addr.Bytes()), coins)
@@ -397,9 +423,12 @@ func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) {
397423

398424
// SubBalance subtracts amount from the account associated with addr.
399425
func (s *StateDB) SubBalance(addr common.Address, amount *big.Int) {
400-
if amount.Sign() <= 0 {
426+
if amount.Sign() == 0 {
401427
return
402428
}
429+
if amount.Sign() < 0 {
430+
panic("negative amount")
431+
}
403432
coins := sdk.Coins{sdk.NewCoin(s.evmDenom, sdkmath.NewIntFromBigInt(amount))}
404433
if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error {
405434
return s.keeper.SubBalance(ctx, sdk.AccAddress(addr.Bytes()), coins)
@@ -408,6 +437,7 @@ func (s *StateDB) SubBalance(addr common.Address, amount *big.Int) {
408437
}
409438
}
410439

440+
// SetBalance is called by state override
411441
func (s *StateDB) SetBalance(addr common.Address, amount *big.Int) {
412442
if err := s.ExecuteNativeAction(common.Address{}, nil, func(ctx sdk.Context) error {
413443
return s.keeper.SetBalance(ctx, addr, amount, s.evmDenom)

x/evm/statedb/statedb_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,11 @@ func (suite *StateDBTestSuite) TestBalance() {
193193
{"sub zero balance", func(db *statedb.StateDB) {
194194
db.SubBalance(address, big.NewInt(0))
195195
}, big.NewInt(0)},
196+
{"transfer", func(db *statedb.StateDB) {
197+
db.AddBalance(address, big.NewInt(10))
198+
db.Transfer(address, address2, big.NewInt(10))
199+
suite.Require().Equal(big.NewInt(10), db.GetBalance(address2))
200+
}, big.NewInt(0)},
196201
}
197202

198203
for _, tc := range testCases {

0 commit comments

Comments
 (0)