Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Substate interface #939

Merged
merged 37 commits into from
Jan 22, 2024
Merged
Show file tree
Hide file tree
Changes from 20 commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
c20c878
Create TransactionData interface. Use it throughout the Executor inst…
cabrador Jan 12, 2024
9f20288
Use TransactionData in replay substate.
cabrador Jan 12, 2024
50ebc2d
Use TransactionData in stochastic record.
cabrador Jan 12, 2024
1431842
Add functions to interface.
cabrador Jan 15, 2024
19ea8da
Add substate implementation of the interface
cabrador Jan 15, 2024
51f4c91
Finish using the interface thoughout the repository.
cabrador Jan 15, 2024
80bb737
Finish using the interface thoughout the repository.
cabrador Jan 15, 2024
45bb828
Alloc -> WorldState
cabrador Jan 16, 2024
4310000
Add account tests. Mark old substate as deprecated.
cabrador Jan 16, 2024
0b2b40a
Fix test
cabrador Jan 16, 2024
512cc22
Add flag to builds.
cabrador Jan 16, 2024
4cc9774
Update make file
cabrador Jan 16, 2024
7e1f9ff
Fix mock state.db to match the interface
cabrador Jan 16, 2024
a03bde2
Finish test fix
cabrador Jan 16, 2024
fa56862
fix close substate db
cabrador Jan 16, 2024
0a8ae75
Fix more code
cabrador Jan 16, 2024
0d63400
Fix more code
cabrador Jan 16, 2024
0bf9b99
Revert makefile changes - this issue got fixed in Substate.
cabrador Jan 17, 2024
1920511
Update substate version to newest develop
cabrador Jan 17, 2024
130d036
Return iter error
cabrador Jan 17, 2024
a3ffeb8
Remove new substate usage
cabrador Jan 17, 2024
b5cf5ac
Move substate_transaction into its own folder. Move Transaction inter…
cabrador Jan 17, 2024
443ca82
Revert changes to processor.
cabrador Jan 17, 2024
0c5ace2
Add tests to WorldState and receipt
cabrador Jan 17, 2024
35671c3
Remove local substate repo
cabrador Jan 17, 2024
794ef19
Remove local substate repo
cabrador Jan 17, 2024
b37a2a4
Move transaction interface under root.
cabrador Jan 18, 2024
2ea5b8c
Change type of extensions
cabrador Jan 18, 2024
caa41ab
Revert replace mistakes.
cabrador Jan 18, 2024
28b532f
Revert more replace mistakes.
cabrador Jan 18, 2024
81a9f27
WithValidation -> TxContext
cabrador Jan 18, 2024
ad7807a
Regenerate mocks
cabrador Jan 18, 2024
ff9dd19
Fix tests
cabrador Jan 18, 2024
0b787a5
Bring back hash error
cabrador Jan 19, 2024
6e15cf3
Remove WithValidation from factory functions. Fix more replace typos.
cabrador Jan 19, 2024
8dcf687
Pass hash error in test
cabrador Jan 19, 2024
4e8b1b1
Fix more replace typos. Add comments to tests
cabrador Jan 22, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 7 additions & 6 deletions cmd/aida-sdb/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"github.com/Fantom-foundation/Aida/executor/extension/statedb"
"github.com/Fantom-foundation/Aida/executor/extension/tracker"
"github.com/Fantom-foundation/Aida/executor/extension/validator"
"github.com/Fantom-foundation/Aida/executor/transaction"
"github.com/Fantom-foundation/Aida/logger"
"github.com/Fantom-foundation/Aida/utils"
substate "github.com/Fantom-foundation/Substate"
Expand Down Expand Up @@ -58,13 +59,13 @@ func RecordStateDbTrace(ctx *cli.Context) error {

func record(
cfg *utils.Config,
provider executor.Provider[*substate.Substate],
processor executor.Processor[*substate.Substate],
extra []executor.Extension[*substate.Substate],
provider executor.Provider[transaction.SubstateData],
processor executor.Processor[transaction.SubstateData],
extra []executor.Extension[transaction.SubstateData],
) error {
var extensions = []executor.Extension[*substate.Substate]{
profiler.MakeCpuProfiler[*substate.Substate](cfg),
tracker.MakeProgressLogger[*substate.Substate](cfg, 0),
var extensions = []executor.Extension[transaction.SubstateData]{
profiler.MakeCpuProfiler[transaction.SubstateData](cfg),
tracker.MakeProgressLogger[transaction.SubstateData](cfg, 0),
tracker.MakeProgressTracker(cfg, 0),
statedb.MakeTemporaryStatePrepper(cfg),
statedb.MakeProxyRecorderPrepper(cfg),
Expand Down
60 changes: 31 additions & 29 deletions cmd/aida-sdb/record_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@ import (
"testing"

"github.com/Fantom-foundation/Aida/executor"
"github.com/Fantom-foundation/Aida/executor/transaction"
"github.com/Fantom-foundation/Aida/utils"
substate "github.com/Fantom-foundation/Substate"
substateCommon "github.com/Fantom-foundation/Substate/geth/common"
"github.com/Fantom-foundation/Substate/substate"
"github.com/ethereum/go-ethereum/common"
"go.uber.org/mock/gomock"
)
Expand All @@ -15,9 +17,9 @@ var testingAddress = common.Address{1}

func TestSdbRecord_AllDbEventsAreIssuedInOrder(t *testing.T) {
ctrl := gomock.NewController(t)
provider := executor.NewMockProvider[*substate.Substate](ctrl)
processor := executor.NewMockProcessor[*substate.Substate](ctrl)
ext := executor.NewMockExtension[*substate.Substate](ctrl)
provider := executor.NewMockProvider[transaction.SubstateData](ctrl)
processor := executor.NewMockProcessor[transaction.SubstateData](ctrl)
ext := executor.NewMockExtension[transaction.SubstateData](ctrl)
path := t.TempDir() + "test_trace"
cfg := &utils.Config{
First: 10,
Expand All @@ -30,63 +32,63 @@ func TestSdbRecord_AllDbEventsAreIssuedInOrder(t *testing.T) {

provider.EXPECT().
Run(10, 12, gomock.Any()).
DoAndReturn(func(from int, to int, consumer executor.Consumer[*substate.Substate]) error {
DoAndReturn(func(from int, to int, consumer executor.Consumer[transaction.SubstateData]) error {
for i := from; i < to; i++ {
consumer(executor.TransactionInfo[*substate.Substate]{Block: i, Transaction: 3, Data: emptyTx})
consumer(executor.TransactionInfo[*substate.Substate]{Block: i, Transaction: utils.PseudoTx, Data: emptyTx})
consumer(executor.TransactionInfo[transaction.SubstateData]{Block: i, Transaction: 3, Data: transaction.NewSubstateData(emptyTx)})
consumer(executor.TransactionInfo[transaction.SubstateData]{Block: i, Transaction: utils.PseudoTx, Data: transaction.NewSubstateData(emptyTx)})
}
return nil
})

// All transactions are processed in order
gomock.InOrder(
ext.EXPECT().PreRun(executor.AtBlock[*substate.Substate](10), gomock.Any()),
ext.EXPECT().PreRun(executor.AtBlock[transaction.SubstateData](10), gomock.Any()),

// block 10
ext.EXPECT().PreTransaction(executor.AtTransaction[*substate.Substate](10, 3), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[*substate.Substate](10, 3), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[*substate.Substate](10, 3), gomock.Any()),
ext.EXPECT().PreTransaction(executor.AtTransaction[transaction.SubstateData](10, 3), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[transaction.SubstateData](10, 3), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[transaction.SubstateData](10, 3), gomock.Any()),

ext.EXPECT().PreTransaction(executor.AtTransaction[*substate.Substate](10, utils.PseudoTx), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[*substate.Substate](10, utils.PseudoTx), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[*substate.Substate](10, utils.PseudoTx), gomock.Any()),
ext.EXPECT().PreTransaction(executor.AtTransaction[transaction.SubstateData](10, utils.PseudoTx), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[transaction.SubstateData](10, utils.PseudoTx), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[transaction.SubstateData](10, utils.PseudoTx), gomock.Any()),

// block 11
ext.EXPECT().PreTransaction(executor.AtTransaction[*substate.Substate](11, 3), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[*substate.Substate](11, 3), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[*substate.Substate](11, 3), gomock.Any()),
ext.EXPECT().PreTransaction(executor.AtTransaction[transaction.SubstateData](11, 3), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[transaction.SubstateData](11, 3), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[transaction.SubstateData](11, 3), gomock.Any()),

ext.EXPECT().PreTransaction(executor.AtTransaction[*substate.Substate](11, utils.PseudoTx), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[*substate.Substate](11, utils.PseudoTx), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[*substate.Substate](11, utils.PseudoTx), gomock.Any()),
ext.EXPECT().PreTransaction(executor.AtTransaction[transaction.SubstateData](11, utils.PseudoTx), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[transaction.SubstateData](11, utils.PseudoTx), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[transaction.SubstateData](11, utils.PseudoTx), gomock.Any()),

ext.EXPECT().PostRun(executor.AtBlock[*substate.Substate](12), gomock.Any(), nil),
ext.EXPECT().PostRun(executor.AtBlock[transaction.SubstateData](12), gomock.Any(), nil),
)

if err := record(cfg, provider, processor, []executor.Extension[*substate.Substate]{ext}); err != nil {
if err := record(cfg, provider, processor, []executor.Extension[transaction.SubstateData]{ext}); err != nil {
t.Errorf("record failed: %v", err)
}
}

// emptyTx is a dummy substate that will be processed without crashing.
var emptyTx = &substate.Substate{
Env: &substate.SubstateEnv{},
Message: &substate.SubstateMessage{
Env: &substate.Env{},
Message: &substate.Message{
GasPrice: big.NewInt(12),
},
Result: &substate.SubstateResult{
Result: &substate.Result{
GasUsed: 1,
},
}

// testTx is a dummy substate used for testing validation.
var testTx = &substate.Substate{
InputAlloc: substate.SubstateAlloc{testingAddress: substate.NewSubstateAccount(1, new(big.Int).SetUint64(1), []byte{})},
Env: &substate.SubstateEnv{},
Message: &substate.SubstateMessage{
InputAlloc: substate.Alloc{substateCommon.Address(testingAddress): substate.NewAccount(1, new(big.Int).SetUint64(1), []byte{})},
Env: &substate.Env{},
Message: &substate.Message{
GasPrice: big.NewInt(12),
},
Result: &substate.SubstateResult{
Result: &substate.Result{
GasUsed: 1,
},
}
26 changes: 13 additions & 13 deletions cmd/aida-sdb/trace/replay_substate.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@ import (
"github.com/Fantom-foundation/Aida/executor/extension/statedb"
"github.com/Fantom-foundation/Aida/executor/extension/tracker"
"github.com/Fantom-foundation/Aida/executor/extension/validator"
"github.com/Fantom-foundation/Aida/executor/transaction"
"github.com/Fantom-foundation/Aida/state"
"github.com/Fantom-foundation/Aida/tracer/context"
"github.com/Fantom-foundation/Aida/tracer/operation"
"github.com/Fantom-foundation/Aida/utils"
substate "github.com/Fantom-foundation/Substate"
"github.com/urfave/cli/v2"
)

Expand All @@ -37,8 +37,8 @@ func ReplaySubstate(ctx *cli.Context) error {

processor := makeSubstateProcessor(cfg, rCtx, operationProvider)

var extra = []executor.Extension[*substate.Substate]{
profiler.MakeReplayProfiler[*substate.Substate](cfg, rCtx),
var extra = []executor.Extension[transaction.SubstateData]{
profiler.MakeReplayProfiler[transaction.SubstateData](cfg, rCtx),
}

return replaySubstate(cfg, substateProvider, processor, nil, extra)
Expand All @@ -56,7 +56,7 @@ type substateProcessor struct {
operationProvider executor.Provider[[]operation.Operation]
}

func (p substateProcessor) Process(state executor.State[*substate.Substate], ctx *executor.Context) error {
func (p substateProcessor) Process(state executor.State[transaction.SubstateData], ctx *executor.Context) error {
return p.operationProvider.Run(state.Block, state.Block, func(t executor.TransactionInfo[[]operation.Operation]) error {
p.runTransaction(uint64(state.Block), t.Data, ctx.State)
return nil
Expand All @@ -65,21 +65,21 @@ func (p substateProcessor) Process(state executor.State[*substate.Substate], ctx

func replaySubstate(
cfg *utils.Config,
provider executor.Provider[*substate.Substate],
processor executor.Processor[*substate.Substate],
provider executor.Provider[transaction.SubstateData],
processor executor.Processor[transaction.SubstateData],
stateDb state.StateDB,
extra []executor.Extension[*substate.Substate],
extra []executor.Extension[transaction.SubstateData],
) error {
var extensionList = []executor.Extension[*substate.Substate]{
profiler.MakeCpuProfiler[*substate.Substate](cfg),
tracker.MakeProgressLogger[*substate.Substate](cfg, 0),
profiler.MakeMemoryUsagePrinter[*substate.Substate](cfg),
profiler.MakeMemoryProfiler[*substate.Substate](cfg),
var extensionList = []executor.Extension[transaction.SubstateData]{
profiler.MakeCpuProfiler[transaction.SubstateData](cfg),
tracker.MakeProgressLogger[transaction.SubstateData](cfg, 0),
profiler.MakeMemoryUsagePrinter[transaction.SubstateData](cfg),
profiler.MakeMemoryProfiler[transaction.SubstateData](cfg),
validator.MakeLiveDbValidator(cfg),
}

if stateDb == nil {
extensionList = append(extensionList, statedb.MakeStateDbManager[*substate.Substate](cfg))
extensionList = append(extensionList, statedb.MakeStateDbManager[transaction.SubstateData](cfg))
}

if cfg.DbImpl == "memory" {
Expand Down
51 changes: 26 additions & 25 deletions cmd/aida-sdb/trace/replay_substate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import (
"testing"

"github.com/Fantom-foundation/Aida/executor"
"github.com/Fantom-foundation/Aida/executor/transaction"
"github.com/Fantom-foundation/Aida/state"
"github.com/Fantom-foundation/Aida/tracer/context"
"github.com/Fantom-foundation/Aida/tracer/operation"
"github.com/Fantom-foundation/Aida/utils"
substate "github.com/Fantom-foundation/Substate"
"github.com/Fantom-foundation/Substate/substate"
"github.com/ethereum/go-ethereum/common"
"go.uber.org/mock/gomock"
)
Expand All @@ -18,9 +19,9 @@ var testingAddress = common.Address{1}

func TestSdbReplaySubstate_AllDbEventsAreIssuedInOrder(t *testing.T) {
ctrl := gomock.NewController(t)
provider := executor.NewMockProvider[*substate.Substate](ctrl)
processor := executor.NewMockProcessor[*substate.Substate](ctrl)
ext := executor.NewMockExtension[*substate.Substate](ctrl)
provider := executor.NewMockProvider[transaction.SubstateData](ctrl)
processor := executor.NewMockProcessor[transaction.SubstateData](ctrl)
ext := executor.NewMockExtension[transaction.SubstateData](ctrl)

cfg := &utils.Config{}
cfg.DbImpl = "carmen"
Expand All @@ -31,39 +32,39 @@ func TestSdbReplaySubstate_AllDbEventsAreIssuedInOrder(t *testing.T) {

provider.EXPECT().
Run(0, 1, gomock.Any()).
DoAndReturn(func(from int, to int, consumer executor.Consumer[*substate.Substate]) error {
DoAndReturn(func(from int, to int, consumer executor.Consumer[transaction.SubstateData]) error {
for i := from; i < to; i++ {
consumer(executor.TransactionInfo[*substate.Substate]{Block: 0, Transaction: 0, Data: testTx})
consumer(executor.TransactionInfo[*substate.Substate]{Block: 0, Transaction: 1, Data: testTx})
consumer(executor.TransactionInfo[transaction.SubstateData]{Block: 0, Transaction: 0, Data: transaction.NewSubstateData(testTx)})
consumer(executor.TransactionInfo[transaction.SubstateData]{Block: 0, Transaction: 1, Data: transaction.NewSubstateData(testTx)})
}
return nil
})

// All transactions are processed in order
gomock.InOrder(
ext.EXPECT().PreRun(executor.AtBlock[*substate.Substate](0), gomock.Any()),
ext.EXPECT().PreRun(executor.AtBlock[transaction.SubstateData](0), gomock.Any()),

// tx 0
ext.EXPECT().PreTransaction(executor.AtTransaction[*substate.Substate](0, 0), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[*substate.Substate](0, 0), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[*substate.Substate](0, 0), gomock.Any()),
ext.EXPECT().PreTransaction(executor.AtTransaction[transaction.SubstateData](0, 0), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[transaction.SubstateData](0, 0), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[transaction.SubstateData](0, 0), gomock.Any()),

// tx 1
ext.EXPECT().PreTransaction(executor.AtTransaction[*substate.Substate](0, 1), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[*substate.Substate](0, 1), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[*substate.Substate](0, 1), gomock.Any()),
ext.EXPECT().PreTransaction(executor.AtTransaction[transaction.SubstateData](0, 1), gomock.Any()),
processor.EXPECT().Process(executor.AtTransaction[transaction.SubstateData](0, 1), gomock.Any()),
ext.EXPECT().PostTransaction(executor.AtTransaction[transaction.SubstateData](0, 1), gomock.Any()),

ext.EXPECT().PostRun(executor.AtBlock[*substate.Substate](1), gomock.Any(), nil),
ext.EXPECT().PostRun(executor.AtBlock[transaction.SubstateData](1), gomock.Any(), nil),
)

if err := replaySubstate(cfg, provider, processor, nil, []executor.Extension[*substate.Substate]{ext}); err != nil {
if err := replaySubstate(cfg, provider, processor, nil, []executor.Extension[transaction.SubstateData]{ext}); err != nil {
t.Errorf("record failed: %v", err)
}
}

func TestSdbReplaySubstate_StateDbPrepperIsAddedIfDbImplIsMemory(t *testing.T) {
ctrl := gomock.NewController(t)
substateProvider := executor.NewMockProvider[*substate.Substate](ctrl)
substateProvider := executor.NewMockProvider[transaction.SubstateData](ctrl)
operationProvider := executor.NewMockProvider[[]operation.Operation](ctrl)
db := state.NewMockStateDB(ctrl)

Expand All @@ -76,9 +77,9 @@ func TestSdbReplaySubstate_StateDbPrepperIsAddedIfDbImplIsMemory(t *testing.T) {

substateProvider.EXPECT().
Run(0, 1, gomock.Any()).
DoAndReturn(func(from int, to int, consumer executor.Consumer[*substate.Substate]) error {
DoAndReturn(func(from int, to int, consumer executor.Consumer[transaction.SubstateData]) error {
for i := from; i < to; i++ {
consumer(executor.TransactionInfo[*substate.Substate]{Block: 0, Transaction: 0, Data: testTx})
consumer(executor.TransactionInfo[transaction.SubstateData]{Block: 0, Transaction: 0, Data: transaction.NewSubstateData(testTx)})
}
return nil
})
Expand All @@ -103,7 +104,7 @@ func TestSdbReplaySubstate_StateDbPrepperIsAddedIfDbImplIsMemory(t *testing.T) {

func TestSdbReplaySubstate_TxPrimerIsAddedIfDbImplIsNotMemory(t *testing.T) {
ctrl := gomock.NewController(t)
substateProvider := executor.NewMockProvider[*substate.Substate](ctrl)
substateProvider := executor.NewMockProvider[transaction.SubstateData](ctrl)
operationProvider := executor.NewMockProvider[[]operation.Operation](ctrl)
db := state.NewMockStateDB(ctrl)
bulkLoad := state.NewMockBulkLoad(ctrl)
Expand All @@ -117,9 +118,9 @@ func TestSdbReplaySubstate_TxPrimerIsAddedIfDbImplIsNotMemory(t *testing.T) {

substateProvider.EXPECT().
Run(1, 2, gomock.Any()).
DoAndReturn(func(from int, to int, consumer executor.Consumer[*substate.Substate]) error {
DoAndReturn(func(from int, to int, consumer executor.Consumer[transaction.SubstateData]) error {
for i := from; i < to; i++ {
consumer(executor.TransactionInfo[*substate.Substate]{Block: 1, Transaction: 0, Data: testTx})
consumer(executor.TransactionInfo[transaction.SubstateData]{Block: 1, Transaction: 0, Data: transaction.NewSubstateData(testTx)})
}
return nil
})
Expand Down Expand Up @@ -158,12 +159,12 @@ var testOperationsB = []operation.Operation{

// testTx is a dummy substate that will be processed without crashing.
var testTx = &substate.Substate{
Env: &substate.SubstateEnv{},
Message: &substate.SubstateMessage{
Env: &substate.Env{},
Message: &substate.Message{
Gas: 10000,
GasPrice: big.NewInt(0),
},
Result: &substate.SubstateResult{
Result: &substate.Result{
GasUsed: 1,
},
}
5 changes: 3 additions & 2 deletions cmd/aida-stochastic-sdb/stochastic/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"time"

"github.com/Fantom-foundation/Aida/executor"
"github.com/Fantom-foundation/Aida/executor/transaction"
"github.com/Fantom-foundation/Aida/state"
"github.com/Fantom-foundation/Aida/stochastic"
"github.com/Fantom-foundation/Aida/utils"
Expand Down Expand Up @@ -102,9 +103,9 @@ func stochasticRecordAction(ctx *cli.Context) error {
}

var statedb state.StateDB
statedb = state.MakeInMemoryStateDB(&tx.Substate.InputAlloc, tx.Block)
statedb = state.MakeInMemoryStateDB(transaction.NewOldSubstateAlloc(tx.Substate.InputAlloc), tx.Block)
statedb = stochastic.NewEventProxy(statedb, &eventRegistry)
if err = processor.ProcessTransaction(statedb, int(tx.Block), tx.Transaction, tx.Substate); err != nil {
if err = processor.ProcessTransaction(statedb, int(tx.Block), tx.Transaction, transaction.NewOldSubstateData(tx.Substate)); err != nil {
return err
}

Expand Down
Loading
Loading