diff options
Diffstat (limited to 'block.go')
-rw-r--r-- | block.go | 81 |
1 files changed, 67 insertions, 14 deletions
@@ -3,19 +3,18 @@ package main import ( "fmt" "time" + _"bytes" ) type Block struct { - RlpSerializer - number uint32 prevHash string uncles []*Block coinbase string // state xxx - difficulty int + difficulty uint32 time time.Time - nonce int + nonce uint32 transactions []*Transaction } @@ -23,6 +22,11 @@ func NewBlock(/* TODO use raw data */transactions []*Transaction) *Block { block := &Block{ // Slice of transactions to include in this block transactions: transactions, + number: 1, + prevHash: "1234", + coinbase: "me", + difficulty: 10, + nonce: 0, time: time.Now(), } @@ -44,28 +48,77 @@ func (block *Block) MarshalRlp() []byte { encTx[i] = string(tx.MarshalRlp()) } + /* I made up the block. It should probably contain different data or types. It sole purpose now is testing */ header := []interface{}{ block.number, - //block.prevHash, + block.prevHash, // Sha of uncles - //block.coinbase, + "", + block.coinbase, // root state - //Sha256Bin([]byte(RlpEncode(encTx))), - //block.difficulty, - //block.time, - //block.nonce, + "", + string(Sha256Bin([]byte(RlpEncode(encTx)))), + block.difficulty, + block.time.String(), + block.nonce, // extra? } - return Encode([]interface{}{header, encTx}) + encoded := Encode([]interface{}{header, encTx}) + + return encoded } func (block *Block) UnmarshalRlp(data []byte) { - fmt.Printf("%q\n", data) t, _ := Decode(data,0) if slice, ok := t.([]interface{}); ok { - if txes, ok := slice[1].([]interface{}); ok { - fmt.Println(txes[0]) + if header, ok := slice[0].([]interface{}); ok { + if number, ok := header[0].(uint8); ok { + block.number = uint32(number) + } + + if prevHash, ok := header[1].([]byte); ok { + block.prevHash = string(prevHash) + } + + // sha of uncles is header[2] + + if coinbase, ok := header[3].([]byte); ok { + block.coinbase = string(coinbase) + } + + // state is header[header[4] + + // sha is header[5] + + // It's either 8bit or 64 + if difficulty, ok := header[6].(uint8); ok { + block.difficulty = uint32(difficulty) + } + if difficulty, ok := header[6].(uint64); ok { + block.difficulty = uint32(difficulty) + } + + if time, ok := header[7].([]byte); ok { + fmt.Sprintf("Time is: ", string(time)) + } + + if nonce, ok := header[8].(uint8); ok { + block.nonce = uint32(nonce) + } + } + + if txSlice, ok := slice[1].([]interface{}); ok { + block.transactions = make([]*Transaction, len(txSlice)) + + for i, tx := range txSlice { + if t, ok := tx.([]byte); ok { + tx := &Transaction{} + tx.UnmarshalRlp(t) + + block.transactions[i] = tx + } + } } } } |