Skip to content

Commit c7bfb7e

Browse files
committed
include total difficulty to the payload
1 parent 6e05b78 commit c7bfb7e

File tree

5 files changed

+127
-77
lines changed

5 files changed

+127
-77
lines changed

statediff/service.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package statediff
1919
import (
2020
"bytes"
2121
"fmt"
22+
"math/big"
2223
"sync"
2324
"sync/atomic"
2425

@@ -42,6 +43,7 @@ type blockChain interface {
4243
GetBlockByNumber(number uint64) *types.Block
4344
AddToStateDiffProcessedCollection(hash common.Hash)
4445
GetReceiptsByHash(hash common.Hash) types.Receipts
46+
GetTdByHash(hash common.Hash) *big.Int
4547
}
4648

4749
// IService is the state-diffing service interface
@@ -172,6 +174,7 @@ func (sds *Service) processStateDiff(currentBlock, parentBlock *types.Block) (*P
172174
return nil, err
173175
}
174176
payload.BlockRlp = blockBuff.Bytes()
177+
payload.TotalDifficulty = sds.BlockChain.GetTdByHash(currentBlock.Hash())
175178
receiptBuff := new(bytes.Buffer)
176179
receipts := sds.BlockChain.GetReceiptsByHash(currentBlock.Hash())
177180
if err = rlp.Encode(receiptBuff, receipts); err != nil {

statediff/testhelpers/mocks/api.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ func (sds *MockStateDiffService) processStateDiff(currentBlock, parentBlock *typ
112112
return nil, err
113113
}
114114
payload.BlockRlp = rlpBuff.Bytes()
115+
payload.TotalDifficulty = sds.BlockChain.GetTdByHash(currentBlock.Hash())
116+
receiptBuff := new(bytes.Buffer)
117+
receipts := sds.BlockChain.GetReceiptsByHash(currentBlock.Hash())
118+
if err = rlp.Encode(receiptBuff, receipts); err != nil {
119+
return nil, err
120+
}
121+
payload.ReceiptsRlp = receiptBuff.Bytes()
115122
}
116123
return &payload, nil
117124
}

statediff/testhelpers/mocks/api_test.go

Lines changed: 97 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -32,63 +32,49 @@ import (
3232
"github.com/ethereum/go-ethereum/statediff/testhelpers"
3333
)
3434

35-
var block0, block1 *types.Block
36-
var burnLeafKey = testhelpers.AddressToLeafKey(common.HexToAddress("0x0"))
37-
var emptyAccountDiffEventualMap = make([]statediff.AccountDiff, 0)
38-
var account1, _ = rlp.EncodeToBytes(state.Account{
39-
Nonce: uint64(0),
40-
Balance: big.NewInt(10000),
41-
CodeHash: common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").Bytes(),
42-
Root: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
43-
})
44-
var burnAccount1, _ = rlp.EncodeToBytes(state.Account{
45-
Nonce: uint64(0),
46-
Balance: big.NewInt(2000000000000000000),
47-
CodeHash: common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").Bytes(),
48-
Root: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
49-
})
50-
var bankAccount1, _ = rlp.EncodeToBytes(state.Account{
51-
Nonce: uint64(1),
52-
Balance: big.NewInt(testhelpers.TestBankFunds.Int64() - 10000),
53-
CodeHash: common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").Bytes(),
54-
Root: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
55-
})
35+
var (
36+
block0, block1 *types.Block
37+
burnLeafKey = testhelpers.AddressToLeafKey(common.HexToAddress("0x0"))
38+
emptyAccountDiffEventualMap = make([]statediff.AccountDiff, 0)
39+
account1, _ = rlp.EncodeToBytes(state.Account{
40+
Nonce: uint64(0),
41+
Balance: big.NewInt(10000),
42+
CodeHash: common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").Bytes(),
43+
Root: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
44+
})
45+
burnAccount1, _ = rlp.EncodeToBytes(state.Account{
46+
Nonce: uint64(0),
47+
Balance: big.NewInt(2000000000000000000),
48+
CodeHash: common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").Bytes(),
49+
Root: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
50+
})
51+
bankAccount1, _ = rlp.EncodeToBytes(state.Account{
52+
Nonce: uint64(1),
53+
Balance: big.NewInt(testhelpers.TestBankFunds.Int64() - 10000),
54+
CodeHash: common.HexToHash("0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470").Bytes(),
55+
Root: common.HexToHash("0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421"),
56+
})
57+
mockTotalDifficulty = big.NewInt(1337)
58+
)
5659

