From 0edcbc695e3e80d2f417467905621505f9971b4f Mon Sep 17 00:00:00 2001 From: obscuren Date: Sun, 29 Dec 2013 23:53:12 +0100 Subject: [PATCH] Updated serialisation --- block.go | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/block.go b/block.go index 8c4d263fa..9aa3c8bb5 100644 --- a/block.go +++ b/block.go @@ -1,7 +1,7 @@ package main import ( - "fmt" + _"fmt" "time" _"bytes" ) @@ -17,14 +17,24 @@ type Block struct { // state xxx difficulty uint32 // Creation time - time time.Time + time int64 nonce uint32 // List of transactions and/or contracts transactions []*Transaction + + extra string +} + +// New block takes a raw encoded string +func NewBlock(raw []byte) *Block { + block := &Block{} + block.UnmarshalRlp(raw) + + return block } // Creates a new block. This is currently for testing -func NewBlock(/* TODO use raw data */transactions []*Transaction) *Block { +func CreateBlock(/* TODO use raw data */transactions []*Transaction) *Block { block := &Block{ // Slice of transactions to include in this block transactions: transactions, @@ -33,8 +43,7 @@ func NewBlock(/* TODO use raw data */transactions []*Transaction) *Block { coinbase: "me", difficulty: 10, nonce: 0, - - time: time.Now(), + time: time.Now().Unix(), } return block @@ -65,15 +74,18 @@ func (block *Block) MarshalRlp() []byte { block.coinbase, // root state "", - string(Sha256Bin([]byte(RlpEncode(encTx)))), + // Sha of tx + string(Sha256Bin([]byte(Encode(encTx)))), block.difficulty, - block.time.String(), + uint64(block.time), block.nonce, - // extra? + block.extra, } + // TODO + uncles := []interface{}{} // Encode a slice interface which contains the header and the list of transactions. - return Encode([]interface{}{header, encTx}) + return Encode([]interface{}{header, encTx, uncles}) } func (block *Block) UnmarshalRlp(data []byte) { @@ -109,13 +121,21 @@ func (block *Block) UnmarshalRlp(data []byte) { block.difficulty = uint32(difficulty) } - if time, ok := header[7].([]byte); ok { - fmt.Sprintf("Time is: ", string(time)) + // It's either 8bit or 64 + if time, ok := header[7].(uint8); ok { + block.time = int64(time) + } + if time, ok := header[7].(uint64); ok { + block.time = int64(time) } if nonce, ok := header[8].(uint8); ok { block.nonce = uint32(nonce) } + + if extra, ok := header[9].([]byte); ok { + block.extra = string(extra) + } } if txSlice, ok := slice[1].([]interface{}); ok {