diff --git a/block.go b/block.go
index a0bcf0bd0c1322bec51088bf8e6ffccee60effa9..f8bf2ce3bfd9bb28e254cc4cda0d13c6b6558138 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) {
+}