diff --git a/block.go b/block.go index a0bcf0bd0c..f8bf2ce3bf 100644 --- a/block.go +++ b/block.go @@ -2,16 +2,29 @@ package main import ( _"fmt" + "time" ) type Block struct { - transactions []*Transaction + RlpSerializer + + number uint32 + prevHash string + uncles []*Block + coinbase string + // state xxx + difficulty int + time time.Time + nonce int + transactions []*Transaction } func NewBlock(/* TODO use raw data */transactions []*Transaction) *Block { block := &Block{ // Slice of transactions to include in this block transactions: transactions, + + time: time.Now(), } return block @@ -19,3 +32,33 @@ func NewBlock(/* TODO use raw data */transactions []*Transaction) *Block { func (block *Block) Update() { } + +func (block *Block) Hash() string { + return Sha256Hex(block.MarshalRlp()) +} + +func (block *Block) MarshalRlp() []byte { + // Encoding method requires []interface{} type. It's actual a slice of strings + encTx := make([]string, len(block.transactions)) + for i, tx := range block.transactions { + encTx[i] = string(tx.MarshalRlp()) + } + + enc := RlpEncode([]interface{}{ + block.number, + block.prevHash, + // Sha of uncles + block.coinbase, + // root state + Sha256Bin([]byte(RlpEncode(encTx))), + block.difficulty, + block.time, + block.nonce, + // extra? + }) + + return []byte(enc) +} + +func (block *Block) UnmarshalRlp(data []byte) { +}