diff type for representing deleted accounts
This commit is contained in:
parent
5c3e0d6437
commit
b7c412d303
@ -89,21 +89,21 @@ func (sdb *builder) BuildStateDiff(oldStateRoot, newStateRoot common.Hash, block
|
||||
if err != nil {
|
||||
return StateDiff{}, fmt.Errorf("error building diff for updated accounts: %v", err)
|
||||
}
|
||||
createdAccounts, err := sdb.buildDiffEventual(creations)
|
||||
createdAccounts, err := sdb.buildDiffCreations(creations)
|
||||
if err != nil {
|
||||
return StateDiff{}, fmt.Errorf("error building diff for created accounts: %v", err)
|
||||
}
|
||||
deletedAccounts, err := sdb.buildDiffEventual(deletions)
|
||||
deletedAccounts, err := sdb.buildDiffDeletions(deletions)
|
||||
if err != nil {
|
||||
return StateDiff{}, fmt.Errorf("error building diff for deleted accounts: %v", err)
|
||||
}
|
||||
|
||||
return StateDiff{
|
||||
BlockNumber: blockNumber,
|
||||
BlockHash: blockHash,
|
||||
CreatedAccounts: createdAccounts,
|
||||
DeletedAccounts: deletedAccounts,
|
||||
UpdatedAccounts: updatedAccounts,
|
||||
BlockNumber: blockNumber,
|
||||
BlockHash: blockHash,
|
||||
CreatedNodes: createdAccounts,
|
||||
DeletedNodes: deletedAccounts,
|
||||
UpdatedNodes: updatedAccounts,
|
||||
}, nil
|
||||
}
|
||||
|
||||
@ -184,52 +184,66 @@ func (sdb *builder) collectDiffNodes(a, b trie.NodeIterator) (AccountsMap, error
|
||||
return diffAccounts, nil
|
||||
}
|
||||
|
||||
func (sdb *builder) buildDiffEventual(accounts AccountsMap) ([]AccountDiff, error) {
|
||||
accountDiffs := make([]AccountDiff, 0)
|
||||
func (sdb *builder) buildDiffCreations(accounts AccountsMap) ([]StateNode, error) {
|
||||
accountDiffs := make([]StateNode, 0, len(accounts))
|
||||
var err error
|
||||
for _, val := range accounts {
|
||||
// If account is not nil, we need to process storage diffs
|
||||
var storageDiffs []StorageDiff
|
||||
var storageDiffs []StorageNode
|
||||
if val.Account != nil {
|
||||
storageDiffs, err = sdb.buildStorageDiffsEventual(val.Account.Root)
|
||||
storageDiffs, err = sdb.buildStorageNodesEventual(val.Account.Root)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed building eventual storage diffs for node %x\r\nerror: %v", val.Path, err)
|
||||
}
|
||||
}
|
||||
accountDiffs = append(accountDiffs, AccountDiff{
|
||||
NodeType: val.NodeType,
|
||||
Path: val.Path,
|
||||
LeafKey: val.LeafKey,
|
||||
NodeValue: val.NodeValue,
|
||||
Storage: storageDiffs,
|
||||
accountDiffs = append(accountDiffs, StateNode{
|
||||
NodeType: val.NodeType,
|
||||
Path: val.Path,
|
||||
LeafKey: val.LeafKey,
|
||||
NodeValue: val.NodeValue,
|
||||
StorageDiffs: storageDiffs,
|
||||
})
|
||||
}
|
||||
|
||||
return accountDiffs, nil
|
||||
}
|
||||
|
||||
func (sdb *builder) buildDiffIncremental(creations AccountsMap, deletions AccountsMap, updatedKeys []string) ([]AccountDiff, error) {
|
||||
updatedAccounts := make([]AccountDiff, 0)
|
||||
func (sdb *builder) buildDiffDeletions(accounts AccountsMap) ([]StateNode, error) {
|
||||
accountDiffs := make([]StateNode, 0, len(accounts))
|
||||
for _, val := range accounts {
|
||||
// deleted account can not have storage or it would not be deleted
|
||||
accountDiffs = append(accountDiffs, StateNode{
|
||||
NodeType: Removed,
|
||||
Path: val.Path,
|
||||
LeafKey: val.LeafKey,
|
||||
NodeValue: []byte{},
|
||||
})
|
||||
}
|
||||
return accountDiffs, nil
|
||||
}
|
||||
|
||||
func (sdb *builder) buildDiffIncremental(creations AccountsMap, deletions AccountsMap, updatedKeys []string) ([]StateNode, error) {
|
||||
updatedAccounts := make([]StateNode, 0, len(updatedKeys))
|
||||
var err error
|
||||
for _, val := range updatedKeys {
|
||||
hashKey := common.HexToHash(val)
|
||||
createdAcc := creations[hashKey]
|
||||
deletedAcc := deletions[hashKey]
|
||||
var storageDiffs []StorageDiff
|
||||
var storageDiffs []StorageNode
|
||||
if deletedAcc.Account != nil && createdAcc.Account != nil {
|
||||
oldSR := deletedAcc.Account.Root
|
||||
newSR := createdAcc.Account.Root
|
||||
storageDiffs, err = sdb.buildStorageDiffsIncremental(oldSR, newSR)
|
||||
storageDiffs, err = sdb.buildStorageNodesIncremental(oldSR, newSR)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed building incremental storage diffs for %s\r\nerror: %v", hashKey.Hex(), err)
|
||||
}
|
||||
}
|
||||
updatedAccounts = append(updatedAccounts, AccountDiff{
|
||||
NodeType: createdAcc.NodeType,
|
||||
Path: createdAcc.Path,
|
||||
NodeValue: createdAcc.NodeValue,
|
||||
LeafKey: createdAcc.LeafKey,
|
||||
Storage: storageDiffs,
|
||||
updatedAccounts = append(updatedAccounts, StateNode{
|
||||
NodeType: createdAcc.NodeType,
|
||||
Path: createdAcc.Path,
|
||||
NodeValue: createdAcc.NodeValue,
|
||||
LeafKey: createdAcc.LeafKey,
|
||||
StorageDiffs: storageDiffs,
|
||||
})
|
||||
delete(creations, common.HexToHash(val))
|
||||
delete(deletions, common.HexToHash(val))
|
||||
@ -238,7 +252,10 @@ func (sdb *builder) buildDiffIncremental(creations AccountsMap, deletions Accoun
|
||||
return updatedAccounts, nil
|
||||
}
|
||||
|
||||
func (sdb *builder) buildStorageDiffsEventual(sr common.Hash) ([]StorageDiff, error) {
|
||||
// if an account is moved to a new path that didn't previously have a node, it appears to have been "created"
|
||||
// but it actually has a previous state associated with, a previous storage trie, so this would produce the
|
||||
// wrong result... it would produce a node for the entire trie, not just the diffs since the last state
|
||||
func (sdb *builder) buildStorageNodesEventual(sr common.Hash) ([]StorageNode, error) {
|
||||
log.Debug("Storage Root For Eventual Diff", "root", sr.Hex())
|
||||
stateCache := sdb.blockChain.StateCache()
|
||||
sTrie, err := stateCache.OpenTrie(sr)
|
||||
@ -247,10 +264,10 @@ func (sdb *builder) buildStorageDiffsEventual(sr common.Hash) ([]StorageDiff, er
|
||||
return nil, err
|
||||
}
|
||||
it := sTrie.NodeIterator(make([]byte, 0))
|
||||
return sdb.buildStorageDiffsFromTrie(it)
|
||||
return sdb.buildStorageNodesFromTrie(it)
|
||||
}
|
||||
|
||||
func (sdb *builder) buildStorageDiffsIncremental(oldSR common.Hash, newSR common.Hash) ([]StorageDiff, error) {
|
||||
func (sdb *builder) buildStorageNodesIncremental(oldSR common.Hash, newSR common.Hash) ([]StorageNode, error) {
|
||||
log.Debug("Storage Roots for Incremental Diff", "old", oldSR.Hex(), "new", newSR.Hex())
|
||||
stateCache := sdb.blockChain.StateCache()
|
||||
|
||||
@ -266,11 +283,11 @@ func (sdb *builder) buildStorageDiffsIncremental(oldSR common.Hash, newSR common
|
||||
oldIt := oldTrie.NodeIterator(make([]byte, 0))
|
||||
newIt := newTrie.NodeIterator(make([]byte, 0))
|
||||
it, _ := trie.NewDifferenceIterator(oldIt, newIt)
|
||||
return sdb.buildStorageDiffsFromTrie(it)
|
||||
return sdb.buildStorageNodesFromTrie(it)
|
||||
}
|
||||
|
||||
func (sdb *builder) buildStorageDiffsFromTrie(it trie.NodeIterator) ([]StorageDiff, error) {
|
||||
storageDiffs := make([]StorageDiff, 0)
|
||||
func (sdb *builder) buildStorageNodesFromTrie(it trie.NodeIterator) ([]StorageNode, error) {
|
||||
storageDiffs := make([]StorageNode, 0)
|
||||
for it.Next(true) {
|
||||
// skip value nodes
|
||||
if it.Leaf() {
|
||||
@ -299,7 +316,7 @@ func (sdb *builder) buildStorageDiffsFromTrie(it trie.NodeIterator) ([]StorageDi
|
||||
valueNodePath := append(nodePath, partialPath...)
|
||||
encodedPath := trie.HexToCompact(valueNodePath)
|
||||
leafKey := encodedPath[1:]
|
||||
sd := StorageDiff{
|
||||
sd := StorageNode{
|
||||
NodeType: ty,
|
||||
Path: nodePath,
|
||||
NodeValue: node,
|
||||
@ -308,7 +325,7 @@ func (sdb *builder) buildStorageDiffsFromTrie(it trie.NodeIterator) ([]StorageDi
|
||||
storageDiffs = append(storageDiffs, sd)
|
||||
case Extension, Branch:
|
||||
if sdb.config.IntermediateNodes {
|
||||
storageDiffs = append(storageDiffs, StorageDiff{
|
||||
storageDiffs = append(storageDiffs, StorageNode{
|
||||
NodeType: ty,
|
||||
Path: nodePath,
|
||||
NodeValue: node,
|
||||
|
@ -34,8 +34,8 @@ import (
|
||||
// TODO: add test that filters on address
|
||||
var (
|
||||
contractLeafKey []byte
|
||||
emptyAccounts = make([]statediff.AccountDiff, 0)
|
||||
emptyStorage = make([]statediff.StorageDiff, 0)
|
||||
emptyAccounts = make([]statediff.StateNode, 0)
|
||||
emptyStorage = make([]statediff.StorageNode, 0)
|
||||
block0, block1, block2, block3 *types.Block
|
||||
builder statediff.Builder
|
||||
miningReward = int64(2000000000000000000)
|
||||
@ -300,11 +300,11 @@ func TestBuilder(t *testing.T) {
|
||||
blockHash: block0.Hash(),
|
||||
},
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedAccounts: emptyAccounts,
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedNodes: emptyAccounts,
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -319,17 +319,17 @@ func TestBuilder(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock0LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock0LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -344,39 +344,39 @@ func TestBuilder(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block1.Number(),
|
||||
BlockHash: block1.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: []statediff.AccountDiff{ // This leaf appears to be deleted since it is turned into a branch node
|
||||
DeletedNodes: []statediff.StateNode{ // This leaf appears to be deleted since it is turned into a branch node and the account is moved to \x00
|
||||
{ // It would instead show up in the UpdateAccounts as new branch node IF intermediate node diffing was turned on (as it is in the test below)
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock0LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Removed,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: []byte{},
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -393,13 +393,13 @@ func TestBuilder(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block2.Number(),
|
||||
BlockHash: block2.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: contractLeafKey,
|
||||
NodeValue: contractAccountAtBlock2LeafNode,
|
||||
Storage: []statediff.StorageDiff{
|
||||
StorageDiffs: []statediff.StorageNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
@ -409,35 +409,35 @@ func TestBuilder(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -453,24 +453,24 @@ func TestBuilder(t *testing.T) {
|
||||
blockHash: block3.Hash(),
|
||||
},
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block3.Number(),
|
||||
BlockHash: block3.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
BlockNumber: block3.Number(),
|
||||
BlockHash: block3.Hash(),
|
||||
CreatedNodes: []statediff.StateNode{},
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock3LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock3LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: contractLeafKey,
|
||||
NodeValue: contractAccountAtBlock3LeafNode,
|
||||
Storage: []statediff.StorageDiff{
|
||||
StorageDiffs: []statediff.StorageNode{
|
||||
{
|
||||
Path: []byte{'\x02'},
|
||||
NodeType: statediff.Leaf,
|
||||
@ -486,11 +486,11 @@ func TestBuilder(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock3LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock3LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -547,11 +547,11 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
blockHash: block0.Hash(),
|
||||
},
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedAccounts: emptyAccounts,
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedNodes: emptyAccounts,
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -566,17 +566,17 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock0LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock0LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -591,36 +591,36 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block1.Number(),
|
||||
BlockHash: block1.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
NodeValue: block1BranchNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
NodeValue: block1BranchNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -639,13 +639,13 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block2.Number(),
|
||||
BlockHash: block2.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: contractLeafKey,
|
||||
NodeValue: contractAccountAtBlock2LeafNode,
|
||||
Storage: []statediff.StorageDiff{
|
||||
StorageDiffs: []statediff.StorageNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
@ -655,41 +655,41 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
NodeValue: block2BranchNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
NodeValue: block2BranchNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountAtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -705,30 +705,30 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
blockHash: block3.Hash(),
|
||||
},
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block3.Number(),
|
||||
BlockHash: block3.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
BlockNumber: block3.Number(),
|
||||
BlockHash: block3.Hash(),
|
||||
CreatedNodes: []statediff.StateNode{},
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
NodeValue: block3BranchNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
NodeValue: block3BranchNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock3LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock3LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: contractLeafKey,
|
||||
NodeValue: contractAccountAtBlock3LeafNode,
|
||||
Storage: []statediff.StorageDiff{
|
||||
StorageDiffs: []statediff.StorageNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
@ -749,11 +749,11 @@ func TestBuilderWithIntermediateNodes(t *testing.T) {
|
||||
},
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock3LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account2LeafKey,
|
||||
NodeValue: account2AtBlock3LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -811,11 +811,11 @@ func TestBuilderWithWatchedAddressList(t *testing.T) {
|
||||
blockHash: block0.Hash(),
|
||||
},
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedAccounts: emptyAccounts,
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedNodes: emptyAccounts,
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -828,11 +828,11 @@ func TestBuilderWithWatchedAddressList(t *testing.T) {
|
||||
blockHash: block0.Hash(),
|
||||
},
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedAccounts: emptyAccounts,
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
BlockNumber: block0.Number(),
|
||||
BlockHash: block0.Hash(),
|
||||
CreatedNodes: emptyAccounts,
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -847,17 +847,17 @@ func TestBuilderWithWatchedAddressList(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block1.Number(),
|
||||
BlockHash: block1.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{},
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{},
|
||||
},
|
||||
},
|
||||
{
|
||||
@ -873,13 +873,13 @@ func TestBuilderWithWatchedAddressList(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block2.Number(),
|
||||
BlockHash: block2.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: contractLeafKey,
|
||||
NodeValue: contractAccountAtBlock2LeafNode,
|
||||
Storage: []statediff.StorageDiff{
|
||||
StorageDiffs: []statediff.StorageNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
@ -889,14 +889,14 @@ func TestBuilderWithWatchedAddressList(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock2LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1AtBlock2LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -912,17 +912,17 @@ func TestBuilderWithWatchedAddressList(t *testing.T) {
|
||||
blockHash: block3.Hash(),
|
||||
},
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block3.Number(),
|
||||
BlockHash: block3.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
BlockNumber: block3.Number(),
|
||||
BlockHash: block3.Hash(),
|
||||
CreatedNodes: []statediff.StateNode{},
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: contractLeafKey,
|
||||
NodeValue: contractAccountAtBlock3LeafNode,
|
||||
Storage: []statediff.StorageDiff{
|
||||
StorageDiffs: []statediff.StorageNode{
|
||||
{
|
||||
Path: []byte{'\x02'},
|
||||
NodeType: statediff.Leaf,
|
||||
|
@ -26,7 +26,7 @@ import (
|
||||
)
|
||||
|
||||
func sortKeys(data AccountsMap) []string {
|
||||
var keys []string
|
||||
keys := make([]string, 0, len(data))
|
||||
for key := range data {
|
||||
keys = append(keys, key.Hex())
|
||||
}
|
||||
@ -35,7 +35,8 @@ func sortKeys(data AccountsMap) []string {
|
||||
return keys
|
||||
}
|
||||
|
||||
// findIntersection finds the set of strings from both arrays that are equivalent (same key as same index)
|
||||
// findIntersection finds the set of strings from both arrays that are equivalent
|
||||
// a and b must first be sorted
|
||||
// this is used to find which keys have been both "deleted" and "created" i.e. they were updated
|
||||
func findIntersection(a, b []string) []string {
|
||||
lenA := len(a)
|
||||
|
@ -47,8 +47,8 @@ var (
|
||||
block1CoinbaseAddr, block2CoinbaseAddr, block3CoinbaseAddr common.Address
|
||||
block1CoinbaseHash, block2CoinbaseHash, block3CoinbaseHash common.Hash
|
||||
builder statediff.Builder
|
||||
emptyAccounts = make([]statediff.AccountDiff, 0)
|
||||
emptyStorage = make([]statediff.StorageDiff, 0)
|
||||
emptyAccounts = make([]statediff.StateNode, 0)
|
||||
emptyStorage = make([]statediff.StorageNode, 0)
|
||||
|
||||
// block 1 data
|
||||
block1CoinbaseAccount, _ = rlp.EncodeToBytes(state.Account{
|
||||
@ -498,34 +498,34 @@ func TestBuilderOnMainnetBlocks(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block1.Number(),
|
||||
BlockHash: block1.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x04', '\x0b', '\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: block1CoinbaseHash.Bytes(),
|
||||
NodeValue: block1CoinbaseLeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x04', '\x0b', '\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: block1CoinbaseHash.Bytes(),
|
||||
NodeValue: block1CoinbaseLeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block1RootBranchNode,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block1RootBranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x04'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block1x04BranchNode,
|
||||
Path: []byte{'\x04'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block1x04BranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x04', '\x0b'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block1x040bBranchNode,
|
||||
Path: []byte{'\x04', '\x0b'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block1x040bBranchNode,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -544,50 +544,50 @@ func TestBuilderOnMainnetBlocks(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block2.Number(),
|
||||
BlockHash: block2.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
// this new leaf at x00 x08 x0d x00 was created when a premine account (leaf) was moved from path x00 x08 x0d
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
// this new leaf at x00 x08 x0d x00 was "created" when a premine account (leaf) was moved from path x00 x08 x0d
|
||||
// this occurred because of the creation of the new coinbase receiving account (leaf) at x00 x08 x0d x04
|
||||
// which necessitates we create a branch at x00 x08 x0d (as shown in the below UpdateAccounts)
|
||||
{
|
||||
Path: []byte{'\x00', '\x08', '\x0d', '\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
Storage: emptyStorage,
|
||||
LeafKey: common.HexToHash("08d0f2e24db7943eab4415f99e109698863b0fecca1cf9ffc500f38cefbbe29e").Bytes(),
|
||||
NodeValue: block2MovedPremineLeafNode,
|
||||
Path: []byte{'\x00', '\x08', '\x0d', '\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
StorageDiffs: emptyStorage,
|
||||
LeafKey: common.HexToHash("08d0f2e24db7943eab4415f99e109698863b0fecca1cf9ffc500f38cefbbe29e").Bytes(),
|
||||
NodeValue: block2MovedPremineLeafNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00', '\x08', '\x0d', '\x04'},
|
||||
NodeType: statediff.Leaf,
|
||||
Storage: emptyStorage,
|
||||
LeafKey: block2CoinbaseHash.Bytes(),
|
||||
NodeValue: block2CoinbaseLeafNode,
|
||||
Path: []byte{'\x00', '\x08', '\x0d', '\x04'},
|
||||
NodeType: statediff.Leaf,
|
||||
StorageDiffs: emptyStorage,
|
||||
LeafKey: block2CoinbaseHash.Bytes(),
|
||||
NodeValue: block2CoinbaseLeafNode,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block2RootBranchNode,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block2RootBranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block2x00BranchNode,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block2x00BranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00', '\x08'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block2x0008BranchNode,
|
||||
Path: []byte{'\x00', '\x08'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block2x0008BranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00', '\x08', '\x0d'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block2x00080dBranchNode,
|
||||
Path: []byte{'\x00', '\x08', '\x0d'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block2x00080dBranchNode,
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -605,72 +605,72 @@ func TestBuilderOnMainnetBlocks(t *testing.T) {
|
||||
&statediff.StateDiff{
|
||||
BlockNumber: block3.Number(),
|
||||
BlockHash: block3.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{ // How was this account created???
|
||||
Path: []byte{'\x0c', '\x0e', '\x05', '\x07', '\x03'},
|
||||
NodeType: statediff.Leaf,
|
||||
Storage: emptyStorage,
|
||||
LeafKey: common.HexToHash("ce573ced93917e658d10e2d9009470dad72b63c898d173721194a12f2ae5e190").Bytes(),
|
||||
NodeValue: block3MovedPremineLeafNode1,
|
||||
Path: []byte{'\x0c', '\x0e', '\x05', '\x07', '\x03'},
|
||||
NodeType: statediff.Leaf,
|
||||
StorageDiffs: emptyStorage,
|
||||
LeafKey: common.HexToHash("ce573ced93917e658d10e2d9009470dad72b63c898d173721194a12f2ae5e190").Bytes(),
|
||||
NodeValue: block3MovedPremineLeafNode1,
|
||||
},
|
||||
{ // This account (leaf) used to be at 0c 0e 05 07, not sure why it moves...
|
||||
Path: []byte{'\x0c', '\x0e', '\x05', '\x07', '\x08'},
|
||||
NodeType: statediff.Leaf,
|
||||
Storage: emptyStorage,
|
||||
LeafKey: common.HexToHash("ce5783bc1e69eedf90f402e11f6862da14ed8e50156635a04d6393bbae154012").Bytes(),
|
||||
NodeValue: block3MovedPremineLeafNode2,
|
||||
Path: []byte{'\x0c', '\x0e', '\x05', '\x07', '\x08'},
|
||||
NodeType: statediff.Leaf,
|
||||
StorageDiffs: emptyStorage,
|
||||
LeafKey: common.HexToHash("ce5783bc1e69eedf90f402e11f6862da14ed8e50156635a04d6393bbae154012").Bytes(),
|
||||
NodeValue: block3MovedPremineLeafNode2,
|
||||
},
|
||||
{ // this is the new account created due to the coinbase mining a block, it's creation shouldn't affect 0x 0e 05 07
|
||||
Path: []byte{'\x06', '\x0e', '\x0f'},
|
||||
NodeType: statediff.Leaf,
|
||||
Storage: emptyStorage,
|
||||
LeafKey: block3CoinbaseHash.Bytes(),
|
||||
NodeValue: block3CoinbaseLeafNode,
|
||||
Path: []byte{'\x06', '\x0e', '\x0f'},
|
||||
NodeType: statediff.Leaf,
|
||||
StorageDiffs: emptyStorage,
|
||||
LeafKey: block3CoinbaseHash.Bytes(),
|
||||
NodeValue: block3CoinbaseLeafNode,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: emptyAccounts,
|
||||
UpdatedAccounts: []statediff.AccountDiff{
|
||||
DeletedNodes: emptyAccounts,
|
||||
UpdatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block3RootBranchNode,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block3RootBranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block3x06BranchNode,
|
||||
Path: []byte{'\x06'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block3x06BranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x06', '\x0e'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block3x060eBranchNode,
|
||||
Path: []byte{'\x06', '\x0e'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block3x060eBranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block3x0cBranchNode,
|
||||
Path: []byte{'\x0c'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block3x0cBranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c', '\x0e'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block3x0c0eBranchNode,
|
||||
Path: []byte{'\x0c', '\x0e'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block3x0c0eBranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c', '\x0e', '\x05'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block3x0c0e05BranchNode,
|
||||
Path: []byte{'\x0c', '\x0e', '\x05'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block3x0c0e05BranchNode,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0c', '\x0e', '\x05', '\x07'},
|
||||
NodeType: statediff.Branch,
|
||||
Storage: emptyStorage,
|
||||
NodeValue: block3x0c0e0507BranchNode,
|
||||
Path: []byte{'\x0c', '\x0e', '\x05', '\x07'},
|
||||
NodeType: statediff.Branch,
|
||||
StorageDiffs: emptyStorage,
|
||||
NodeValue: block3x0c0e0507BranchNode,
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -33,12 +33,12 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
emptyStorage = make([]statediff.StorageDiff, 0)
|
||||
emptyAccounts = make([]statediff.AccountDiff, 0)
|
||||
block0, block1 *types.Block
|
||||
minerLeafKey = testhelpers.AddressToLeafKey(common.HexToAddress("0x0"))
|
||||
emptyAccountDiffEventualMap = make([]statediff.AccountDiff, 0)
|
||||
account1, _ = rlp.EncodeToBytes(state.Account{
|
||||
emptyStorage = make([]statediff.StorageNode, 0)
|
||||
emptyAccounts = make([]statediff.StateNode, 0)
|
||||
block0, block1 *types.Block
|
||||
minerLeafKey = testhelpers.AddressToLeafKey(common.HexToAddress("0x0"))
|
||||
emptyStateNodeEventualMap = make([]statediff.StateNode, 0)
|
||||
account1, _ = rlp.EncodeToBytes(state.Account{
|
||||
Nonce: uint64(0),
|
||||
Balance: big.NewInt(10000),
|
||||
CodeHash: common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").Bytes(),
|
||||
@ -102,39 +102,39 @@ func testSubscriptionAPI(t *testing.T) {
|
||||
expectedStateDiff := statediff.StateDiff{
|
||||
BlockNumber: block1.Number(),
|
||||
BlockHash: block1.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountLeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountLeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountLeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountLeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: []statediff.AccountDiff{ // This leaf appears to be deleted since it is turned into a branch node
|
||||
DeletedNodes: []statediff.StateNode{ // This leaf appears to be deleted since it is turned into a branch node
|
||||
{ // It would instead show up in the UpdateAccounts as new branch node IF intermediate node diffing was turned on (as it is in the test below)
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock0LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Removed,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: []byte{},
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
}
|
||||
expectedStateDiffBytes, _ := rlp.EncodeToBytes(expectedStateDiff)
|
||||
blockChan := make(chan *types.Block)
|
||||
@ -201,39 +201,39 @@ func testHTTPAPI(t *testing.T) {
|
||||
expectedStateDiff := statediff.StateDiff{
|
||||
BlockNumber: block1.Number(),
|
||||
BlockHash: block1.Hash(),
|
||||
CreatedAccounts: []statediff.AccountDiff{
|
||||
CreatedNodes: []statediff.StateNode{
|
||||
{
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountLeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x05'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: minerLeafKey,
|
||||
NodeValue: minerAccountLeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x0e'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.Account1LeafKey,
|
||||
NodeValue: account1LeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
{
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountLeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{'\x00'},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountLeafNode,
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
DeletedAccounts: []statediff.AccountDiff{ // This leaf appears to be deleted since it is turned into a branch node
|
||||
DeletedNodes: []statediff.StateNode{ // This leaf appears to be deleted since it is turned into a branch node
|
||||
{ // It would instead show up in the UpdateAccounts as new branch node IF intermediate node diffing was turned on (as it is in the test below)
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Leaf,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: bankAccountAtBlock0LeafNode,
|
||||
Storage: emptyStorage,
|
||||
Path: []byte{},
|
||||
NodeType: statediff.Removed,
|
||||
LeafKey: testhelpers.BankLeafKey,
|
||||
NodeValue: []byte{},
|
||||
StorageDiffs: emptyStorage,
|
||||
},
|
||||
},
|
||||
UpdatedAccounts: emptyAccounts,
|
||||
UpdatedNodes: emptyAccounts,
|
||||
}
|
||||
expectedStateDiffBytes, _ := rlp.EncodeToBytes(expectedStateDiff)
|
||||
config := statediff.Config{
|
||||
|
@ -65,27 +65,27 @@ func (sd *Payload) Encode() ([]byte, error) {
|
||||
|
||||
// StateDiff is the final output structure from the builder
|
||||
type StateDiff struct {
|
||||
BlockNumber *big.Int `json:"blockNumber" gencodec:"required"`
|
||||
BlockHash common.Hash `json:"blockHash" gencodec:"required"`
|
||||
CreatedAccounts []AccountDiff `json:"createdAccounts" gencodec:"required"`
|
||||
DeletedAccounts []AccountDiff `json:"deletedAccounts" gencodec:"required"`
|
||||
UpdatedAccounts []AccountDiff `json:"updatedAccounts" gencodec:"required"`
|
||||
BlockNumber *big.Int `json:"blockNumber" gencodec:"required"`
|
||||
BlockHash common.Hash `json:"blockHash" gencodec:"required"`
|
||||
CreatedNodes []StateNode `json:"createdAccounts" gencodec:"required"`
|
||||
DeletedNodes []StateNode `json:"deletedAccounts" gencodec:"required"`
|
||||
UpdatedNodes []StateNode `json:"updatedAccounts" gencodec:"required"`
|
||||
|
||||
encoded []byte
|
||||
err error
|
||||
}
|
||||
|
||||
// AccountDiff holds the data for a single state diff node
|
||||
type AccountDiff struct {
|
||||
NodeType NodeType `json:"nodeType" gencodec:"required"`
|
||||
Path []byte `json:"path" gencodec:"required"`
|
||||
NodeValue []byte `json:"value" gencodec:"required"`
|
||||
Storage []StorageDiff `json:"storage"`
|
||||
LeafKey []byte `json:"leafKey"`
|
||||
// StateNode holds the data for a single state diff node
|
||||
type StateNode struct {
|
||||
NodeType NodeType `json:"nodeType" gencodec:"required"`
|
||||
Path []byte `json:"path" gencodec:"required"`
|
||||
NodeValue []byte `json:"value" gencodec:"required"`
|
||||
StorageDiffs []StorageNode `json:"storage"`
|
||||
LeafKey []byte `json:"leafKey"`
|
||||
}
|
||||
|
||||
// StorageDiff holds the data for a single storage diff node
|
||||
type StorageDiff struct {
|
||||
// StorageNode holds the data for a single storage diff node
|
||||
type StorageNode struct {
|
||||
NodeType NodeType `json:"nodeType" gencodec:"required"`
|
||||
Path []byte `json:"path" gencodec:"required"`
|
||||
NodeValue []byte `json:"value" gencodec:"required"`
|
||||
@ -112,4 +112,5 @@ const (
|
||||
Leaf NodeType = "Leaf"
|
||||
Extension NodeType = "Extension"
|
||||
Branch NodeType = "Branch"
|
||||
Removed NodeType = "Removed" // used to represent nodes which have been deleted (e.g. accounts due to EIp-158)
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user