{-# LANGUAGE OverloadedStrings #-}
module Blockchain.Data.GenesisBlock (
initializeGenesisBlock,
initializeStateDB
) where
import Control.Monad.IO.Class
import Control.Monad.Trans.Resource
import Control.Monad.Trans.State
import qualified Data.ByteString as B
import Data.Functor
import Data.Time.Clock.POSIX
import Blockchain.Database.MerklePatricia
import Blockchain.Data.Block
import Blockchain.Context
import Blockchain.Data.Address
import Blockchain.Data.AddressState
import Blockchain.DB.ModifyStateDB
import Blockchain.SHA
--import Debug.Trace
--startingRoot::B.ByteString
--(startingRoot, "") = B16.decode "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
--"bc36789e7a1e281436464229828f817d6612f7b477d66591ff96a9e064bcc98a"
initializeBlankStateDB::ContextM ()
initializeBlankStateDB = do
cxt <- get
liftIO $ runResourceT $
initializeBlank (stateDB cxt)
put cxt{stateDB=(stateDB cxt){stateRoot=emptyTriePtr}}
initializeStateDB::ContextM ()
initializeStateDB = do
initializeBlankStateDB
let addresses = Address <$> [
0x51ba59315b3a95761d0863b05ccc7a7f54703d99,
0xe6716f9544a56c530d868e4bfbacb172315bdead,
0xb9c015918bdaba24b4ff057a92a3873d6eb201be,
0x1a26338f0d905e295fccb71fa9ea849ffa12aaf4,
0x2ef47100e0787b915105fd5e3f4ff6752079d5cb,
0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826,
0x6c386a4b26f73c802f34673f7248bb118f97424a,
0xe4157b34ea9615cfbde6b4fda419828124b70c78
]
putAddressStates addresses blankAddressState{balance=0x0100000000000000000000000000000000000000000000000000}
initializeGenesisBlock::ContextM Block
initializeGenesisBlock = do
initializeStateDB
cxt <- get
let genesisBlock = Block {
blockData =
BlockData {
parentHash = SHA 0,
unclesHash = hash (B.pack [0xc0]),
coinbase = Address 0,
bStateRoot = stateRoot $ stateDB cxt,
transactionsRoot = emptyTriePtr,
receiptsRoot = emptyTriePtr,
logBloom = B.pack [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
difficulty = 0x020000, --1 << 17
number = 0,
gasLimit = 1000000,
gasUsed = 0,
timestamp = posixSecondsToUTCTime 0,
extraData = 0,
nonce = hash $ B.pack [42]
},
receiptTransactions=[],
blockUncles=[]
}
putBlock genesisBlock
return genesisBlock