Commit 17494c8a authored by vicotor's avatar vicotor

update block

parent c26224df
...@@ -7,6 +7,7 @@ import ( ...@@ -7,6 +7,7 @@ import (
"github.com/ethereum/go-ethereum/event" "github.com/ethereum/go-ethereum/event"
"github.com/exchain/go-exchain/exchain" "github.com/exchain/go-exchain/exchain"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1" nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"github.com/exchain/go-exchain/exchain/wrapper"
"github.com/exchain/go-exchain/metadb" "github.com/exchain/go-exchain/metadb"
"github.com/exchain/go-exchain/metadb/memdb" "github.com/exchain/go-exchain/metadb/memdb"
"github.com/exchain/go-exchain/op-service/grouptask" "github.com/exchain/go-exchain/op-service/grouptask"
...@@ -72,7 +73,7 @@ func NewChainDB(database metadb.Database) ChainDB { ...@@ -72,7 +73,7 @@ func NewChainDB(database metadb.Database) ChainDB {
} }
type chainData struct { type chainData struct {
block *nebulav1.Block block *wrapper.BlkWrapper
receipts *nebulav1.TransactionReceiptList receipts *nebulav1.TransactionReceiptList
} }
...@@ -245,11 +246,12 @@ func (m *chaindb) chainDataSaveTask() { ...@@ -245,11 +246,12 @@ func (m *chaindb) chainDataSaveTask() {
// 6. save block accounts // 6. save block accounts
// 7. save chain height // 7. save chain height
block := data.block block := data.block
log.Infof("save block with block number %d", block.Header.Height)
blockHash := common.BytesToHash(block.Header.Hash)
blockHeight := uint256.NewInt(block.Header.Height)
header := block.Header log.Infof("save block with block number %d", block.Height())
blockHash := block.Hash()
blockHeight := uint256.NewInt(block.Height())
header := block.Header()
{ {
t1 := time.Now() t1 := time.Now()
// save blockHash -> number.Bytes() // save blockHash -> number.Bytes()
...@@ -281,7 +283,7 @@ func (m *chaindb) chainDataSaveTask() { ...@@ -281,7 +283,7 @@ func (m *chaindb) chainDataSaveTask() {
t1 := time.Now() t1 := time.Now()
// save block body // save block body
bodyk := blockBodyKey(blockHeight) bodyk := blockBodyKey(blockHeight)
dbody, err := proto.Marshal(block) dbody, err := proto.Marshal(block.Block())
if err != nil { if err != nil {
log.Error("save block body", "err", err) log.Error("save block body", "err", err)
panic(fmt.Sprintf("save block body with err %v", err)) panic(fmt.Sprintf("save block body with err %v", err))
...@@ -324,7 +326,7 @@ func (m *chaindb) chainDataSaveTask() { ...@@ -324,7 +326,7 @@ func (m *chaindb) chainDataSaveTask() {
} }
t1 := time.Now() t1 := time.Now()
batch := m.database.NewBatch() batch := m.database.NewBatch()
number := block.Header.Height number := block.Height()
{ {
sequence := func(receipts []*nebulav1.TransactionReceipt) []interface{} { sequence := func(receipts []*nebulav1.TransactionReceipt) []interface{} {
s := make([]interface{}, len(receipts)) s := make([]interface{}, len(receipts))
...@@ -466,18 +468,19 @@ func (m *chaindb) cacheBlockHeader(header *nebulav1.BlockHeader) error { ...@@ -466,18 +468,19 @@ func (m *chaindb) cacheBlockHeader(header *nebulav1.BlockHeader) error {
return nil return nil
} }
func (m *chaindb) cacheBlock(block *nebulav1.Block) error { func (m *chaindb) cacheBlock(wBlk *wrapper.BlkWrapper) error {
k := blockBodyKey(uint256.NewInt(block.Header.Height)) k := blockBodyKey(uint256.NewInt(wBlk.Height()))
m.cache.Set(k, block) m.cache.Set(k, wBlk.Block())
return nil return nil
} }
func (m *chaindb) cacheBlockNumber(block *nebulav1.Block) error { func (m *chaindb) cacheBlockNumber(wBlk *wrapper.BlkWrapper) error {
k := blockNumKey(common.BytesToHash(block.Header.Hash)) k := blockNumKey(wBlk.Hash())
number := uint256.NewInt(block.Header.Height) number := uint256.NewInt(wBlk.Height())
m.cache.Set(k, number) m.cache.Set(k, number)
return nil return nil
} }
func (m *chaindb) cacheBlockTxsInfo(txs *nebulav1.TransactionList, rs *nebulav1.TransactionReceiptList) error { func (m *chaindb) cacheBlockTxsInfo(txs *nebulav1.TransactionList, rs *nebulav1.TransactionReceiptList) error {
if txs == nil || rs == nil { if txs == nil || rs == nil {
return nil return nil
...@@ -572,8 +575,10 @@ func (m *chaindb) SaveBlockHeader(header *nebulav1.BlockHeader) error { ...@@ -572,8 +575,10 @@ func (m *chaindb) SaveBlockHeader(header *nebulav1.BlockHeader) error {
} }
func (m *chaindb) SaveBlockData(block *nebulav1.Block, rs *nebulav1.TransactionReceiptList) error { func (m *chaindb) SaveBlockData(block *nebulav1.Block, rs *nebulav1.TransactionReceiptList) error {
wblk := wrapper.NewBlkWrapper(block)
m.cacheBlockHeader(block.Header) m.cacheBlockHeader(block.Header)
m.cacheBlock(block) m.cacheBlock(wblk)
m.cacheBlockNumber(wblk)
wg := sync.WaitGroup{} wg := sync.WaitGroup{}
...@@ -589,7 +594,7 @@ func (m *chaindb) SaveBlockData(block *nebulav1.Block, rs *nebulav1.TransactionR ...@@ -589,7 +594,7 @@ func (m *chaindb) SaveBlockData(block *nebulav1.Block, rs *nebulav1.TransactionR
wg.Wait() wg.Wait()
data := chainData{ data := chainData{
block: block, block: wblk,
receipts: rs, receipts: rs,
} }
m.toStoreChainData(data) m.toStoreChainData(data)
......
...@@ -14,15 +14,14 @@ type Engine interface { ...@@ -14,15 +14,14 @@ type Engine interface {
} }
type PayloadParams struct { type PayloadParams struct {
ParentRoot *common.Hash
Timestamp uint64 Timestamp uint64
Proposer common.Address Proposer common.Address
L1Info L1BlockInfo
Transactions nebulav1.TransactionList Transactions nebulav1.TransactionList
Signer Signer Signer Signer
} }
type ExecutionResult struct { type ExecutionResult struct {
ParentRoot common.Hash
Payload *nebulav1.Block Payload *nebulav1.Block
Receipts nebulav1.TransactionReceiptList Receipts nebulav1.TransactionReceiptList
} }
...@@ -69,15 +69,16 @@ func (g *GenesisBlock) ToBlock() *nebulav1.Block { ...@@ -69,15 +69,16 @@ func (g *GenesisBlock) ToBlock() *nebulav1.Block {
ParentHash: common.Hash{}.Bytes(), ParentHash: common.Hash{}.Bytes(),
Timestamp: g.Timestamp, Timestamp: g.Timestamp,
Proposer: genesisSigner.Bytes(), Proposer: genesisSigner.Bytes(),
L1Hash: common.Hash{}.Bytes(),
AppRoot: common.Hash{}.Bytes(), AppRoot: common.Hash{}.Bytes(),
L1Hash: common.Hash{}.Bytes(),
L1Height: 0,
SequenceNumber: 0,
}, },
Transactions: &nebulav1.TransactionList{}, Transactions: &nebulav1.TransactionList{},
} }
hash := BlockHash(blk) hash := BlockHash(blk)
signature, _ := crypto.Sign(hash.Bytes(), genesisSignerKey) signature, _ := crypto.Sign(hash.Bytes(), genesisSignerKey)
blk.Header.Signatures = signature blk.Header.Signature = signature
blk.Header.Hash = hash.Bytes()
return blk return blk
} }
...@@ -102,8 +103,9 @@ func BlockHash(blk *nebulav1.Block) common.Hash { ...@@ -102,8 +103,9 @@ func BlockHash(blk *nebulav1.Block) common.Hash {
data := make([]byte, 0) data := make([]byte, 0)
data = append(data, uint256.NewInt(blk.Header.Height).Bytes()...) data = append(data, uint256.NewInt(blk.Header.Height).Bytes()...)
data = append(data, uint256.NewInt(blk.Header.Timestamp).Bytes()...) data = append(data, uint256.NewInt(blk.Header.Timestamp).Bytes()...)
data = append(data, blk.Header.ParentHash...)
data = append(data, blk.Header.L1Hash...) data = append(data, blk.Header.L1Hash...)
data = append(data, uint256.NewInt(blk.Header.L1Height).Bytes()...)
data = append(data, blk.Header.ParentHash...)
data = append(data, blk.Header.AppRoot...) data = append(data, blk.Header.AppRoot...)
data = append(data, blk.Header.Proposer...) data = append(data, blk.Header.Proposer...)
txdata, _ := proto.Marshal(blk.Transactions) txdata, _ := proto.Marshal(blk.Transactions)
......
package exchain
import (
"github.com/ethereum/go-ethereum/common"
)
// L1BlockInfo presents the information stored in a L1Block.setL1BlockValues call
type L1BlockInfo struct {
Number uint64
Time uint64
BlockHash common.Hash
// Not strictly a piece of L1 information. Represents the number of L2 blocks since the start of the epoch,
// i.e. when the actual L1 info was first introduced.
SequenceNumber uint64
// BatcherAddr version 0 is just the address with 0 padding to the left.
BatcherAddr common.Address
}
...@@ -2,10 +2,10 @@ package mockengine ...@@ -2,10 +2,10 @@ package mockengine
import ( import (
"fmt" "fmt"
"github.com/ethereum/go-ethereum/common"
"github.com/exchain/go-exchain/exchain" "github.com/exchain/go-exchain/exchain"
"github.com/exchain/go-exchain/exchain/chaindb" "github.com/exchain/go-exchain/exchain/chaindb"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1" nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"github.com/exchain/go-exchain/exchain/wrapper"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
...@@ -22,13 +22,14 @@ func (m MockEngine) NewPayload(params exchain.PayloadParams) (exchain.ExecutionR ...@@ -22,13 +22,14 @@ func (m MockEngine) NewPayload(params exchain.PayloadParams) (exchain.ExecutionR
if err != nil { if err != nil {
return exchain.ExecutionResult{}, err return exchain.ExecutionResult{}, err
} }
root := params.ParentRoot wParent := wrapper.NewBlkWrapper(parent)
header := &nebulav1.BlockHeader{ header := &nebulav1.BlockHeader{
Height: parent.Header.Height + 1, Height: parent.Header.Height + 1,
ParentHash: parent.Header.Hash, ParentHash: wParent.Hash().Bytes(),
Timestamp: params.Timestamp, Timestamp: params.Timestamp,
L1Hash: params.ParentRoot.Bytes(),
Proposer: params.Proposer.Bytes(), Proposer: params.Proposer.Bytes(),
L1Hash: params.L1Info.BlockHash.Bytes(),
L1Height: params.L1Info.Number,
AppRoot: make([]byte, 0), AppRoot: make([]byte, 0),
} }
receipts, err := m.ProcessTx(header, params.Transactions) receipts, err := m.ProcessTx(header, params.Transactions)
...@@ -38,7 +39,6 @@ func (m MockEngine) NewPayload(params exchain.PayloadParams) (exchain.ExecutionR ...@@ -38,7 +39,6 @@ func (m MockEngine) NewPayload(params exchain.PayloadParams) (exchain.ExecutionR
} }
result := exchain.ExecutionResult{ result := exchain.ExecutionResult{
ParentRoot: *root,
Payload: &nebulav1.Block{ Payload: &nebulav1.Block{
Header: header, Header: header,
Transactions: &params.Transactions, Transactions: &params.Transactions,
...@@ -62,7 +62,6 @@ func (m MockEngine) ProcessPayload(block *nebulav1.Block) (exchain.ExecutionResu ...@@ -62,7 +62,6 @@ func (m MockEngine) ProcessPayload(block *nebulav1.Block) (exchain.ExecutionResu
} }
return exchain.ExecutionResult{ return exchain.ExecutionResult{
ParentRoot: common.BytesToHash(block.Header.L1Hash),
Payload: block, Payload: block,
Receipts: receipts, Receipts: receipts,
}, nil }, nil
......
...@@ -28,13 +28,14 @@ type BlockHeader struct { ...@@ -28,13 +28,14 @@ type BlockHeader struct {
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"` Height uint64 `protobuf:"varint,1,opt,name=height,proto3" json:"height,omitempty"`
Hash []byte `protobuf:"bytes,2,opt,name=hash,proto3" json:"hash,omitempty"` ParentHash []byte `protobuf:"bytes,2,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"`
ParentHash []byte `protobuf:"bytes,3,opt,name=parent_hash,json=parentHash,proto3" json:"parent_hash,omitempty"` Timestamp uint64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
Timestamp uint64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` L1Height uint64 `protobuf:"varint,4,opt,name=l1_height,json=l1Height,proto3" json:"l1_height,omitempty"`
L1Hash []byte `protobuf:"bytes,5,opt,name=l1_hash,json=l1Hash,proto3" json:"l1_hash,omitempty"` L1Hash []byte `protobuf:"bytes,5,opt,name=l1_hash,json=l1Hash,proto3" json:"l1_hash,omitempty"`
Proposer []byte `protobuf:"bytes,6,opt,name=proposer,proto3" json:"proposer,omitempty"` SequenceNumber uint64 `protobuf:"varint,6,opt,name=sequence_number,json=sequenceNumber,proto3" json:"sequence_number,omitempty"`
AppRoot []byte `protobuf:"bytes,7,opt,name=app_root,json=appRoot,proto3" json:"app_root,omitempty"` // used to verify block is valid. Proposer []byte `protobuf:"bytes,7,opt,name=proposer,proto3" json:"proposer,omitempty"`
Signatures []byte `protobuf:"bytes,8,opt,name=signatures,proto3" json:"signatures,omitempty"` // used to verify block is mint by proposer. AppRoot []byte `protobuf:"bytes,8,opt,name=app_root,json=appRoot,proto3" json:"app_root,omitempty"` // used to verify block is valid.
Signature []byte `protobuf:"bytes,9,opt,name=signature,proto3" json:"signature,omitempty"` // used to verify block is mint by proposer.
} }
func (x *BlockHeader) Reset() { func (x *BlockHeader) Reset() {
...@@ -76,13 +77,6 @@ func (x *BlockHeader) GetHeight() uint64 { ...@@ -76,13 +77,6 @@ func (x *BlockHeader) GetHeight() uint64 {
return 0 return 0
} }
func (x *BlockHeader) GetHash() []byte {
if x != nil {
return x.Hash
}
return nil
}
func (x *BlockHeader) GetParentHash() []byte { func (x *BlockHeader) GetParentHash() []byte {
if x != nil { if x != nil {
return x.ParentHash return x.ParentHash
...@@ -97,6 +91,13 @@ func (x *BlockHeader) GetTimestamp() uint64 { ...@@ -97,6 +91,13 @@ func (x *BlockHeader) GetTimestamp() uint64 {
return 0 return 0
} }
func (x *BlockHeader) GetL1Height() uint64 {
if x != nil {
return x.L1Height
}
return 0
}
func (x *BlockHeader) GetL1Hash() []byte { func (x *BlockHeader) GetL1Hash() []byte {
if x != nil { if x != nil {
return x.L1Hash return x.L1Hash
...@@ -104,6 +105,13 @@ func (x *BlockHeader) GetL1Hash() []byte { ...@@ -104,6 +105,13 @@ func (x *BlockHeader) GetL1Hash() []byte {
return nil return nil
} }
func (x *BlockHeader) GetSequenceNumber() uint64 {
if x != nil {
return x.SequenceNumber
}
return 0
}
func (x *BlockHeader) GetProposer() []byte { func (x *BlockHeader) GetProposer() []byte {
if x != nil { if x != nil {
return x.Proposer return x.Proposer
...@@ -118,9 +126,9 @@ func (x *BlockHeader) GetAppRoot() []byte { ...@@ -118,9 +126,9 @@ func (x *BlockHeader) GetAppRoot() []byte {
return nil return nil
} }
func (x *BlockHeader) GetSignatures() []byte { func (x *BlockHeader) GetSignature() []byte {
if x != nil { if x != nil {
return x.Signatures return x.Signature
} }
return nil return nil
} }
...@@ -191,21 +199,24 @@ var file_nebula_v1_block_proto_rawDesc = []byte{ ...@@ -191,21 +199,24 @@ var file_nebula_v1_block_proto_rawDesc = []byte{
0x62, 0x75, 0x6c, 0x61, 0x2f, 0x65, 0x78, 0x74, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x62, 0x75, 0x6c, 0x61, 0x2f, 0x65, 0x78, 0x74, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x6e, 0x65, 0x62, 0x75, 0x6c, 0x61, 0x2f, 0x76, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x6e, 0x65, 0x62, 0x75, 0x6c, 0x61, 0x2f, 0x76,
0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x31, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x22, 0xe8, 0x01, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61, 0x6f, 0x74, 0x6f, 0x22, 0x98, 0x02, 0x0a, 0x0b, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x61,
0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x64, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20,
0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x70,
0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x61, 0x73, 0x68, 0x12, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c,
0x1f, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1c, 0x0a, 0x09,
0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52,
0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x31,
0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x17, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x6c,
0x0a, 0x07, 0x6c, 0x31, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x31, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x31, 0x5f, 0x68, 0x61,
0x06, 0x6c, 0x31, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6c, 0x31, 0x48, 0x61, 0x73, 0x68,
0x73, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d,
0x73, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65,
0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x70, 0x70, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1e, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f,
0x0a, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x72, 0x6f,
0x28, 0x0c, 0x52, 0x0a, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x22, 0x87, 0x70, 0x6f, 0x73, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x72, 0x6f, 0x6f,
0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x70, 0x70, 0x52, 0x6f, 0x6f, 0x74,
0x12, 0x1c, 0x0a, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x09, 0x20,
0x01, 0x28, 0x0c, 0x52, 0x09, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x87,
0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x36, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x01, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x36, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64,
0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x78, 0x63, 0x68, 0x61, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x78, 0x63, 0x68, 0x61,
0x69, 0x6e, 0x2e, 0x6e, 0x65, 0x62, 0x75, 0x6c, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f, 0x69, 0x6e, 0x2e, 0x6e, 0x65, 0x62, 0x75, 0x6c, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x6c, 0x6f,
......
...@@ -15,13 +15,14 @@ option php_namespace = "ExChain\\Nebula\\v1"; ...@@ -15,13 +15,14 @@ option php_namespace = "ExChain\\Nebula\\v1";
message BlockHeader { message BlockHeader {
uint64 height = 1; uint64 height = 1;
bytes hash = 2; bytes parent_hash = 2;
bytes parent_hash = 3; uint64 timestamp = 3;
uint64 timestamp = 4; uint64 l1_height = 4;
bytes l1_hash = 5; bytes l1_hash = 5;
bytes proposer = 6; uint64 sequence_number = 6;
bytes app_root = 7; // used to verify block is valid. bytes proposer = 7;
bytes signatures = 8; // used to verify block is mint by proposer. bytes app_root = 8; // used to verify block is valid.
bytes signature = 9; // used to verify block is mint by proposer.
} }
message Block { message Block {
......
...@@ -32,7 +32,6 @@ func TestMakeBlock(txcount int) *nebulav1.Block { ...@@ -32,7 +32,6 @@ func TestMakeBlock(txcount int) *nebulav1.Block {
block := new(nebulav1.Block) block := new(nebulav1.Block)
block.Header = new(nebulav1.BlockHeader) block.Header = new(nebulav1.BlockHeader)
block.Header.Height = uint64(rand.Intn(1000000)) block.Header.Height = uint64(rand.Intn(1000000))
block.Header.Hash = getHash()
block.Header.ParentHash = getHash() block.Header.ParentHash = getHash()
block.Header.Proposer = getAddr() block.Header.Proposer = getAddr()
block.Header.Timestamp = uint64(time.Now().UnixNano() / 1000 / 1000) block.Header.Timestamp = uint64(time.Now().UnixNano() / 1000 / 1000)
......
package wrapper package wrapper
import (
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"github.com/golang/protobuf/proto"
)
type BlkWrapper struct {
blk *nebulav1.Block
hash common.Hash
}
func NewBlkWrapper(blk *nebulav1.Block) *BlkWrapper {
return &BlkWrapper{blk: blk}
}
func (b *BlkWrapper) Hash() common.Hash {
if b.hash == (common.Hash{}) {
b.hash = b.calcHash()
}
return b.hash
}
func (b *BlkWrapper) Clone() *nebulav1.Block {
return proto.Clone(b.blk).(*nebulav1.Block)
}
func (b *BlkWrapper) Block() *nebulav1.Block {
return b.blk
}
func (b *BlkWrapper) Height() uint64 {
return b.blk.Header.Height
}
func (b *BlkWrapper) Header() *nebulav1.BlockHeader {
return b.blk.Header
}
func (b *BlkWrapper) calcHash() common.Hash {
nblk := b.Clone()
nblk.Header.Signature = nil
data, _ := proto.Marshal(nblk)
return crypto.Keccak256Hash(data)
}
...@@ -3,6 +3,7 @@ package interopgen ...@@ -3,6 +3,7 @@ package interopgen
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/exchain/go-exchain/exchain/wrapper"
"math/big" "math/big"
"github.com/exchain/go-exchain/op-deployer/pkg/deployer/opcm" "github.com/exchain/go-exchain/op-deployer/pkg/deployer/opcm"
...@@ -323,8 +324,8 @@ func CompleteL2(l2Host *script.Host, cfg *L2Config, l1Block *types.Block, deploy ...@@ -323,8 +324,8 @@ func CompleteL2(l2Host *script.Host, cfg *L2Config, l1Block *types.Block, deploy
// todo: vicotor add the allocs to the genesis block. // todo: vicotor add the allocs to the genesis block.
//l2Genesis.AllocInfo = allocs.Accounts //l2Genesis.AllocInfo = allocs.Accounts
l2GenesisBlock := l2Genesis.ToBlock() l2GenesisBlock := l2Genesis.ToBlock()
wblk := wrapper.NewBlkWrapper(l2GenesisBlock)
rollupCfg, err := deployCfg.RollupConfig(l1Block.Header(), common.BytesToHash(l2GenesisBlock.Header.Hash), l2GenesisBlock.Header.Height) rollupCfg, err := deployCfg.RollupConfig(l1Block.Header(), wblk.Hash(), wblk.Height())
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to build L2 rollup config: %w", err) return nil, fmt.Errorf("failed to build L2 rollup config: %w", err)
} }
......
...@@ -3,8 +3,8 @@ package genesis ...@@ -3,8 +3,8 @@ package genesis
import ( import (
"errors" "errors"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/common"
chaingenesis "github.com/exchain/go-exchain/exchain/genesis" chaingenesis "github.com/exchain/go-exchain/exchain/genesis"
"github.com/exchain/go-exchain/exchain/wrapper"
"github.com/exchain/go-exchain/metadb/groupdb" "github.com/exchain/go-exchain/metadb/groupdb"
"time" "time"
...@@ -213,7 +213,8 @@ var Subcommands = cli.Commands{ ...@@ -213,7 +213,8 @@ var Subcommands = cli.Commands{
} }
l2GenesisBlock := l2Genesis.ToBlock() l2GenesisBlock := l2Genesis.ToBlock()
rollupConfig, err := config.RollupConfig(l1StartBlock.Header(), common.BytesToHash(l2GenesisBlock.Header.Hash), l2GenesisBlock.Header.Height) wblk := wrapper.NewBlkWrapper(l2GenesisBlock)
rollupConfig, err := config.RollupConfig(l1StartBlock.Header(), wblk.Hash(), wblk.Height())
if err != nil { if err != nil {
return err return err
} }
......
...@@ -25,9 +25,9 @@ func AttributesMatchBlock(rollupCfg *rollup.Config, attrs *eth.PayloadAttributes ...@@ -25,9 +25,9 @@ func AttributesMatchBlock(rollupCfg *rollup.Config, attrs *eth.PayloadAttributes
if attrs.Param.Timestamp != block.Timestamp { if attrs.Param.Timestamp != block.Timestamp {
return fmt.Errorf("timestamp field does not match. expected: %v. got: %v", uint64(attrs.Param.Timestamp), block.Timestamp) return fmt.Errorf("timestamp field does not match. expected: %v. got: %v", uint64(attrs.Param.Timestamp), block.Timestamp)
} }
if err := checkParentBeaconBlockRootMatch(attrs.Param.ParentRoot, envelope.ParentBeaconBlockRoot); err != nil { //if err := checkParentBeaconBlockRootMatch(attrs.Param.ParentRoot, envelope.ParentBeaconBlockRoot); err != nil {
return err // return err
} //}
return nil return nil
} }
......
...@@ -3,12 +3,11 @@ package derive ...@@ -3,12 +3,11 @@ package derive
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/exchain/go-exchain/exchain"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/core/types"
"github.com/exchain/go-exchain/exchain"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"github.com/exchain/go-exchain/op-node/rollup" "github.com/exchain/go-exchain/op-node/rollup"
"github.com/exchain/go-exchain/op-service/eth" "github.com/exchain/go-exchain/op-service/eth"
...@@ -54,7 +53,7 @@ func (ba *FetchingAttributesBuilder) TestSkipL1OriginCheck() { ...@@ -54,7 +53,7 @@ func (ba *FetchingAttributesBuilder) TestSkipL1OriginCheck() {
// A crit=true error means the input arguments are inconsistent or invalid. // A crit=true error means the input arguments are inconsistent or invalid.
func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Context, l2Parent eth.L2BlockRef, epoch eth.BlockID) (attrs *eth.PayloadAttributes, err error) { func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Context, l2Parent eth.L2BlockRef, epoch eth.BlockID) (attrs *eth.PayloadAttributes, err error) {
var l1Info eth.BlockInfo var l1Info eth.BlockInfo
var depositTxs []hexutil.Bytes var depositTxs []*nebulav1.Transaction_DepositTx
var seqNumber uint64 var seqNumber uint64
sysConfig, err := ba.l2.SystemConfigByL2Hash(ctx, l2Parent.Hash) sysConfig, err := ba.l2.SystemConfigByL2Hash(ctx, l2Parent.Hash)
...@@ -76,7 +75,7 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex ...@@ -76,7 +75,7 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex
epoch, info.ParentHash(), l2Parent.L1Origin)) epoch, info.ParentHash(), l2Parent.L1Origin))
} }
deposits, err := DeriveDeposits(receipts, ba.rollupCfg.DepositContractAddress) deposits, err := DeriveDepositsForExchain(receipts, ba.rollupCfg.DepositContractAddress)
if err != nil { if err != nil {
// deposits may never be ignored. Failing to process them is a critical error. // deposits may never be ignored. Failing to process them is a critical error.
return nil, NewCriticalError(fmt.Errorf("failed to derive some deposits: %w", err)) return nil, NewCriticalError(fmt.Errorf("failed to derive some deposits: %w", err))
...@@ -109,26 +108,26 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex ...@@ -109,26 +108,26 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex
l2Parent, nextL2Time, eth.ToBlockID(l1Info), l1Info.Time())) l2Parent, nextL2Time, eth.ToBlockID(l1Info), l1Info.Time()))
} }
var upgradeTxs []hexutil.Bytes //var upgradeTxs []hexutil.Bytes
if ba.rollupCfg.IsEcotoneActivationBlock(nextL2Time) { //if ba.rollupCfg.IsEcotoneActivationBlock(nextL2Time) {
upgradeTxs, err = EcotoneNetworkUpgradeTransactions() // upgradeTxs, err = EcotoneNetworkUpgradeTransactions()
if err != nil { // if err != nil {
return nil, NewCriticalError(fmt.Errorf("failed to build ecotone network upgrade txs: %w", err)) // return nil, NewCriticalError(fmt.Errorf("failed to build ecotone network upgrade txs: %w", err))
} // }
} //}
if ba.rollupCfg.IsFjordActivationBlock(nextL2Time) { //if ba.rollupCfg.IsFjordActivationBlock(nextL2Time) {
fjord, err := FjordNetworkUpgradeTransactions() // fjord, err := FjordNetworkUpgradeTransactions()
if err != nil { // if err != nil {
return nil, NewCriticalError(fmt.Errorf("failed to build fjord network upgrade txs: %w", err)) // return nil, NewCriticalError(fmt.Errorf("failed to build fjord network upgrade txs: %w", err))
} // }
upgradeTxs = append(upgradeTxs, fjord...) // upgradeTxs = append(upgradeTxs, fjord...)
} //}
l1InfoTx, err := L1InfoDepositBytes(ba.rollupCfg, sysConfig, seqNumber, l1Info, nextL2Time) //l1InfoTx, err := L1InfoDepositBytes(ba.rollupCfg, sysConfig, seqNumber, l1Info, nextL2Time)
if err != nil { //if err != nil {
return nil, NewCriticalError(fmt.Errorf("failed to create l1InfoTx: %w", err)) // return nil, NewCriticalError(fmt.Errorf("failed to create l1InfoTx: %w", err))
} //}
var afterForceIncludeTxs []hexutil.Bytes var afterForceIncludeTxs []hexutil.Bytes
if ba.rollupCfg.IsInterop(nextL2Time) { if ba.rollupCfg.IsInterop(nextL2Time) {
...@@ -139,33 +138,68 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex ...@@ -139,33 +138,68 @@ func (ba *FetchingAttributesBuilder) PreparePayloadAttributes(ctx context.Contex
afterForceIncludeTxs = append(afterForceIncludeTxs, depositsCompleteTx) afterForceIncludeTxs = append(afterForceIncludeTxs, depositsCompleteTx)
} }
txs := make([]hexutil.Bytes, 0, 1+len(depositTxs)+len(afterForceIncludeTxs)+len(upgradeTxs))
txs = append(txs, l1InfoTx)
txs = append(txs, depositTxs...)
txs = append(txs, afterForceIncludeTxs...)
txs = append(txs, upgradeTxs...)
//var withdrawals *types.Withdrawals //var withdrawals *types.Withdrawals
//if ba.rollupCfg.IsCanyon(nextL2Time) { //if ba.rollupCfg.IsCanyon(nextL2Time) {
// withdrawals = &types.Withdrawals{} // withdrawals = &types.Withdrawals{}
//} //}
var parentBeaconRoot *common.Hash //var parentBeaconRoot *common.Hash
if ba.rollupCfg.IsEcotone(nextL2Time) { //if ba.rollupCfg.IsEcotone(nextL2Time) {
parentBeaconRoot = l1Info.ParentBeaconRoot() // parentBeaconRoot = l1Info.ParentBeaconRoot()
if parentBeaconRoot == nil { // default to zero hash if there is no beacon-block-root available // if parentBeaconRoot == nil { // default to zero hash if there is no beacon-block-root available
parentBeaconRoot = new(common.Hash) // parentBeaconRoot = new(common.Hash)
// }
//}
protocolTx := &nebulav1.Transaction_ProtocolTx{
ProtocolTx: &nebulav1.ProtocolTransaction{
L1Number: l1Info.NumberU64(),
L1BlockHash: l1Info.Hash().Bytes(),
L1Time: l1Info.Time(),
SequenceNumber: seqNumber,
BatcherAddr: sysConfig.BatcherAddr.Bytes(),
},
} }
txs := make([]*nebulav1.Transaction, 0, len(depositTxs)+1)
txs = append(txs, &nebulav1.Transaction{
TxType: nebulav1.TxType_ProtocolTx,
User: common.Address{}.String(),
Nonce: exchain.GetNonce().Bytes(),
Proxy: false,
Signature: &nebulav1.Signature{
R: make([]byte, 32),
S: make([]byte, 32),
V: 0,
},
Tx: protocolTx,
})
for _, deposit := range depositTxs {
txs = append(txs, &nebulav1.Transaction{
TxType: nebulav1.TxType_DepositTx,
User: common.Address{}.String(),
Nonce: exchain.GetNonce().Bytes(),
Proxy: false,
Signature: &nebulav1.Signature{
R: make([]byte, 32),
S: make([]byte, 32),
V: 0,
},
Tx: deposit,
})
} }
// todo: vicotor implement it.
r := &eth.PayloadAttributes{ r := &eth.PayloadAttributes{
Param: &exchain.PayloadParams{ Param: &exchain.PayloadParams{
ParentRoot: parentBeaconRoot, L1Info: exchain.L1BlockInfo{
BlockHash: l1Info.Hash(),
Number: l1Info.NumberU64(),
Time: l1Info.Time(),
SequenceNumber: seqNumber,
BatcherAddr: sysConfig.BatcherAddr,
},
Timestamp: nextL2Time, Timestamp: nextL2Time,
Proposer: common.Address{}, Proposer: common.Address{},
Transactions: nebulav1.TransactionList{ Transactions: nebulav1.TransactionList{
Txs: make([]*nebulav1.Transaction, 0), Txs: txs,
}, },
Signer: nil, Signer: nil,
}, },
......
...@@ -2,6 +2,8 @@ package derive ...@@ -2,6 +2,8 @@ package derive
import ( import (
"fmt" "fmt"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"math/big"
"github.com/hashicorp/go-multierror" "github.com/hashicorp/go-multierror"
...@@ -49,3 +51,53 @@ func DeriveDeposits(receipts []*types.Receipt, depositContractAddr common.Addres ...@@ -49,3 +51,53 @@ func DeriveDeposits(receipts []*types.Receipt, depositContractAddr common.Addres
} }
return encodedTxs, result return encodedTxs, result
} }
func DeriveDepositsForExchain(receipts []*types.Receipt, depositContractAddr common.Address) ([]*nebulav1.Transaction_DepositTx, error) {
var result error
userDeposits, err := UserDeposits(receipts, depositContractAddr)
if err != nil {
result = multierror.Append(result, err)
}
depositTxs := make([]*nebulav1.Transaction_DepositTx, 0)
for _, tx := range userDeposits {
var mint *nebulav1.DepositTransaction
var transfer *nebulav1.DepositTransaction
if tx.Mint != nil {
// mint to from.
mint = &nebulav1.DepositTransaction{
SourceHash: tx.SourceHash.Bytes(),
User: tx.From.Bytes(),
Coin: common.Address{}.Bytes(),
Amount: tx.Mint.Bytes(),
}
}
if tx.To != nil {
// then do transfer tx
transfer = &nebulav1.DepositTransaction{
SourceHash: tx.SourceHash.Bytes(),
User: tx.To.Bytes(),
Coin: common.Address{}.Bytes(),
Amount: tx.Value.Bytes(),
}
}
if mint != nil && transfer != nil {
actMint := new(big.Int).SetBytes(mint.Amount)
actTransfer := new(big.Int).SetBytes(transfer.Amount)
mint.Amount = new(big.Int).Sub(actMint, actTransfer).Bytes()
}
if mint != nil {
depositTxs = append(depositTxs, &nebulav1.Transaction_DepositTx{
DepositTx: mint,
})
}
if transfer != nil {
depositTxs = append(depositTxs, &nebulav1.Transaction_DepositTx{
DepositTx: transfer,
})
}
}
return depositTxs, result
}
package derive package derive
import ( import (
"encoding/binary"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/common"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1" nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"github.com/exchain/go-exchain/op-node/rollup" "github.com/exchain/go-exchain/op-node/rollup"
"github.com/exchain/go-exchain/op-service/eth" "github.com/exchain/go-exchain/op-service/eth"
...@@ -21,24 +21,9 @@ func PayloadToBlockRef(rollupCfg *rollup.Config, payload *eth.ExecutionPayload) ...@@ -21,24 +21,9 @@ func PayloadToBlockRef(rollupCfg *rollup.Config, payload *eth.ExecutionPayload)
l1Origin = genesis.L1 l1Origin = genesis.L1
sequenceNumber = 0 sequenceNumber = 0
} else { } else {
txs := payload.Transactions() header := payload.Payload.Header
if len(txs) == 0 { l1Origin = eth.BlockID{Hash: common.BytesToHash(header.L1Hash), Number: header.L1Height}
return eth.L2BlockRef{}, fmt.Errorf("l2 block is missing L1 info, block hash: %s", payload.BlockHash) sequenceNumber = header.SequenceNumber
}
tx := txs[0]
if tx.TxType != nebulav1.TxType_ProtocolTx {
return eth.L2BlockRef{}, fmt.Errorf("first payload tx has unexpected tx type: %d", tx.TxType)
}
content := tx.GetProtocolTx()
if content == nil {
return eth.L2BlockRef{}, fmt.Errorf("first payload tx has unexpected tx type: %d", tx.TxType)
}
info, err := L1BlockInfoFromNebula(rollupCfg, uint64(payload.Timestamp), content)
if err != nil {
return eth.L2BlockRef{}, fmt.Errorf("failed to parse L1 info deposit tx from L2 block: %w", err)
}
l1Origin = eth.BlockID{Hash: info.BlockHash, Number: info.Number}
sequenceNumber = info.SequenceNumber
} }
return eth.L2BlockRef{ return eth.L2BlockRef{
...@@ -73,18 +58,9 @@ func PayloadToSystemConfig(rollupCfg *rollup.Config, payload *eth.ExecutionPaylo ...@@ -73,18 +58,9 @@ func PayloadToSystemConfig(rollupCfg *rollup.Config, payload *eth.ExecutionPaylo
return eth.SystemConfig{}, fmt.Errorf("first payload tx has unexpected tx type: %d", tx.TxType) return eth.SystemConfig{}, fmt.Errorf("first payload tx has unexpected tx type: %d", tx.TxType)
} }
info, err := L1BlockInfoFromNebula(rollupCfg, uint64(payload.Timestamp), content) info, err := L1BlockInfoFromNebula(rollupCfg, uint64(payload.Timestamp), content)
//info, err := L1BlockInfoFromBytes(rollupCfg, uint64(payload.Timestamp), data)
if err != nil { if err != nil {
return eth.SystemConfig{}, fmt.Errorf("failed to parse L1 info deposit tx from L2 block: %w", err) return eth.SystemConfig{}, fmt.Errorf("failed to parse L1 info deposit tx from L2 block: %w", err)
} }
if isEcotoneButNotFirstBlock(rollupCfg, uint64(payload.Timestamp)) {
// Translate Ecotone values back into encoded scalar if needed.
// We do not know if it was derived from a v0 or v1 scalar,
// but v1 is fine, a 0 blob nebula fee has the same effect.
info.L1FeeScalar[0] = 1
binary.BigEndian.PutUint32(info.L1FeeScalar[24:28], info.BlobBaseFeeScalar)
binary.BigEndian.PutUint32(info.L1FeeScalar[28:32], info.BaseFeeScalar)
}
r := eth.SystemConfig{ r := eth.SystemConfig{
BatcherAddr: info.BatcherAddr, BatcherAddr: info.BatcherAddr,
Overhead: info.L1FeeOverhead, Overhead: info.L1FeeOverhead,
......
...@@ -3,6 +3,7 @@ package engine ...@@ -3,6 +3,7 @@ package engine
import ( import (
"context" "context"
"fmt" "fmt"
"github.com/exchain/go-exchain/exchain/wrapper"
"time" "time"
"github.com/exchain/go-exchain/op-node/rollup" "github.com/exchain/go-exchain/op-node/rollup"
...@@ -50,7 +51,7 @@ func (eq *EngDeriver) onBuildStart(ev BuildStartEvent) { ...@@ -50,7 +51,7 @@ func (eq *EngDeriver) onBuildStart(ev BuildStartEvent) {
} }
eq.emitter.Emit(fcEvent) eq.emitter.Emit(fcEvent)
hash := result.Payload.Header.Hash hash := wrapper.NewBlkWrapper(result.Payload).Hash()
eq.emitter.Emit(BuildStartedEvent{ eq.emitter.Emit(BuildStartedEvent{
Info: eth.PayloadInfo{ID: eth.PayloadID(hash[len(hash)-8:]), Timestamp: uint64(ev.Attributes.Attributes.Param.Timestamp)}, Info: eth.PayloadInfo{ID: eth.PayloadID(hash[len(hash)-8:]), Timestamp: uint64(ev.Attributes.Attributes.Param.Timestamp)},
BuildStarted: buildStartTime, BuildStarted: buildStartTime,
...@@ -58,7 +59,7 @@ func (eq *EngDeriver) onBuildStart(ev BuildStartEvent) { ...@@ -58,7 +59,7 @@ func (eq *EngDeriver) onBuildStart(ev BuildStartEvent) {
DerivedFrom: ev.Attributes.DerivedFrom, DerivedFrom: ev.Attributes.DerivedFrom,
Parent: ev.Attributes.Parent, Parent: ev.Attributes.Parent,
Envelope: &eth.ExecutionPayloadEnvelope{ Envelope: &eth.ExecutionPayloadEnvelope{
ParentBeaconBlockRoot: &result.ParentRoot, ParentBeaconBlockRoot: nil,
ExecutionPayload: eth.NewExecutePayload(result.Payload), ExecutionPayload: eth.NewExecutePayload(result.Payload),
}, },
}) })
......
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/exchain/go-exchain/exchain/wrapper"
"time" "time"
"github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/common"
...@@ -230,7 +231,7 @@ func (ev TryUpdateEngineEvent) getBlockProcessingMetrics() []interface{} { ...@@ -230,7 +231,7 @@ func (ev TryUpdateEngineEvent) getBlockProcessingMetrics() []interface{} {
payload := ev.Envelope.ExecutionPayload.Payload payload := ev.Envelope.ExecutionPayload.Payload
logValues := []interface{}{ logValues := []interface{}{
"hash", payload.Header.Hash, "hash", wrapper.NewBlkWrapper(payload).Hash(),
"number", uint64(payload.Header.Height), "number", uint64(payload.Header.Height),
"app_root", hexutil.Bytes(payload.Header.AppRoot), "app_root", hexutil.Bytes(payload.Header.AppRoot),
"timestamp", uint64(payload.Header.Timestamp), "timestamp", uint64(payload.Header.Timestamp),
......
...@@ -8,6 +8,7 @@ import ( ...@@ -8,6 +8,7 @@ import (
"fmt" "fmt"
"github.com/exchain/go-exchain/exchain" "github.com/exchain/go-exchain/exchain"
nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1" nebulav1 "github.com/exchain/go-exchain/exchain/protocol/gen/go/nebula/v1"
"github.com/exchain/go-exchain/exchain/wrapper"
"github.com/golang/protobuf/proto" "github.com/golang/protobuf/proto"
"io" "io"
"math" "math"
...@@ -238,9 +239,10 @@ type ExecutionPayload struct { ...@@ -238,9 +239,10 @@ type ExecutionPayload struct {
} }
func NewExecutePayload(payload *nebulav1.Block) *ExecutionPayload { func NewExecutePayload(payload *nebulav1.Block) *ExecutionPayload {
wblk := wrapper.NewBlkWrapper(payload)
return &ExecutionPayload{ return &ExecutionPayload{
Payload: payload, Payload: payload,
BlockHash: common.BytesToHash(payload.Header.Hash), BlockHash: wblk.Hash(),
BlockNumber: uint64(payload.Header.Height), BlockNumber: uint64(payload.Header.Height),
ParentHash: common.BytesToHash(payload.Header.ParentHash), ParentHash: common.BytesToHash(payload.Header.ParentHash),
Timestamp: uint64(payload.Header.Timestamp), Timestamp: uint64(payload.Header.Timestamp),
...@@ -272,7 +274,7 @@ func (payload *ExecutionPayload) UnmarshalData(length uint32, i io.Reader) error ...@@ -272,7 +274,7 @@ func (payload *ExecutionPayload) UnmarshalData(length uint32, i io.Reader) error
} }
func (payload *ExecutionPayload) ID() BlockID { func (payload *ExecutionPayload) ID() BlockID {
return BlockID{Hash: common.BytesToHash(payload.Payload.Header.Hash), Number: uint64(payload.Payload.Header.Height)} return BlockID{Hash: payload.BlockHash, Number: uint64(payload.Payload.Header.Height)}
} }
func (payload *ExecutionPayload) ParentID() BlockID { func (payload *ExecutionPayload) ParentID() BlockID {
...@@ -298,7 +300,8 @@ func (payload *ExecutionPayload) CanyonBlock() bool { ...@@ -298,7 +300,8 @@ func (payload *ExecutionPayload) CanyonBlock() bool {
func (envelope *ExecutionPayloadEnvelope) CheckBlockHash() (actual common.Hash, ok bool) { func (envelope *ExecutionPayloadEnvelope) CheckBlockHash() (actual common.Hash, ok bool) {
// todo: vicotor implement this. // todo: vicotor implement this.
// recalc the block hash, and compare it to payload.Header.Hash. // recalc the block hash, and compare it to payload.Header.Hash.
return common.BytesToHash(envelope.ExecutionPayload.Payload.Header.Hash), true wblk := wrapper.NewBlkWrapper(envelope.ExecutionPayload.Payload)
return wblk.Hash(), true
} }
// todo: vicotor remove it. // todo: vicotor remove it.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment