diff options
author | obscuren <obscuren@obscura.com> | 2013-12-28 22:18:08 +0800 |
---|---|---|
committer | obscuren <obscuren@obscura.com> | 2013-12-28 22:18:08 +0800 |
commit | bd582d919bf3dfa68cce10ca506c39a4c2e2ea94 (patch) | |
tree | 012328b436ae92dfbfbd2b8c4a54f4e35351e2e4 | |
parent | 95d877f701371108dc18967319d1f7b4e6763caf (diff) | |
download | dexon-bd582d919bf3dfa68cce10ca506c39a4c2e2ea94.tar dexon-bd582d919bf3dfa68cce10ca506c39a4c2e2ea94.tar.gz dexon-bd582d919bf3dfa68cce10ca506c39a4c2e2ea94.tar.bz2 dexon-bd582d919bf3dfa68cce10ca506c39a4c2e2ea94.tar.lz dexon-bd582d919bf3dfa68cce10ca506c39a4c2e2ea94.tar.xz dexon-bd582d919bf3dfa68cce10ca506c39a4c2e2ea94.tar.zst dexon-bd582d919bf3dfa68cce10ca506c39a4c2e2ea94.zip |
(un)marshal blocks and transactions
-rw-r--r-- | block.go | 81 | ||||
-rw-r--r-- | transaction.go | 4 |
2 files changed, 68 insertions, 17 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 + } + } } } } diff --git a/transaction.go b/transaction.go index cb7edd89c..b6e9eaa8f 100644 --- a/transaction.go +++ b/transaction.go @@ -34,8 +34,6 @@ var Period3Reward *big.Int = new(big.Int) var Period4Reward *big.Int = new(big.Int) type Transaction struct { - RlpSerializer - sender string recipient string value uint32 @@ -83,7 +81,7 @@ func (tx *Transaction) MarshalRlp() []byte { tx.data, } - return []byte(Encode(preEnc)) + return Encode(preEnc) } func (tx *Transaction) UnmarshalRlp(data []byte) { |