2019-02-26 07:04:12 +00:00
|
|
|
import eth/trie/db, eth/[trie, rlp, common], nimcrypto
|
2018-12-03 10:54:19 +00:00
|
|
|
|
2019-02-26 11:26:38 +00:00
|
|
|
export nimcrypto.`$`
|
|
|
|
|
2018-12-03 10:54:19 +00:00
|
|
|
proc calcRootHash[T](items: openArray[T]): Hash256 =
|
|
|
|
var tr = initHexaryTrie(newMemoryDB())
|
|
|
|
for i, t in items:
|
|
|
|
tr.put(rlp.encode(i).toRange, rlp.encode(t).toRange)
|
|
|
|
return tr.rootHash
|
|
|
|
|
|
|
|
template calcTxRoot*(transactions: openArray[Transaction]): Hash256 =
|
|
|
|
calcRootHash(transactions)
|
|
|
|
|
|
|
|
template calcReceiptRoot*(receipts: openArray[Receipt]): Hash256 =
|
|
|
|
calcRootHash(receipts)
|
2019-02-26 07:04:12 +00:00
|
|
|
|
2019-03-07 15:53:09 +00:00
|
|
|
func keccakHash*(value: openarray[byte]): Hash256 {.inline.} =
|
2019-02-26 07:04:12 +00:00
|
|
|
keccak256.digest value
|
|
|
|
|
|
|
|
func generateAddress*(address: EthAddress, nonce: AccountNonce): EthAddress =
|
2019-03-07 15:53:09 +00:00
|
|
|
result[0..19] = keccakHash(rlp.encodeList(address, nonce)).data.toOpenArray(12, 31)
|
2019-02-26 07:04:12 +00:00
|
|
|
|
2019-05-07 03:23:27 +00:00
|
|
|
func generateSafeAddress*(address: EthAddress, salt: Uint256, data: openArray[byte]): EthAddress =
|
|
|
|
const prefix = [0xff.byte]
|
|
|
|
let dataHash = keccakHash(data)
|
|
|
|
var hashResult: Hash256
|
|
|
|
|
|
|
|
var ctx: keccak256
|
|
|
|
ctx.init()
|
|
|
|
ctx.update(prefix)
|
|
|
|
ctx.update(address)
|
|
|
|
ctx.update(salt.toByteArrayBE())
|
|
|
|
ctx.update(dataHash.data)
|
|
|
|
ctx.finish hashResult.data
|
|
|
|
ctx.clear()
|
|
|
|
|
|
|
|
result[0..19] = hashResult.data.toOpenArray(12, 31)
|
|
|
|
|
2019-02-26 07:04:12 +00:00
|
|
|
func hash*(b: BlockHeader): Hash256 {.inline.} =
|
|
|
|
rlpHash(b)
|