Skip to content

Commit db13a0d

Browse files
committed
Merge branch 'develop'
2 parents 7be903b + ddd65ff commit db13a0d

File tree

196 files changed

+7958
-11694
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

196 files changed

+7958
-11694
lines changed

.github/workflows/full_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ jobs:
2929
- name: Set up Go
3030
uses: actions/setup-go@v3
3131
with:
32-
go-version: 1.19
32+
go-version: '1.19'
3333

3434
- name: Install dependencies
3535
run: |

.github/workflows/manual_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
- name: Set up Go
2121
uses: actions/setup-go@v3
2222
with:
23-
go-version: 1.19
23+
go-version: '1.19'
2424

2525
- name: Install dependencies
2626
run: |

.github/workflows/short_test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
- name: Set up Go
3636
uses: actions/setup-go@v3
3737
with:
38-
go-version: 1.19
38+
go-version: '1.19'
3939

4040
- name: Install dependencies
4141
run: |

account/accountservice.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/aergoio/aergo/v2/contract/name"
1111
"github.com/aergoio/aergo/v2/pkg/component"
1212
"github.com/aergoio/aergo/v2/state"
13+
"github.com/aergoio/aergo/v2/state/statedb"
1314
"github.com/aergoio/aergo/v2/types"
1415
"github.com/aergoio/aergo/v2/types/message"
1516
)
@@ -63,7 +64,7 @@ func (as *AccountService) Statistics() *map[string]interface{} {
6364
}
6465
}
6566
func (as *AccountService) resolveName(namedAddress []byte) ([]byte, error) {
66-
scs, err := as.sdb.GetStateDB().GetNameAccountState()
67+
scs, err := statedb.GetNameAccountState(as.sdb.GetStateDB())
6768
if err != nil {
6869
return nil, err
6970
}

chain/chaindb.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ func (cdb *ChainDB) getReceipts(blockHash []byte, blockNo types.BlockNo,
647647
hardForkConfig *config.HardforkConfig) (*types.Receipts, error) {
648648
data := cdb.store.Get(dbkey.Receipts(blockHash, blockNo))
649649
if len(data) == 0 {
650-
return nil, errors.New("cannot find a receipt")
650+
return nil, fmt.Errorf("empty : blockNo=%d", blockNo)
651651
}
652652
var receipts types.Receipts
653653

chain/chainhandle.go

Lines changed: 86 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"github.com/aergoio/aergo/v2/internal/enc/base58"
2323
"github.com/aergoio/aergo/v2/internal/enc/proto"
2424
"github.com/aergoio/aergo/v2/state"
25+
"github.com/aergoio/aergo/v2/state/statedb"
2526
"github.com/aergoio/aergo/v2/types"
2627
"github.com/aergoio/aergo/v2/types/message"
2728
)
@@ -136,6 +137,72 @@ func (cs *ChainService) getReceipt(txHash []byte) (*types.Receipt, error) {
136137
return r, nil
137138
}
138139

140+
func (cs *ChainService) getReceipts(blockHash []byte) (*types.Receipts, error) {
141+
block, err := cs.cdb.getBlock(blockHash)
142+
if err != nil {
143+
return nil, &ErrNoBlock{blockHash}
144+
}
145+
146+
blockInMainChain, err := cs.cdb.GetBlockByNo(block.Header.BlockNo)
147+
if !bytes.Equal(block.BlockHash(), blockInMainChain.BlockHash()) {
148+
return nil, errors.New("cannot find a receipt")
149+
}
150+
151+
receipts, err := cs.cdb.getReceipts(block.BlockHash(), block.GetHeader().BlockNo, cs.cfg.Hardfork)
152+
if err != nil {
153+
return nil, err
154+
}
155+
156+
for idx, r := range receipts.Get() {
157+
r.SetMemoryInfo(blockHash, block.Header.BlockNo, int32(idx))
158+
159+
r.ContractAddress = types.AddressOrigin(r.ContractAddress)
160+
161+
for _, tx := range block.GetBody().GetTxs() {
162+
if bytes.Equal(r.GetTxHash(), tx.GetHash()) {
163+
r.From = tx.GetBody().GetAccount()
164+
r.To = tx.GetBody().GetRecipient()
165+
break
166+
}
167+
}
168+
}
169+
170+
return receipts, nil
171+
}
172+
173+
func (cs *ChainService) getReceiptsByNo(blockNo types.BlockNo) (*types.Receipts, error) {
174+
blockInMainChain, err := cs.cdb.GetBlockByNo(blockNo)
175+
if err != nil {
176+
return nil, &ErrNoBlock{blockNo}
177+
}
178+
179+
block, err := cs.cdb.getBlock(blockInMainChain.BlockHash())
180+
if !bytes.Equal(block.BlockHash(), blockInMainChain.BlockHash()) {
181+
return nil, errors.New("cannot find a receipt")
182+
}
183+
184+
receipts, err := cs.cdb.getReceipts(block.BlockHash(), block.GetHeader().BlockNo, cs.cfg.Hardfork)
185+
if err != nil {
186+
return nil, err
187+
}
188+
189+
for idx, r := range receipts.Get() {
190+
r.SetMemoryInfo(blockInMainChain.BlockHash(), blockNo, int32(idx))
191+
192+
r.ContractAddress = types.AddressOrigin(r.ContractAddress)
193+
194+
for _, tx := range block.GetBody().GetTxs() {
195+
if bytes.Equal(r.GetTxHash(), tx.GetHash()) {
196+
r.From = tx.GetBody().GetAccount()
197+
r.To = tx.GetBody().GetRecipient()
198+
break
199+
}
200+
}
201+
}
202+
203+
return receipts, nil
204+
}
205+
139206
func (cs *ChainService) getEvents(events *[]*types.Event, blkNo types.BlockNo, filter *types.FilterInfo,
140207
argFilter []types.ArgFilter) uint64 {
141208
blkHash, err := cs.cdb.getHashByNo(blkNo)
@@ -624,7 +691,7 @@ func newBlockExecutor(cs *ChainService, bState *state.BlockState, block *types.B
624691
}
625692

626693
// NewTxExecutor returns a new TxExecFn.
627-
func NewTxExecutor(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb contract.ChainAccessor, bi *types.BlockHeaderInfo, preloadService int) TxExecFn {
694+
func NewTxExecutor(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb contract.ChainAccessor, bi *types.BlockHeaderInfo, executionMode int) TxExecFn {
628695
return func(bState *state.BlockState, tx types.Transaction) error {
629696
if bState == nil {
630697
logger.Error().Msg("bstate is nil in txExec")
@@ -636,7 +703,7 @@ func NewTxExecutor(execCtx context.Context, ccc consensus.ChainConsensusCluster,
636703
}
637704
blockSnap := bState.Snapshot()
638705

639-
err := executeTx(execCtx, ccc, cdb, bState, tx, bi, preloadService)
706+
err := executeTx(execCtx, ccc, cdb, bState, tx, bi, executionMode)
640707
if err != nil {
641708
logger.Error().Err(err).Str("hash", base58.Encode(tx.GetHash())).Msg("tx failed")
642709
if err2 := bState.Rollback(blockSnap); err2 != nil {
@@ -653,22 +720,14 @@ func (e *blockExecutor) execute() error {
653720
// Receipt must be committed unconditionally.
654721
if !e.commitOnly {
655722
defer contract.CloseDatabase()
656-
var preloadTx *types.Tx
657-
numTxs := len(e.txs)
658-
for i, tx := range e.txs {
659-
// if tx is not the last one, preload the next tx
660-
if i != numTxs-1 {
661-
preloadTx = e.txs[i+1]
662-
contract.RequestPreload(e.BlockState, e.bi, preloadTx, tx, contract.ChainService)
663-
}
723+
logger.Trace().Int("txCount", len(e.txs)).Msg("executing txs")
724+
for _, tx := range e.txs {
664725
// execute the transaction
665726
if err := e.execTx(e.BlockState, types.NewTransaction(tx)); err != nil {
666727
//FIXME maybe system error. restart or panic
667728
// all txs have executed successfully in BP node
668729
return err
669730
}
670-
// mark the next preload tx to be executed
671-
contract.SetPreloadTx(preloadTx, contract.ChainService)
672731
}
673732

674733
if e.validateSignWait != nil {
@@ -870,7 +929,7 @@ func adjustRv(ret string) string {
870929
return ret
871930
}
872931

873-
func resetAccount(account *state.V, fee *big.Int, nonce *uint64) error {
932+
func resetAccount(account *state.AccountState, fee *big.Int, nonce *uint64) error {
874933
account.Reset()
875934
if fee != nil {
876935
if account.Balance().Cmp(fee) < 0 {
@@ -884,7 +943,7 @@ func resetAccount(account *state.V, fee *big.Int, nonce *uint64) error {
884943
return account.PutState()
885944
}
886945

887-
func executeTx(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb contract.ChainAccessor, bs *state.BlockState, tx types.Transaction, bi *types.BlockHeaderInfo, preloadService int) error {
946+
func executeTx(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb contract.ChainAccessor, bs *state.BlockState, tx types.Transaction, bi *types.BlockHeaderInfo, executionMode int) error {
888947
var (
889948
txBody = tx.GetBody()
890949
isQuirkTx = types.IsQuirkTx(tx.GetHash())
@@ -910,7 +969,7 @@ func executeTx(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb
910969
return err
911970
}
912971

913-
sender, err := bs.GetAccountStateV(account)
972+
sender, err := state.GetAccountState(account, bs.StateDB)
914973
if err != nil {
915974
return err
916975
}
@@ -923,16 +982,16 @@ func executeTx(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb
923982
if recipient, err = name.Resolve(bs, txBody.Recipient, isQuirkTx); err != nil {
924983
return err
925984
}
926-
var receiver *state.V
985+
var receiver *state.AccountState
927986
status := "SUCCESS"
928987
if len(recipient) > 0 {
929-
receiver, err = bs.GetAccountStateV(recipient)
988+
receiver, err = state.GetAccountState(recipient, bs.StateDB)
930989
if receiver != nil && txBody.Type == types.TxType_REDEPLOY {
931990
status = "RECREATED"
932991
receiver.SetRedeploy()
933992
}
934993
} else {
935-
receiver, err = bs.CreateAccountStateV(contract.CreateContractID(txBody.Account, txBody.Nonce))
994+
receiver, err = state.CreateAccountState(contract.CreateContractID(txBody.Account, txBody.Nonce), bs.StateDB)
936995
status = "CREATED"
937996
}
938997
if err != nil {
@@ -944,7 +1003,7 @@ func executeTx(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb
9441003
var events []*types.Event
9451004
switch txBody.Type {
9461005
case types.TxType_NORMAL, types.TxType_REDEPLOY, types.TxType_TRANSFER, types.TxType_CALL, types.TxType_DEPLOY:
947-
rv, events, txFee, err = contract.Execute(execCtx, bs, cdb, tx.GetTx(), sender, receiver, bi, preloadService, false)
1006+
rv, events, txFee, err = contract.Execute(execCtx, bs, cdb, tx.GetTx(), sender, receiver, bi, executionMode, false)
9481007
sender.SubBalance(txFee)
9491008
case types.TxType_GOVERNANCE:
9501009
txFee = new(big.Int).SetUint64(0)
@@ -958,8 +1017,8 @@ func executeTx(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb
9581017
return err
9591018
}
9601019

961-
var contractState *state.ContractState
962-
contractState, err = bs.OpenContractState(receiver.AccountID(), receiver.State())
1020+
var contractState *statedb.ContractState
1021+
contractState, err = statedb.OpenContractState(receiver.ID(), receiver.State(), bs.StateDB)
9631022
if err != nil {
9641023
return err
9651024
}
@@ -972,7 +1031,7 @@ func executeTx(execCtx context.Context, ccc consensus.ChainConsensusCluster, cdb
9721031
}
9731032
return types.ErrNotAllowedFeeDelegation
9741033
}
975-
rv, events, txFee, err = contract.Execute(execCtx, bs, cdb, tx.GetTx(), sender, receiver, bi, preloadService, true)
1034+
rv, events, txFee, err = contract.Execute(execCtx, bs, cdb, tx.GetTx(), sender, receiver, bi, executionMode, true)
9761035
receiver.SubBalance(txFee)
9771036
}
9781037

@@ -1055,22 +1114,19 @@ func sendRewardCoinbase(bState *state.BlockState, coinbaseAccount []byte) error
10551114
return nil
10561115
}
10571116

1058-
receiverID := types.ToAccountID(coinbaseAccount)
1059-
receiverState, err := bState.GetAccountState(receiverID)
1117+
// add bp reward to coinbase account
1118+
coinbaseAccountState, err := state.GetAccountState(coinbaseAccount, bState.StateDB)
10601119
if err != nil {
10611120
return err
10621121
}
1063-
1064-
receiverChange := types.State(*receiverState)
1065-
receiverChange.Balance = new(big.Int).Add(receiverChange.GetBalanceBigInt(), bpReward).Bytes()
1066-
1067-
err = bState.PutState(receiverID, &receiverChange)
1122+
coinbaseAccountState.AddBalance(bpReward)
1123+
err = coinbaseAccountState.PutState()
10681124
if err != nil {
10691125
return err
10701126
}
10711127

10721128
logger.Debug().Str("reward", bpReward.String()).
1073-
Str("newbalance", receiverChange.GetBalanceBigInt().String()).Msg("send reward to coinbase account")
1129+
Str("newbalance", coinbaseAccountState.Balance().String()).Msg("send reward to coinbase account")
10741130

10751131
return nil
10761132
}

0 commit comments

Comments
 (0)