5760
func TestAPI(t *testing.T) {
5861
testSubscriptionAPI(t)
5962
testHTTPAPI(t)
6063
}
64+
6165
func testSubscriptionAPI(t *testing.T) {
6266
_, blockMap, chain := testhelpers.MakeChain(3, testhelpers.Genesis)
6367
defer chain.Stop()
6468
block0Hash := common.HexToHash("0xd1721cfd0b29c36fd7a68f25c128e86413fb666a6e1d68e89b875bd299262661")
6569
block1Hash := common.HexToHash("0xbbe88de60ba33a3f18c0caa37d827bfb70252e19e40a07cd34041696c35ecb1a")
6670
block0 = blockMap[block0Hash]
6771
block1 = blockMap[block1Hash]
68-
blockChan := make(chan *types.Block)
69-
parentBlockChain := make(chan *types.Block)
70-
serviceQuitChan := make(chan bool)
71-
config := statediff.Config{
72-
PathsAndProofs: true,
73-
IntermediateNodes: false,
74-
}
75-
mockService := MockStateDiffService{
76-
Mutex: sync.Mutex{},
77-
Builder: statediff.NewBuilder(testhelpers.Testdb, chain, config),
78-
BlockChan: blockChan,
79-
ParentBlockChan: parentBlockChain,
80-
QuitChan: serviceQuitChan,
81-
Subscriptions: make(map[rpc.ID]statediff.Subscription),
82-
streamBlock: true,
83-
}
84-
mockService.Start(nil)
85-
id := rpc.NewID()
86-
payloadChan := make(chan statediff.Payload)
87-
quitChan := make(chan bool)
88-
mockService.Subscribe(id, payloadChan, quitChan)
89-
blockChan <- block1
90-
parentBlockChain <- block0
9172
expectedBlockRlp, _ := rlp.EncodeToBytes(block1)
73+
mockReceipt := &types.Receipt{
74+
BlockNumber: block1.Number(),
75+
BlockHash: block1.Hash(),
76+
}
77+
expectedReceiptBytes, _ := rlp.EncodeToBytes(types.Receipts{mockReceipt})
9278
expectedStateDiff := statediff.StateDiff{
9379
BlockNumber: block1.Number(),
9480
BlockHash: block1.Hash(),
@@ -125,20 +111,50 @@ func testSubscriptionAPI(t *testing.T) {
125111
},
126112
},
127113
}
128-
expectedStateDiffBytes, err := rlp.EncodeToBytes(expectedStateDiff)
129-
if err != nil {
130-
t.Error(err)
114+
expectedStateDiffBytes, _ := rlp.EncodeToBytes(expectedStateDiff)
115+
blockChan := make(chan *types.Block)
116+
parentBlockChain := make(chan *types.Block)
117+
serviceQuitChan := make(chan bool)
118+
config := statediff.Config{
119+
PathsAndProofs: true,
120+
IntermediateNodes: false,
131121
}
132-
sort.Slice(expectedStateDiffBytes, func(i, j int) bool { return expectedStateDiffBytes[i] < expectedStateDiffBytes[j] })
122+
mockBlockChain := &BlockChain{}
123+
mockBlockChain.SetReceiptsForHash(block1Hash, types.Receipts{mockReceipt})
124+
mockBlockChain.SetTdByHash(block1Hash, mockTotalDifficulty)
125+
mockService := MockStateDiffService{
126+
Mutex: sync.Mutex{},
127+
Builder: statediff.NewBuilder(testhelpers.Testdb, chain, config),
128+
BlockChan: blockChan,
129+
BlockChain: mockBlockChain,
130+
ParentBlockChan: parentBlockChain,
131+
QuitChan: serviceQuitChan,
132+
Subscriptions: make(map[rpc.ID]statediff.Subscription),
133+
streamBlock: true,
134+
}
135+
mockService.Start(nil)
136+
id := rpc.NewID()
137+
payloadChan := make(chan statediff.Payload)
138+
quitChan := make(chan bool)
139+
mockService.Subscribe(id, payloadChan, quitChan)
140+
blockChan <- block1
141+
parentBlockChain <- block0
133142

143+
sort.Slice(expectedStateDiffBytes, func(i, j int) bool { return expectedStateDiffBytes[i] < expectedStateDiffBytes[j] })
134144
select {
135145
case payload := <-payloadChan:
136146
if !bytes.Equal(payload.BlockRlp, expectedBlockRlp) {
137-
t.Errorf("payload does not have expected block\r\actual block rlp: %v\r\nexpected block rlp: %v", payload.BlockRlp, expectedBlockRlp)
147+
t.Errorf("payload does not have expected block\r\nactual block rlp: %v\r\nexpected block rlp: %v", payload.BlockRlp, expectedBlockRlp)
138148
}
139149
sort.Slice(payload.StateDiffRlp, func(i, j int) bool { return payload.StateDiffRlp[i] < payload.StateDiffRlp[j] })
140150
if !bytes.Equal(payload.StateDiffRlp, expectedStateDiffBytes) {
141-
t.Errorf("payload does not have expected state diff\r\actual state diff rlp: %v\r\nexpected state diff rlp: %v", payload.StateDiffRlp, expectedStateDiffBytes)
151+
t.Errorf("payload does not have expected state diff\r\nactual state diff rlp: %v\r\nexpected state diff rlp: %v", payload.StateDiffRlp, expectedStateDiffBytes)
152+
}
153+
if !bytes.Equal(expectedReceiptBytes, payload.ReceiptsRlp) {
154+
t.Errorf("payload does not have expected receipts\r\nactual receipt rlp: %v\r\nexpected receipt rlp: %v", payload.ReceiptsRlp, expectedReceiptBytes)
155+
}
156+
if !bytes.Equal(payload.TotalDifficulty.Bytes(), mockTotalDifficulty.Bytes()) {
157+
t.Errorf("payload does not have expected total difficulty\r\nactual td: %d\r\nexpected td: %d", payload.TotalDifficulty.Int64(), mockTotalDifficulty.Int64())
142158
}
143159
case <-quitChan:
144160
t.Errorf("channel quit before delivering payload")
@@ -152,27 +168,12 @@ func testHTTPAPI(t *testing.T) {
152168
block1Hash := common.HexToHash("0xbbe88de60ba33a3f18c0caa37d827bfb70252e19e40a07cd34041696c35ecb1a")
153169
block0 = blockMap[block0Hash]
154170
block1 = blockMap[block1Hash]
155-
config := statediff.Config{
156-
PathsAndProofs: true,
157-
IntermediateNodes: false,
158-
}
159-
mockBlockChain := &BlockChain{}
160-
mockBlockChain.SetBlocksForHashes(blockMap)
161-
mockBlockChain.SetBlockForNumber(block1, block1.Number().Uint64())
162-
mockService := MockStateDiffService{
163-
Mutex: sync.Mutex{},
164-
Builder: statediff.NewBuilder(testhelpers.Testdb, chain, config),
165-
BlockChain: mockBlockChain,
166-
streamBlock: true,
167-
}
168-
payload, err := mockService.StateDiffAt(block1.Number().Uint64())
169-
if err != nil {
170-
t.Error(err)
171-
}
172171
expectedBlockRlp, _ := rlp.EncodeToBytes(block1)
173-
if !bytes.Equal(payload.BlockRlp, expectedBlockRlp) {
174-
t.Errorf("payload does not have expected block\r\actual block rlp: %v\r\nexpected block rlp: %v", payload.BlockRlp, expectedBlockRlp)
172+
mockReceipt := &types.Receipt{
173+
BlockNumber: block1.Number(),
174+
BlockHash: block1.Hash(),
175175
}
176+
expectedReceiptBytes, _ := rlp.EncodeToBytes(types.Receipts{mockReceipt})
176177
expectedStateDiff := statediff.StateDiff{
177178
BlockNumber: block1.Number(),
178179
BlockHash: block1.Hash(),
@@ -209,13 +210,38 @@ func testHTTPAPI(t *testing.T) {
209210
},
210211
},
211212
}
212-
expectedStateDiffBytes, err := rlp.EncodeToBytes(expectedStateDiff)
213+
expectedStateDiffBytes, _ := rlp.EncodeToBytes(expectedStateDiff)
214+
config := statediff.Config{
215+
PathsAndProofs: true,
216+
IntermediateNodes: false,
217+
}
218+
mockBlockChain := &BlockChain{}
219+
mockBlockChain.SetBlocksForHashes(blockMap)
220+
mockBlockChain.SetBlockForNumber(block1, block1.Number().Uint64())
221+
mockBlockChain.SetReceiptsForHash(block1Hash, types.Receipts{mockReceipt})
222+
mockBlockChain.SetTdByHash(block1Hash, big.NewInt(1337))
223+
mockService := MockStateDiffService{
224+
Mutex: sync.Mutex{},
225+
Builder: statediff.NewBuilder(testhelpers.Testdb, chain, config),
226+
BlockChain: mockBlockChain,
227+
streamBlock: true,
228+
}
229+
payload, err := mockService.StateDiffAt(block1.Number().Uint64())
213230
if err != nil {
214231
t.Error(err)
215232
}
216233
sort.Slice(payload.StateDiffRlp, func(i, j int) bool { return payload.StateDiffRlp[i] < payload.StateDiffRlp[j] })
217234
sort.Slice(expectedStateDiffBytes, func(i, j int) bool { return expectedStateDiffBytes[i] < expectedStateDiffBytes[j] })
235+
if !bytes.Equal(payload.BlockRlp, expectedBlockRlp) {
236+
t.Errorf("payload does not have expected block\r\nactual block rlp: %v\r\nexpected block rlp: %v", payload.BlockRlp, expectedBlockRlp)
237+
}
218238
if !bytes.Equal(payload.StateDiffRlp, expectedStateDiffBytes) {
219-
t.Errorf("payload does not have expected state diff\r\actual state diff rlp: %v\r\nexpected state diff rlp: %v", payload.StateDiffRlp, expectedStateDiffBytes)
239+
t.Errorf("payload does not have expected state diff\r\nactual state diff rlp: %v\r\nexpected state diff rlp: %v", payload.StateDiffRlp, expectedStateDiffBytes)
240+
}
241+
if !bytes.Equal(expectedReceiptBytes, payload.ReceiptsRlp) {
242+
t.Errorf("payload does not have expected receipts\r\nactual receipt rlp: %v\r\nexpected receipt rlp: %v", payload.ReceiptsRlp, expectedReceiptBytes)
243+
}
244+
if !bytes.Equal(payload.TotalDifficulty.Bytes(), mockTotalDifficulty.Bytes()) {
245+
t.Errorf("paylaod does not have the expected total difficulty\r\nactual td: %d\r\nexpected td: %d", payload.TotalDifficulty.Int64(), mockTotalDifficulty.Int64())
220246
}
221247
}

statediff/testhelpers/mocks/blockchain.go

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ package mocks
1818

1919
import (
2020
"errors"
21-
21+
"math/big"
2222
"time"
2323

2424
"github.com/ethereum/go-ethereum/common"
@@ -35,6 +35,7 @@ type BlockChain struct {
3535
callCount int
3636
ChainEvents []core.ChainEvent
3737
Receipts map[common.Hash]types.Receipts
38+
TDByHash map[common.Hash]*big.Int
3839
}
3940

4041
// AddToStateDiffProcessedCollection mock method
@@ -89,7 +90,7 @@ func (blockChain *BlockChain) SubscribeChainEvent(ch chan<- core.ChainEvent) eve
8990
return subscription
9091
}
9192

92-
// SetReceiptsForHash mock method
93+
// SetReceiptsForHash test method
9394
func (blockChain *BlockChain) SetReceiptsForHash(hash common.Hash, receipts types.Receipts) {
9495
if blockChain.Receipts == nil {
9596
blockChain.Receipts = make(map[common.Hash]types.Receipts)
@@ -102,7 +103,7 @@ func (blockChain *BlockChain) GetReceiptsByHash(hash common.Hash) types.Receipts
102103
return blockChain.Receipts[hash]
103104
}
104105

105-
// SetBlockForNumber mock method
106+
// SetBlockForNumber test method
106107
func (blockChain *BlockChain) SetBlockForNumber(block *types.Block, number uint64) {
107108
if blockChain.blocksToReturnByNumber == nil {
108109
blockChain.blocksToReturnByNumber = make(map[uint64]*types.Block)
@@ -114,3 +115,15 @@ func (blockChain *BlockChain) SetBlockForNumber(block *types.Block, number uint6
114115
func (blockChain *BlockChain) GetBlockByNumber(number uint64) *types.Block {
115116
return blockChain.blocksToReturnByNumber[number]
116117
}
118+
119+
// GetTdByHash mock method
120+
func (blockChain *BlockChain) GetTdByHash(hash common.Hash) *big.Int {
121+
return blockChain.TDByHash[hash]
122+
}
123+
124+
func (blockChain *BlockChain) SetTdByHash(hash common.Hash, td *big.Int) {
125+
if blockChain.TDByHash == nil {
126+
blockChain.TDByHash = make(map[common.Hash]*big.Int)
127+
}
128+
blockChain.TDByHash[hash] = td
129+
}

statediff/types.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ type Subscription struct {
3636

3737
// Payload packages the data to send to statediff subscriptions
3838
type Payload struct {
39-
BlockRlp []byte `json:"blockRlp"`
40-
ReceiptsRlp []byte `json:"receiptsRlp"`
41-
StateDiffRlp []byte `json:"stateDiff" gencodec:"required"`
39+
BlockRlp []byte `json:"blockRlp"`
40+
TotalDifficulty *big.Int `json:"totalDifficulty"`
41+
ReceiptsRlp []byte `json:"receiptsRlp"`
42+
StateDiffRlp []byte `json:"stateDiff" gencodec:"required"`
4243

4344
encoded []byte
4445
err error

0 commit comments

Comments
 (0)