support for total difficulty (needed to support some eth endpoints)
This commit is contained in:
+16
-18
@@ -45,17 +45,18 @@ func NewPayloadConverter(chainConfig *params.ChainConfig) *Converter {
|
||||
func (pc *Converter) Convert(payload statediff.Payload) (*IPLDPayload, error) {
|
||||
// Unpack block rlp to access fields
|
||||
block := new(types.Block)
|
||||
decodeErr := rlp.DecodeBytes(payload.BlockRlp, block)
|
||||
if decodeErr != nil {
|
||||
return nil, decodeErr
|
||||
err := rlp.DecodeBytes(payload.BlockRlp, block)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
header := block.Header()
|
||||
headerRlp, encodeErr := rlp.EncodeToBytes(header)
|
||||
if encodeErr != nil {
|
||||
return nil, encodeErr
|
||||
headerRlp, err := rlp.EncodeToBytes(header)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
trxLen := len(block.Transactions())
|
||||
convertedPayload := &IPLDPayload{
|
||||
TotalDifficulty: payload.TotalDifficulty,
|
||||
BlockHash: block.Hash(),
|
||||
BlockNumber: block.Number(),
|
||||
HeaderRLP: headerRlp,
|
||||
@@ -70,9 +71,9 @@ func (pc *Converter) Convert(payload statediff.Payload) (*IPLDPayload, error) {
|
||||
transactions := block.Transactions()
|
||||
for _, trx := range transactions {
|
||||
// Extract to and from data from the the transactions for indexing
|
||||
from, senderErr := types.Sender(signer, trx)
|
||||
if senderErr != nil {
|
||||
return nil, senderErr
|
||||
from, err := types.Sender(signer, trx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
txMeta := &TrxMetaData{
|
||||
Dst: handleNullAddr(trx.To()),
|
||||
@@ -84,14 +85,12 @@ func (pc *Converter) Convert(payload statediff.Payload) (*IPLDPayload, error) {
|
||||
|
||||
// Decode receipts for this block
|
||||
receipts := make(types.Receipts, 0)
|
||||
decodeErr = rlp.DecodeBytes(payload.ReceiptsRlp, &receipts)
|
||||
if decodeErr != nil {
|
||||
return nil, decodeErr
|
||||
if err := rlp.DecodeBytes(payload.ReceiptsRlp, &receipts); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// Derive any missing fields
|
||||
deriveErr := receipts.DeriveFields(pc.chainConfig, block.Hash(), block.NumberU64(), block.Transactions())
|
||||
if deriveErr != nil {
|
||||
return nil, deriveErr
|
||||
if err := receipts.DeriveFields(pc.chainConfig, block.Hash(), block.NumberU64(), block.Transactions()); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i, receipt := range receipts {
|
||||
// If the transaction for this receipt has a "to" address, the above DeriveFields() fails to assign it to the receipt's ContractAddress
|
||||
@@ -118,9 +117,8 @@ func (pc *Converter) Convert(payload statediff.Payload) (*IPLDPayload, error) {
|
||||
|
||||
// Unpack state diff rlp to access fields
|
||||
stateDiff := new(statediff.StateDiff)
|
||||
decodeErr = rlp.DecodeBytes(payload.StateDiffRlp, stateDiff)
|
||||
if decodeErr != nil {
|
||||
return nil, decodeErr
|
||||
if err = rlp.DecodeBytes(payload.StateDiffRlp, stateDiff); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for _, createdAccount := range stateDiff.CreatedAccounts {
|
||||
hashKey := common.BytesToHash(createdAccount.Key)
|
||||
|
||||
@@ -36,6 +36,7 @@ var _ = Describe("Converter", func() {
|
||||
Expect(converterPayload.BlockHash).To(Equal(mocks.MockBlock.Hash()))
|
||||
Expect(converterPayload.StateNodes).To(Equal(mocks.MockStateNodes))
|
||||
Expect(converterPayload.StorageNodes).To(Equal(mocks.MockStorageNodes))
|
||||
Expect(converterPayload.TotalDifficulty.Int64()).To(Equal(mocks.MockStateDiffPayload.TotalDifficulty.Int64()))
|
||||
gotBody, err := rlp.EncodeToBytes(converterPayload.BlockBody)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
expectedBody, err := rlp.EncodeToBytes(mocks.MockBlock.Body())
|
||||
|
||||
+15
-12
@@ -161,17 +161,19 @@ var (
|
||||
|
||||
// aggregate payloads
|
||||
MockStateDiffPayload = statediff.Payload{
|
||||
BlockRlp: MockBlockRlp,
|
||||
StateDiffRlp: MockStateDiffBytes,
|
||||
ReceiptsRlp: ReceiptsRlp,
|
||||
BlockRlp: MockBlockRlp,
|
||||
StateDiffRlp: MockStateDiffBytes,
|
||||
ReceiptsRlp: ReceiptsRlp,
|
||||
TotalDifficulty: big.NewInt(1337),
|
||||
}
|
||||
|
||||
MockIPLDPayload = &ipfs.IPLDPayload{
|
||||
BlockNumber: big.NewInt(1),
|
||||
BlockHash: MockBlock.Hash(),
|
||||
Receipts: MockReceipts,
|
||||
HeaderRLP: MockHeaderRlp,
|
||||
BlockBody: MockBlock.Body(),
|
||||
TotalDifficulty: big.NewInt(1337),
|
||||
BlockNumber: big.NewInt(1),
|
||||
BlockHash: MockBlock.Hash(),
|
||||
Receipts: MockReceipts,
|
||||
HeaderRLP: MockHeaderRlp,
|
||||
BlockBody: MockBlock.Body(),
|
||||
TrxMetaData: []*ipfs.TrxMetaData{
|
||||
{
|
||||
CID: "",
|
||||
@@ -205,10 +207,11 @@ var (
|
||||
}
|
||||
|
||||
MockCIDPayload = &ipfs.CIDPayload{
|
||||
BlockNumber: "1",
|
||||
BlockHash: MockBlock.Hash(),
|
||||
HeaderCID: "mockHeaderCID",
|
||||
UncleCIDs: make(map[common.Hash]string),
|
||||
TotalDifficulty: "1337",
|
||||
BlockNumber: "1",
|
||||
BlockHash: MockBlock.Hash(),
|
||||
HeaderCID: "mockHeaderCID",
|
||||
UncleCIDs: make(map[common.Hash]string),
|
||||
TransactionCIDs: map[common.Hash]*ipfs.TrxMetaData{
|
||||
MockTransactions[0].Hash(): {
|
||||
CID: "mockTrxCID1",
|
||||
|
||||
+22
-21
@@ -63,51 +63,52 @@ func NewIPLDPublisher(ipfsPath string) (*Publisher, error) {
|
||||
// Publish publishes an IPLDPayload to IPFS and returns the corresponding CIDPayload
|
||||
func (pub *Publisher) Publish(payload *IPLDPayload) (*CIDPayload, error) {
|
||||
// Process and publish headers
|
||||
headerCid, headersErr := pub.publishHeaders(payload.HeaderRLP)
|
||||
if headersErr != nil {
|
||||
return nil, headersErr
|
||||
headerCid, err := pub.publishHeaders(payload.HeaderRLP)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Process and publish uncles
|
||||
uncleCids := make(map[common.Hash]string)
|
||||
for _, uncle := range payload.BlockBody.Uncles {
|
||||
uncleRlp, encodeErr := rlp.EncodeToBytes(uncle)
|
||||
if encodeErr != nil {
|
||||
return nil, encodeErr
|
||||
uncleRlp, err := rlp.EncodeToBytes(uncle)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
cid, unclesErr := pub.publishHeaders(uncleRlp)
|
||||
if unclesErr != nil {
|
||||
return nil, unclesErr
|
||||
cid, err := pub.publishHeaders(uncleRlp)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
uncleCids[uncle.Hash()] = cid
|
||||
}
|
||||
|
||||
// Process and publish transactions
|
||||
transactionCids, trxsErr := pub.publishTransactions(payload.BlockBody, payload.TrxMetaData)
|
||||
if trxsErr != nil {
|
||||
return nil, trxsErr
|
||||
transactionCids, err := pub.publishTransactions(payload.BlockBody, payload.TrxMetaData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Process and publish receipts
|
||||
receiptsCids, rctsErr := pub.publishReceipts(payload.Receipts, payload.ReceiptMetaData)
|
||||
if rctsErr != nil {
|
||||
return nil, rctsErr
|
||||
receiptsCids, err := pub.publishReceipts(payload.Receipts, payload.ReceiptMetaData)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Process and publish state leafs
|
||||
stateNodeCids, stateErr := pub.publishStateNodes(payload.StateNodes)
|
||||
if stateErr != nil {
|
||||
return nil, stateErr
|
||||
stateNodeCids, err := pub.publishStateNodes(payload.StateNodes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Process and publish storage leafs
|
||||
storageNodeCids, storageErr := pub.publishStorageNodes(payload.StorageNodes)
|
||||
if storageErr != nil {
|
||||
return nil, storageErr
|
||||
storageNodeCids, err := pub.publishStorageNodes(payload.StorageNodes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Package CIDs and their metadata into a single struct
|
||||
return &CIDPayload{
|
||||
TotalDifficulty: payload.TotalDifficulty.String(),
|
||||
BlockHash: payload.BlockHash,
|
||||
BlockNumber: payload.BlockNumber.String(),
|
||||
HeaderCID: headerCid,
|
||||
|
||||
@@ -63,6 +63,7 @@ var _ = Describe("Publisher", func() {
|
||||
}
|
||||
cidPayload, err := publisher.Publish(mocks.MockIPLDPayload)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(cidPayload.TotalDifficulty).To(Equal(mocks.MockIPLDPayload.TotalDifficulty.String()))
|
||||
Expect(cidPayload.BlockNumber).To(Equal(mocks.MockCIDPayload.BlockNumber))
|
||||
Expect(cidPayload.BlockHash).To(Equal(mocks.MockCIDPayload.BlockHash))
|
||||
Expect(cidPayload.UncleCIDs).To(Equal(mocks.MockCIDPayload.UncleCIDs))
|
||||
|
||||
@@ -49,6 +49,7 @@ type IPLDWrapper struct {
|
||||
// IPLDPayload is a custom type which packages raw ETH data for the IPFS publisher
|
||||
type IPLDPayload struct {
|
||||
HeaderRLP []byte
|
||||
TotalDifficulty *big.Int
|
||||
BlockNumber *big.Int
|
||||
BlockHash common.Hash
|
||||
BlockBody *types.Body
|
||||
@@ -76,6 +77,7 @@ type StorageNode struct {
|
||||
type CIDPayload struct {
|
||||
BlockNumber string
|
||||
BlockHash common.Hash
|
||||
TotalDifficulty string
|
||||
HeaderCID string
|
||||
UncleCIDs map[common.Hash]string
|
||||
TransactionCIDs map[common.Hash]*TrxMetaData
|
||||
|
||||
Reference in New Issue
Block a user