From 4ade5797ee04dc778641372177e4b3e1851cdb6c Mon Sep 17 00:00:00 2001 From: Jacek Sieka Date: Mon, 20 Apr 2020 20:12:44 +0200 Subject: [PATCH] rlp: don't use ranges / experimental features (#495) --- nimbus/config.nim | 2 +- nimbus/db/accounts_cache.nim | 37 +++++------ nimbus/db/capturedb.nim | 2 +- nimbus/db/db_chain.nim | 64 ++++--------------- nimbus/db/state_db.nim | 41 +++++------- nimbus/db/storage_types.nim | 13 ---- nimbus/genesis.nim | 6 +- nimbus/nimbus.nim | 3 - nimbus/p2p/chain.nim | 2 +- nimbus/p2p/executor.nim | 2 +- nimbus/rpc/common.nim | 2 +- nimbus/rpc/debug.nim | 4 +- nimbus/rpc/hexstrings.nim | 4 +- nimbus/rpc/p2p.nim | 8 +-- nimbus/rpc/rpc_types.nim | 4 +- nimbus/rpc/rpc_utils.nim | 4 +- nimbus/rpc/waku.nim | 4 +- nimbus/rpc/whisper.nim | 4 +- nimbus/tracer.nim | 4 +- nimbus/transaction.nim | 2 +- nimbus/utils.nim | 2 +- nimbus/vm/computation.nim | 10 +-- nimbus/vm/interpreter/opcodes_impl.nim | 6 +- nimbus/vm/interpreter/utils/utils_numeric.nim | 2 +- nimbus/vm/transaction_tracer.nim | 2 +- nimbus/vm_state_transactions.nim | 2 +- premix/hunter.nim | 4 +- premix/persist.nim | 6 +- tests/macro_assembler.nim | 6 +- tests/test_helpers.nim | 4 +- tests/test_op_env.nim | 2 +- tests/test_state_db.nim | 6 +- vendor/nim-eth | 2 +- vendor/nim-rocksdb | 2 +- vendor/nim-stew | 2 +- wrappers/libnimbus.nim | 6 +- 36 files changed, 104 insertions(+), 172 deletions(-) diff --git a/nimbus/config.nim b/nimbus/config.nim index 1dcc37197..65f9dd291 100644 --- a/nimbus/config.nim +++ b/nimbus/config.nim @@ -8,7 +8,7 @@ # those terms. import - parseopt, strutils, macros, os, times, json, stew/[byteutils, ranges], + parseopt, strutils, macros, os, times, json, stew/[byteutils], chronos, eth/[keys, common, p2p, net/nat], chronicles, nimcrypto/hash, eth/p2p/bootnodes, eth/p2p/rlpx_protocols/whisper_protocol, ./db/select_backend, diff --git a/nimbus/db/accounts_cache.nim b/nimbus/db/accounts_cache.nim index 63e23a5e5..bbc450d82 100644 --- a/nimbus/db/accounts_cache.nim +++ b/nimbus/db/accounts_cache.nim @@ -19,7 +19,7 @@ type RefAccount = ref object account: Account flags: AccountFlags - code: ByteRange + code: seq[byte] originalStorage: TableRef[UInt256, UInt256] overlayStorage: Table[UInt256, UInt256] @@ -94,13 +94,6 @@ proc safeDispose*(ac: var AccountsCache, sp: Savepoint) {.inline.} = if (not isNil(sp)) and (sp.state == Pending): ac.rollback(sp) -template createRangeFromAddress(address: EthAddress): ByteRange = - ## XXX: The name of this proc is intentionally long, because it - ## performs a memory allocation and data copying that may be eliminated - ## in the future. Avoid renaming it to something similar as `toRange`, so - ## it can remain searchable in the code. - toRange(@address) - proc getAccount(ac: AccountsCache, address: EthAddress, shouldCreate = true): RefAccount = # search account from layers of cache var sp = ac.savePoint @@ -111,7 +104,7 @@ proc getAccount(ac: AccountsCache, address: EthAddress, shouldCreate = true): Re sp = sp.parentSavepoint # not found in cache, look into state trie - let recordFound = ac.trie.get(createRangeFromAddress address) + let recordFound = ac.trie.get(address) if recordFound.len > 0: # we found it result = RefAccount( @@ -154,11 +147,11 @@ proc exists(acc: RefAccount): bool = else: result = IsNew notin acc.flags -template createTrieKeyFromSlot(slot: UInt256): ByteRange = +template createTrieKeyFromSlot(slot: UInt256): auto = # XXX: This is too expensive. Similar to `createRangeFromAddress` # Converts a number to hex big-endian representation including # prefix and leading zeros: - @(slot.toByteArrayBE).toRange + slot.toByteArrayBE # Original py-evm code: # pad32(int_to_big_endian(slot)) # morally equivalent to toByteRange_Unnecessary but with different types @@ -204,7 +197,7 @@ proc kill(acc: RefAccount) = acc.overlayStorage.clear() acc.originalStorage = nil acc.account = newAccount() - acc.code = default(ByteRange) + acc.code = default(seq[byte]) type PersistMode = enum @@ -223,7 +216,7 @@ proc persistMode(acc: RefAccount): PersistMode = proc persistCode(acc: RefAccount, db: TrieDatabaseRef) = if acc.code.len != 0: - db.put(contractHashKey(acc.account.codeHash).toOpenArray, acc.code.toOpenArray) + db.put(contractHashKey(acc.account.codeHash).toOpenArray, acc.code) proc persistStorage(acc: RefAccount, db: TrieDatabaseRef) = if acc.overlayStorage.len == 0: @@ -237,7 +230,7 @@ proc persistStorage(acc: RefAccount, db: TrieDatabaseRef) = let slotAsKey = createTrieKeyFromSlot slot if value > 0: - let encodedValue = rlp.encode(value).toRange + let encodedValue = rlp.encode(value) accountTrie.put(slotAsKey, encodedValue) else: accountTrie.del(slotAsKey) @@ -245,7 +238,7 @@ proc persistStorage(acc: RefAccount, db: TrieDatabaseRef) = # map slothash back to slot value # see iterator storage below # slotHash can be obtained from accountTrie.put? - let slotHash = keccakHash(slotAsKey.toOpenArray) + let slotHash = keccakHash(slotAsKey) db.put(slotHashToSlotKey(slotHash.data).toOpenArray, rlp.encode(slot)) acc.account.storageRoot = accountTrie.rootHash @@ -276,7 +269,7 @@ proc getNonce*(ac: AccountsCache, address: EthAddress): AccountNonce {.inline.} if acc.isNil: emptyAcc.nonce else: acc.account.nonce -proc getCode*(ac: AccountsCache, address: EthAddress): ByteRange = +proc getCode*(ac: AccountsCache, address: EthAddress): seq[byte] = let acc = ac.getAccount(address, false) if acc.isNil: return @@ -285,7 +278,7 @@ proc getCode*(ac: AccountsCache, address: EthAddress): ByteRange = result = acc.code else: let data = ac.db.get(contractHashKey(acc.account.codeHash).toOpenArray) - acc.code = data.toRange + acc.code = data acc.flags.incl CodeLoaded result = acc.code @@ -353,10 +346,10 @@ proc setNonce*(ac: var AccountsCache, address: EthAddress, nonce: AccountNonce) proc incNonce*(ac: var AccountsCache, address: EthAddress) {.inline.} = ac.setNonce(address, ac.getNonce(address) + 1) -proc setCode*(ac: var AccountsCache, address: EthAddress, code: ByteRange) = +proc setCode*(ac: var AccountsCache, address: EthAddress, code: seq[byte]) = let acc = ac.getAccount(address) acc.flags.incl {IsTouched, IsAlive} - let codeHash = keccakHash(code.toOpenArray) + let codeHash = keccakHash(code) if acc.account.codeHash != codeHash: var acc = ac.makeDirty(address) acc.account.codeHash = codeHash @@ -406,9 +399,9 @@ proc persist*(ac: var AccountsCache) = # storageRoot must be updated first # before persisting account into merkle trie acc.persistStorage(ac.db) - ac.trie.put createRangeFromAddress(address), rlp.encode(acc.account).toRange + ac.trie.put address, rlp.encode(acc.account) of Remove: - ac.trie.del createRangeFromAddress(address) + ac.trie.del address of DoNothing: discard ac.savePoint.cache.clear() @@ -421,5 +414,5 @@ iterator storage*(ac: AccountsCache, address: EthAddress): (UInt256, UInt256) = for slot, value in trie: if slot.len != 0: - var keyData = ac.db.get(slotHashToSlotKey(slot.toOpenArray).toOpenArray).toRange + var keyData = ac.db.get(slotHashToSlotKey(slot).toOpenArray) yield (rlp.decode(keyData, UInt256), rlp.decode(value, UInt256)) diff --git a/nimbus/db/capturedb.nim b/nimbus/db/capturedb.nim index 135a36cf3..c87951c44 100644 --- a/nimbus/db/capturedb.nim +++ b/nimbus/db/capturedb.nim @@ -1,4 +1,4 @@ -import eth/trie/db, stew/ranges +import eth/trie/db type CaptureFlags* {.pure.} = enum diff --git a/nimbus/db/db_chain.nim b/nimbus/db/db_chain.nim index 9868e92ff..30b70f55b 100644 --- a/nimbus/db/db_chain.nim +++ b/nimbus/db/db_chain.nim @@ -7,7 +7,7 @@ import sequtils, algorithm, - stew/[byteutils, ranges], eth/trie/[hexary, db], + stew/[byteutils], eth/trie/[hexary, db], eth/[common, rlp], chronicles, ../errors, ../constants, ./storage_types, ../utils, ../config @@ -39,7 +39,7 @@ proc exists*(self: BaseChainDB, hash: Hash256): bool = self.db.contains(hash.data) proc getBlockHeader*(self: BaseChainDB; blockHash: Hash256, output: var BlockHeader): bool = - let data = self.db.get(genericHashKey(blockHash).toOpenArray).toRange + let data = self.db.get(genericHashKey(blockHash).toOpenArray) if data.len != 0: output = rlp.decode(data, BlockHeader) result = true @@ -52,7 +52,7 @@ proc getBlockHeader*(self: BaseChainDB, blockHash: Hash256): BlockHeader = raise newException(BlockNotFound, "No block with hash " & blockHash.data.toHex) proc getHash(self: BaseChainDB, key: DbKey, output: var Hash256): bool {.inline.} = - let data = self.db.get(key.toOpenArray).toRange + let data = self.db.get(key.toOpenArray) if data.len != 0: output = rlp.decode(data, Hash256) result = true @@ -85,7 +85,7 @@ proc getBlockHeader*(self: BaseChainDB; n: BlockNumber): BlockHeader = self.getBlockHeader(self.getBlockHash(n)) proc getScore*(self: BaseChainDB; blockHash: Hash256): Uint256 = - rlp.decode(self.db.get(blockHashToScoreKey(blockHash).toOpenArray).toRange, Uint256) + rlp.decode(self.db.get(blockHashToScoreKey(blockHash).toOpenArray), Uint256) proc getAncestorsHashes*(self: BaseChainDB, limit: Uint256, header: BlockHeader): seq[Hash256] = var ancestorCount = min(header.blockNumber, limit).truncate(int) @@ -121,17 +121,17 @@ proc persistTransactions*(self: BaseChainDB, blockNumber: BlockNumber, transacti var trie = initHexaryTrie(self.db) for idx, tx in transactions: let - encodedTx = rlp.encode(tx).toRange - txHash = keccakHash(encodedTx.toOpenArray) + encodedTx = rlp.encode(tx) + txHash = keccakHash(encodedTx) txKey: TransactionKey = (blockNumber, idx) - trie.put(rlp.encode(idx).toRange, encodedTx) + trie.put(rlp.encode(idx), encodedTx) self.db.put(transactionHashToBlockKey(txHash).toOpenArray, rlp.encode(txKey)) -iterator getBlockTransactionData(self: BaseChainDB, transactionRoot: Hash256): BytesRange = +iterator getBlockTransactionData(self: BaseChainDB, transactionRoot: Hash256): seq[byte] = var transactionDb = initHexaryTrie(self.db, transactionRoot) var transactionIdx = 0 while true: - let transactionKey = rlp.encode(transactionIdx).toRange + let transactionKey = rlp.encode(transactionIdx) if transactionKey in transactionDb: yield transactionDb.get(transactionKey) else: @@ -142,7 +142,7 @@ iterator getBlockTransactionHashes(self: BaseChainDB, blockHeader: BlockHeader): ## Returns an iterable of the transaction hashes from th block specified ## by the given block header. for encodedTx in self.getBlockTransactionData(blockHeader.txRoot): - yield keccakHash(encodedTx.toOpenArray) + yield keccakHash(encodedTx) proc getBlockBody*(self: BaseChainDB, blockHash: Hash256, output: var BlockBody): bool = var header: BlockHeader @@ -154,7 +154,7 @@ proc getBlockBody*(self: BaseChainDB, blockHash: Hash256, output: var BlockBody) output.transactions.add(rlp.decode(encodedTx, Transaction)) if header.ommersHash != EMPTY_UNCLE_HASH: - let encodedUncles = self.db.get(genericHashKey(header.ommersHash).toOpenArray).toRange + let encodedUncles = self.db.get(genericHashKey(header.ommersHash).toOpenArray) if encodedUncles.len != 0: output.uncles = rlp.decode(encodedUncles, seq[BlockHeader]) else: @@ -172,7 +172,7 @@ proc getUncleHashes*(self: BaseChainDB, blockHashes: openArray[Hash256]): seq[Ha proc getTransactionKey*(self: BaseChainDB, transactionHash: Hash256): tuple[blockNumber: BlockNumber, index: int] {.inline.} = let - tx = self.db.get(transactionHashToBlockKey(transactionHash).toOpenArray).toRange + tx = self.db.get(transactionHashToBlockKey(transactionHash).toOpenArray) key = rlp.decode(tx, TransactionKey) return (key.blockNumber, key.index) @@ -217,13 +217,13 @@ proc headerExists*(self: BaseChainDB; blockHash: Hash256): bool = proc persistReceipts*(self: BaseChainDB, receipts: openArray[Receipt]) = var trie = initHexaryTrie(self.db) for idx, rec in receipts: - trie.put(rlp.encode(idx).toRange, rlp.encode(rec).toRange) + trie.put(rlp.encode(idx), rlp.encode(rec)) iterator getReceipts*(self: BaseChainDB; header: BlockHeader): Receipt = var receiptDb = initHexaryTrie(self.db, header.receiptRoot) var receiptIdx = 0 while true: - let receiptKey = rlp.encode(receiptIdx).toRange + let receiptKey = rlp.encode(receiptIdx) if receiptKey in receiptDb: let receiptData = receiptDb.get(receiptKey) yield rlp.decode(receiptData, Receipt) @@ -231,11 +231,6 @@ iterator getReceipts*(self: BaseChainDB; header: BlockHeader): Receipt = break inc receiptIdx -iterator getBlockTransactions(self: BaseChainDB; transactionRoot: Hash256; - transactionClass: typedesc): transactionClass = - for encodedTransaction in self.getBlockTransactionData(transactionRoot): - yield rlp.decode(encodedTransaction, transactionClass) - proc persistHeaderToDb*(self: BaseChainDB; header: BlockHeader): seq[BlockHeader] = let isGenesis = header.parentHash == GENESIS_PARENT_HASH let headerHash = header.blockHash @@ -259,40 +254,9 @@ proc persistHeaderToDb*(self: BaseChainDB; header: BlockHeader): seq[BlockHeader if score > headScore: result = self.setAsCanonicalChainHead(headerHash) -proc addTransactionToCanonicalChain(self: BaseChainDB, txHash: Hash256, - blockHeader: BlockHeader, index: int) = - let k: TransactionKey = (blockHeader.blockNumber, index) - self.db.put(transactionHashToBlockKey(txHash).toOpenArray, rlp.encode(k)) - proc persistUncles*(self: BaseChainDB, uncles: openarray[BlockHeader]): Hash256 = ## Persists the list of uncles to the database. ## Returns the uncles hash. let enc = rlp.encode(uncles) result = keccakHash(enc) self.db.put(genericHashKey(result).toOpenArray, enc) - -#proc persistBlockToDb*(self: BaseChainDB; blk: Block): ValidationResult = -# ## Persist the given block's header and uncles. -# ## Assumes all block transactions have been persisted already. -# let newCanonicalHeaders = self.persistHeaderToDb(blk.header) -# for header in newCanonicalHeaders: -# var index = 0 -# for txHash in self.getBlockTransactionHashes(header): -# self.addTransactionToCanonicalChain(txHash, header, index) -# inc index -# -# if blk.uncles.len != 0: -# let ommersHash = self.persistUncles(blk.uncles) -# if ommersHash != blk.header.ommersHash: -# debug "ommersHash mismatch" -# return ValidationResult.Error - -# Deprecated: -proc getBlockHeaderByHash*(self: BaseChainDB; blockHash: Hash256): BlockHeader {.deprecated.} = - self.getBlockHeader(blockHash) - -proc lookupBlockHash*(self: BaseChainDB; n: BlockNumber): Hash256 {.deprecated.} = - self.getBlockHash(n) - -proc getCanonicalBlockHeaderByNumber*(self: BaseChainDB; n: BlockNumber): BlockHeader {.deprecated.} = - self.getBlockHeader(n) diff --git a/nimbus/db/state_db.nim b/nimbus/db/state_db.nim index f65062eb4..58580bea7 100644 --- a/nimbus/db/state_db.nim +++ b/nimbus/db/state_db.nim @@ -72,25 +72,18 @@ proc newAccountStateDB*(backingStore: TrieDatabaseRef, when aleth_compat: result.cleared = initHashSet[EthAddress]() -template createRangeFromAddress(address: EthAddress): ByteRange = - ## XXX: The name of this proc is intentionally long, because it - ## performs a memory allocation and data copying that may be eliminated - ## in the future. Avoid renaming it to something similar as `toRange`, so - ## it can remain searchable in the code. - toRange(@address) - proc getAccount*(db: AccountStateDB, address: EthAddress): Account = - let recordFound = db.trie.get(createRangeFromAddress address) + let recordFound = db.trie.get(address) if recordFound.len > 0: result = rlp.decode(recordFound, Account) else: result = newAccount() proc setAccount*(db: AccountStateDB, address: EthAddress, account: Account) = - db.trie.put createRangeFromAddress(address), rlp.encode(account).toRange + db.trie.put(address, rlp.encode(account)) proc deleteAccount*(db: AccountStateDB, address: EthAddress) = - db.trie.del createRangeFromAddress(address) + db.trie.del(address) proc getCodeHash*(db: AccountStateDB, address: EthAddress): Hash256 = let account = db.getAccount(address) @@ -111,11 +104,10 @@ proc addBalance*(db: var AccountStateDB, address: EthAddress, delta: UInt256) = proc subBalance*(db: var AccountStateDB, address: EthAddress, delta: UInt256) = db.setBalance(address, db.getBalance(address) - delta) -template createTrieKeyFromSlot(slot: UInt256): ByteRange = - # XXX: This is too expensive. Similar to `createRangeFromAddress` +template createTrieKeyFromSlot(slot: UInt256): auto = # Converts a number to hex big-endian representation including # prefix and leading zeros: - @(slot.toByteArrayBE).toRange + slot.toByteArrayBE # Original py-evm code: # pad32(int_to_big_endian(slot)) # morally equivalent to toByteRange_Unnecessary but with different types @@ -147,7 +139,7 @@ proc setStorage*(db: var AccountStateDB, let slotAsKey = createTrieKeyFromSlot slot if value > 0: - let encodedValue = rlp.encode(value).toRange + let encodedValue = rlp.encode(value) accountTrie.put(slotAsKey, encodedValue) else: accountTrie.del(slotAsKey) @@ -171,7 +163,7 @@ iterator storage*(db: AccountStateDB, address: EthAddress): (UInt256, UInt256) = for key, value in trie: if key.len != 0: - var keyData = triedb.get(slotHashToSlotKey(key.toOpenArray).toOpenArray).toRange + var keyData = triedb.get(slotHashToSlotKey(key).toOpenArray) yield (rlp.decode(keyData, UInt256), rlp.decode(value, UInt256)) proc getStorage*(db: AccountStateDB, address: EthAddress, slot: UInt256): (UInt256, bool) = @@ -201,25 +193,24 @@ proc getNonce*(db: AccountStateDB, address: EthAddress): AccountNonce = proc incNonce*(db: AccountStateDB, address: EthAddress) {.inline.} = db.setNonce(address, db.getNonce(address) + 1) -proc setCode*(db: AccountStateDB, address: EthAddress, code: ByteRange) = +proc setCode*(db: AccountStateDB, address: EthAddress, code: openArray[byte]) = var account = db.getAccount(address) # TODO: implement JournalDB to store code and storage # also use JournalDB to revert state trie let - newCodeHash = keccakHash(code.toOpenArray) + newCodeHash = keccakHash(code) triedb = trieDB(db) if code.len != 0: - triedb.put(contractHashKey(newCodeHash).toOpenArray, code.toOpenArray) + triedb.put(contractHashKey(newCodeHash).toOpenArray, code) account.codeHash = newCodeHash db.setAccount(address, account) -proc getCode*(db: AccountStateDB, address: EthAddress): ByteRange = +proc getCode*(db: AccountStateDB, address: EthAddress): seq[byte] = let triedb = trieDB(db) - let data = triedb.get(contractHashKey(db.getCodeHash(address)).toOpenArray) - data.toRange + triedb.get(contractHashKey(db.getCodeHash(address)).toOpenArray) proc hasCodeOrNonce*(db: AccountStateDB, address: EthAddress): bool {.inline.} = db.getNonce(address) != 0 or db.getCodeHash(address) != EMPTY_SHA3 @@ -229,10 +220,10 @@ proc dumpAccount*(db: AccountStateDB, addressS: string): string = return fmt"{addressS}: Storage: {db.getStorage(address, 0.u256)}; getAccount: {db.getAccount address}" proc accountExists*(db: AccountStateDB, address: EthAddress): bool = - db.trie.get(createRangeFromAddress address).len > 0 + db.trie.get(address).len > 0 proc isEmptyAccount*(db: AccountStateDB, address: EthAddress): bool = - let recordFound = db.trie.get(createRangeFromAddress address) + let recordFound = db.trie.get(address) assert(recordFound.len > 0) let account = rlp.decode(recordFound, Account) @@ -241,7 +232,7 @@ proc isEmptyAccount*(db: AccountStateDB, address: EthAddress): bool = account.nonce == 0 proc isDeadAccount*(db: AccountStateDB, address: EthAddress): bool = - let recordFound = db.trie.get(createRangeFromAddress address) + let recordFound = db.trie.get(address) if recordFound.len > 0: let account = rlp.decode(recordFound, Account) result = account.codeHash == EMPTY_SHA3 and @@ -281,7 +272,7 @@ proc getBalance*(db: ReadOnlyStateDB, address: EthAddress): UInt256 {.borrow.} proc getStorageRoot*(db: ReadOnlyStateDB, address: EthAddress): Hash256 {.borrow.} proc getStorage*(db: ReadOnlyStateDB, address: EthAddress, slot: UInt256): (UInt256, bool) {.borrow.} proc getNonce*(db: ReadOnlyStateDB, address: EthAddress): AccountNonce {.borrow.} -proc getCode*(db: ReadOnlyStateDB, address: EthAddress): ByteRange {.borrow.} +proc getCode*(db: ReadOnlyStateDB, address: EthAddress): seq[byte] {.borrow.} proc hasCodeOrNonce*(db: ReadOnlyStateDB, address: EthAddress): bool {.borrow.} proc accountExists*(db: ReadOnlyStateDB, address: EthAddress): bool {.borrow.} proc isDeadAccount*(db: ReadOnlyStateDB, address: EthAddress): bool {.borrow.} diff --git a/nimbus/db/storage_types.nim b/nimbus/db/storage_types.nim index 0c7340bcb..a296060a1 100644 --- a/nimbus/db/storage_types.nim +++ b/nimbus/db/storage_types.nim @@ -52,25 +52,12 @@ proc contractHashKey*(h: Hash256): DbKey {.inline.} = result.data[1 .. 32] = h.data result.dataEndPos = uint8 32 -const hashHolderKinds = {genericHash, blockHashToScore, transactionHashToBlock} - template toOpenArray*(k: DbKey): openarray[byte] = k.data.toOpenArray(0, int(k.dataEndPos)) proc hash*(k: DbKey): Hash = result = hash(k.toOpenArray) -# TODO: this should be added to Nim -proc `==`*[T](lhs, rhs: openarray[T]): bool = - if lhs.len != rhs.len: - return false - - for i in 0 ..< lhs.len: - if lhs[i] != rhs[i]: - return false - - return true - proc `==`*(a, b: DbKey): bool {.inline.} = a.toOpenArray == b.toOpenArray diff --git a/nimbus/genesis.nim b/nimbus/genesis.nim index 765885b2e..69663e6c1 100644 --- a/nimbus/genesis.nim +++ b/nimbus/genesis.nim @@ -1,6 +1,6 @@ import tables, json, times, - eth/[common, rlp, trie], stint, stew/[byteutils, ranges], + eth/[common, rlp, trie], stint, stew/[byteutils], chronicles, eth/trie/db, db/[db_chain, state_db], genesis_alloc, config, constants @@ -29,7 +29,7 @@ func toAddress(n: UInt256): EthAddress = func decodePrealloc(data: seq[byte]): GenesisAlloc = result = newTable[EthAddress, GenesisAccount]() - for tup in rlp.decode(data.toRange, seq[(UInt256, UInt256)]): + for tup in rlp.decode(data, seq[(UInt256, UInt256)]): result[toAddress(tup[0])] = GenesisAccount(balance: tup[1]) proc customNetPrealloc(genesisBlock: JsonNode): GenesisAlloc = @@ -105,7 +105,7 @@ proc toBlock*(g: Genesis, db: BaseChainDB = nil): BlockHeader = for address, account in g.alloc: sdb.setAccount(address, newAccount(account.nonce, account.balance)) - sdb.setCode(address, account.code.toRange) + sdb.setCode(address, account.code) for k, v in account.storage: sdb.setStorage(address, k, v) diff --git a/nimbus/nimbus.nim b/nimbus/nimbus.nim index 50f1e2f54..5be9d4eaa 100644 --- a/nimbus/nimbus.nim +++ b/nimbus/nimbus.nim @@ -25,9 +25,6 @@ import const nimbusClientId = "nimbus 0.1.0" -when not defined(windows): - from posix import SIGINT, SIGTERM - type NimbusState = enum Starting, Running, Stopping, Stopped diff --git a/nimbus/p2p/chain.nim b/nimbus/p2p/chain.nim index ab19e11d8..19b75efd2 100644 --- a/nimbus/p2p/chain.nim +++ b/nimbus/p2p/chain.nim @@ -1,4 +1,4 @@ -import ../db/db_chain, eth/common, chronicles, ../vm_state, ../vm_types, stew/ranges, +import ../db/db_chain, eth/common, chronicles, ../vm_state, ../vm_types, ../vm/[computation, message], stint, nimcrypto, ../utils, eth/trie/db, ../tracer, ./executor diff --git a/nimbus/p2p/executor.nim b/nimbus/p2p/executor.nim index b79846122..98f64f274 100644 --- a/nimbus/p2p/executor.nim +++ b/nimbus/p2p/executor.nim @@ -1,5 +1,5 @@ import options, sets, - eth/[common, bloom, trie/db], stew/ranges, chronicles, nimcrypto, + eth/[common, bloom, trie/db], chronicles, nimcrypto, ../db/[db_chain, state_db], ../utils, ../constants, ../transaction, ../vm_state, ../vm_types, ../vm_state_transactions, diff --git a/nimbus/rpc/common.nim b/nimbus/rpc/common.nim index d47c287e7..2033380ad 100644 --- a/nimbus/rpc/common.nim +++ b/nimbus/rpc/common.nim @@ -10,7 +10,7 @@ import strutils, nimcrypto, eth/common as eth_common, stint, json_rpc/server, - ../vm_state, ../db/[db_chain, state_db], ../constants, ../config, hexstrings + ../config, hexstrings proc setupCommonRPC*(server: RpcServer) = server.rpc("web3_clientVersion") do() -> string: diff --git a/nimbus/rpc/debug.nim b/nimbus/rpc/debug.nim index 4d8f154bc..643d2fd2e 100644 --- a/nimbus/rpc/debug.nim +++ b/nimbus/rpc/debug.nim @@ -10,8 +10,8 @@ import strutils, json, options, json_rpc/rpcserver, rpc_utils, eth/common, - hexstrings, ../tracer, ../vm_state, ../vm_types, - ../db/[db_chain, storage_types] + hexstrings, ../tracer, ../vm_types, + ../db/[db_chain] type TraceOptions = object diff --git a/nimbus/rpc/hexstrings.nim b/nimbus/rpc/hexstrings.nim index 9232a4f51..8a0470475 100644 --- a/nimbus/rpc/hexstrings.nim +++ b/nimbus/rpc/hexstrings.nim @@ -204,7 +204,7 @@ proc `%`*(value: SymKey): JsonNode = proc `%`*(value: whisper_protocol.Topic): JsonNode = result = %("0x" & value.toHex) -proc `%`*(value: Bytes): JsonNode = +proc `%`*(value: seq[byte]): JsonNode = result = %("0x" & value.toHex) @@ -299,7 +299,7 @@ proc fromJson*(n: JsonNode, argName: string, result: var whisper_protocol.Topic) # Following procs currently required only for testing, the `createRpcSigs` macro # requires it as it will convert the JSON results back to the original Nim # types, but it needs the `fromJson` calls for those specific Nim types to do so -proc fromJson*(n: JsonNode, argName: string, result: var Bytes) = +proc fromJson*(n: JsonNode, argName: string, result: var seq[byte]) = n.kind.expect(JString, argName) let hexStr = n.getStr() if not hexStr.isValidHexData: diff --git a/nimbus/rpc/p2p.nim b/nimbus/rpc/p2p.nim index 2c5d495e9..2ed5b048d 100644 --- a/nimbus/rpc/p2p.nim +++ b/nimbus/rpc/p2p.nim @@ -9,11 +9,11 @@ import strutils, times, options, - json_rpc/rpcserver, hexstrings, stint, stew/byteutils, stew/ranges/typedranges, - eth/[common, keys, rlp, p2p], eth/trie/db, nimcrypto, + json_rpc/rpcserver, hexstrings, stint, stew/byteutils, + eth/[common, keys, rlp, p2p], nimcrypto, ../transaction, ../config, ../vm_state, ../constants, ../vm_types, ../vm_state_transactions, ../utils, - ../db/[db_chain, state_db, storage_types], + ../db/[db_chain, state_db], rpc_types, rpc_utils, ../vm/[message, computation], ../vm/interpreter/vm_forks @@ -224,7 +224,7 @@ proc setupEthRpc*(node: EthereumNode, chain: BaseChainDB, rpcsrv: RpcServer) = addrBytes = toAddress(data) storage = accountDb.getCode(addrBytes) # Easier to return the string manually here rather than expect ByteRange to be marshalled - result = byteutils.toHex(storage.toOpenArray).HexDataStr + result = byteutils.toHex(storage).HexDataStr template sign(privateKey: PrivateKey, message: string): string = # TODO: Is message length encoded as bytes or characters? diff --git a/nimbus/rpc/rpc_types.nim b/nimbus/rpc/rpc_types.nim index 477304a23..1f2ea7f16 100644 --- a/nimbus/rpc/rpc_types.nim +++ b/nimbus/rpc/rpc_types.nim @@ -146,8 +146,8 @@ type ttl*: uint64 # Time-to-live in seconds. timestamp*: uint64 # Unix timestamp of the message generation. topic*: whisper_protocol.Topic # 4 Bytes: Message topic. - payload*: Bytes # Decrypted payload. - padding*: Bytes # (Optional) Padding (byte array of arbitrary length). + payload*: seq[byte] # Decrypted payload. + padding*: seq[byte] # (Optional) Padding (byte array of arbitrary length). pow*: float64 # Proof of work value. hash*: Hash # Hash of the enveloped message. diff --git a/nimbus/rpc/rpc_utils.nim b/nimbus/rpc/rpc_utils.nim index dc8395cf7..6e1517afe 100644 --- a/nimbus/rpc/rpc_utils.nim +++ b/nimbus/rpc/rpc_utils.nim @@ -7,8 +7,8 @@ # This file may not be copied, modified, or distributed except according to # those terms. -import hexstrings, nimcrypto, eth/common, stew/byteutils, - ../db/[db_chain, state_db, storage_types], strutils, +import hexstrings, eth/common, stew/byteutils, + ../db/[db_chain], strutils, ../constants, stint func toAddress*(value: EthAddressStr): EthAddress = hexToPaddedByteArray[20](value.string) diff --git a/nimbus/rpc/waku.nim b/nimbus/rpc/waku.nim index 983b8294d..d20981010 100644 --- a/nimbus/rpc/waku.nim +++ b/nimbus/rpc/waku.nim @@ -1,5 +1,5 @@ import - json_rpc/rpcserver, tables, options, + json_rpc/rpcserver, tables, options, sequtils, eth/[common, rlp, keys, p2p], eth/p2p/rlpx_protocols/waku_protocol, nimcrypto/[sysrand, hmac, sha2, pbkdf2], rpc_types, hexstrings, key_storage @@ -330,7 +330,7 @@ proc setupWakuRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = sigPrivKey: Option[PrivateKey] symKey: Option[SymKey] topic: waku_protocol.Topic - padding: Option[Bytes] + padding: Option[seq[byte]] targetPeer: Option[NodeId] if message.sig.isSome(): diff --git a/nimbus/rpc/whisper.nim b/nimbus/rpc/whisper.nim index 75b5d4bac..c200c2bc7 100644 --- a/nimbus/rpc/whisper.nim +++ b/nimbus/rpc/whisper.nim @@ -1,5 +1,5 @@ import - json_rpc/rpcserver, tables, options, sequtils, + json_rpc/rpcserver, tables, options, eth/[common, rlp, keys, p2p], eth/p2p/rlpx_protocols/whisper_protocol, nimcrypto/[sysrand, hmac, sha2, pbkdf2], rpc_types, hexstrings, key_storage @@ -311,7 +311,7 @@ proc setupWhisperRPC*(node: EthereumNode, keys: KeyStorage, rpcsrv: RpcServer) = sigPrivKey: Option[PrivateKey] symKey: Option[SymKey] topic: whisper_protocol.Topic - padding: Option[Bytes] + padding: Option[seq[byte]] targetPeer: Option[NodeId] if message.sig.isSome(): diff --git a/nimbus/tracer.nim b/nimbus/tracer.nim index 590544d21..5b771ce99 100644 --- a/nimbus/tracer.nim +++ b/nimbus/tracer.nim @@ -1,7 +1,7 @@ import db/[db_chain, state_db, capturedb], eth/common, utils, json, constants, vm_state, vm_types, transaction, p2p/executor, - eth/trie/db, nimcrypto, strutils, stew/ranges, + eth/trie/db, nimcrypto, strutils, chronicles, rpc/hexstrings, launcher, vm/interpreter/vm_forks, ./config @@ -43,7 +43,7 @@ proc captureAccount(n: JsonNode, db: AccountStateDB, address: EthAddress, name: let code = db.getCode(address) jaccount["codeHash"] = %("0x" & ($account.codeHash).toLowerAscii) - jaccount["code"] = %("0x" & toHex(code.toOpenArray, true)) + jaccount["code"] = %("0x" & toHex(code, true)) jaccount["storageRoot"] = %("0x" & ($account.storageRoot).toLowerAscii) var storage = newJObject() diff --git a/nimbus/transaction.nim b/nimbus/transaction.nim index d951c9f39..28b3e9604 100644 --- a/nimbus/transaction.nim +++ b/nimbus/transaction.nim @@ -6,7 +6,7 @@ # at your option. This file may not be copied, modified, or distributed except according to those terms. import - constants, errors, eth/[common, rlp, keys], utils, + constants, errors, eth/[common, keys], utils, ./vm/interpreter/[vm_forks, gas_costs], constants import eth/common/transaction as common_transaction diff --git a/nimbus/utils.nim b/nimbus/utils.nim index 45c864305..826b3de6d 100644 --- a/nimbus/utils.nim +++ b/nimbus/utils.nim @@ -5,7 +5,7 @@ export nimcrypto.`$` 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) + tr.put(rlp.encode(i), rlp.encode(t)) return tr.rootHash template calcTxRoot*(transactions: openArray[Transaction]): Hash256 = diff --git a/nimbus/vm/computation.nim b/nimbus/vm/computation.nim index 51ba53de2..363a1d127 100644 --- a/nimbus/vm/computation.nim +++ b/nimbus/vm/computation.nim @@ -11,7 +11,7 @@ import ../constants, ../errors, ../vm_state, ../vm_types, ./interpreter/[opcode_values, gas_meter, gas_costs, vm_forks], ./code_stream, ./memory, ./message, ./stack, ../db/[state_db, db_chain], - ../utils/header, stew/[byteutils, ranges, ranges/ptr_arith], precompiles, + ../utils/header, stew/[byteutils, ranges/ptr_arith], precompiles, transaction_tracer, ../utils when defined(evmc_enabled): @@ -120,9 +120,9 @@ template selfDestruct*(c: Computation, address: EthAddress) = else: c.execSelfDestruct(address) -template getCode*(c: Computation, address: EthAddress): ByteRange = +template getCode*(c: Computation, address: EthAddress): seq[byte] = when evmc_enabled: - c.host.copyCode(address).toRange + c.host.copyCode(address) else: c.vmState.readOnlyStateDB.getCode(address) @@ -148,7 +148,7 @@ proc newComputation*(vmState: BaseVMState, message: Message, salt= 0.u256): Comp result.code = newCodeStream(message.data) message.data = @[] else: - result.code = newCodeStream(vmState.readOnlyStateDb.getCode(message.codeAddress).toSeq) + result.code = newCodeStream(vmState.readOnlyStateDb.getCode(message.codeAddress)) when evmc_enabled: result.host.init( @@ -213,7 +213,7 @@ proc writeContract*(c: Computation, fork: Fork): bool {.gcsafe.} = if c.gasMeter.gasRemaining >= codeCost: c.gasMeter.consumeGas(codeCost, reason = "Write contract code for CREATE") c.vmState.mutateStateDb: - db.setCode(storageAddr, contractCode.toRange) + db.setCode(storageAddr, contractCode) result = true else: if fork < FkHomestead or fork >= FkByzantium: c.output = @[] diff --git a/nimbus/vm/interpreter/opcodes_impl.nim b/nimbus/vm/interpreter/opcodes_impl.nim index 813d2bcb6..d2a02385b 100644 --- a/nimbus/vm/interpreter/opcodes_impl.nim +++ b/nimbus/vm/interpreter/opcodes_impl.nim @@ -6,8 +6,8 @@ # at your option. This file may not be copied, modified, or distributed except according to those terms. import - strformat, times, sets, stew/ranges, sequtils, options, - chronicles, stint, nimcrypto, stew/ranges/[typedranges, ptr_arith], eth/common, + strformat, times, sets, sequtils, options, + chronicles, stint, nimcrypto, stew/ranges/[ptr_arith], eth/common, ./utils/[macros_procs_opcodes, utils_numeric], ./gas_meter, ./gas_costs, ./opcode_values, ./vm_forks, ../memory, ../stack, ../code_stream, ../computation, @@ -322,7 +322,7 @@ op extCodeCopy, inline = true: reason="ExtCodeCopy fee") let codeBytes = c.getCode(address) - c.memory.writePaddedResult(codeBytes.toOpenArray, memPos, codePos, len) + c.memory.writePaddedResult(codeBytes, memPos, codePos, len) op returnDataSize, inline = true: ## 0x3d, Get size of output data from the previous call from the current environment. diff --git a/nimbus/vm/interpreter/utils/utils_numeric.nim b/nimbus/vm/interpreter/utils/utils_numeric.nim index 184d6f7b3..a805d479b 100644 --- a/nimbus/vm/interpreter/utils/utils_numeric.nim +++ b/nimbus/vm/interpreter/utils/utils_numeric.nim @@ -7,7 +7,7 @@ import macros, - eth/common/eth_types, eth/rlp, + eth/common/eth_types, ../../../constants type diff --git a/nimbus/vm/transaction_tracer.nim b/nimbus/vm/transaction_tracer.nim index 2fa5555cf..e35bf16fa 100644 --- a/nimbus/vm/transaction_tracer.nim +++ b/nimbus/vm/transaction_tracer.nim @@ -2,7 +2,7 @@ import json, strutils, sets, hashes, chronicles, nimcrypto, eth/common, stint, ../vm_types, memory, stack, ../db/state_db, - eth/trie/hexary, stew/ranges/typedranges, + eth/trie/hexary, ./interpreter/opcode_values logScope: diff --git a/nimbus/vm_state_transactions.nim b/nimbus/vm_state_transactions.nim index 8ab4353af..809adc38b 100644 --- a/nimbus/vm_state_transactions.nim +++ b/nimbus/vm_state_transactions.nim @@ -6,7 +6,7 @@ # at your option. This file may not be copied, modified, or distributed except according to those terms. import - stew/ranges/typedranges, options, sets, + options, sets, eth/common, chronicles, ./db/state_db, transaction, vm_types, vm_state, ./vm/[computation, interpreter] diff --git a/premix/hunter.nim b/premix/hunter.nim index 49f89ddeb..9ebe4dd3f 100644 --- a/premix/hunter.nim +++ b/premix/hunter.nim @@ -1,5 +1,5 @@ import - json, downloader, stint, strutils, stew/byteutils, parser, + json, downloader, stint, stew/byteutils, parser, chronicles, ../nimbus/[tracer, vm_state, utils], eth/trie/[trie_defs, db], ../nimbus/db/[db_chain, state_db], ../nimbus/p2p/executor, premixcore, eth/common, configuration, tables, ../nimbus/vm_types, hashes @@ -48,7 +48,7 @@ proc prepareBlockEnv(parent: BlockHeader, thisBlock: Block): TrieDatabaseRef = if acc.codeHash != emptyCodeHash: let codeStr = request("eth_getCode", %[%address.prefixHex, parentNumber]) - let code = hexToSeqByte(codeStr.getStr).toRange + let code = hexToSeqByte(codeStr.getStr) accountDB.setCode(address, code) accountDB.setAccount(address, acc) diff --git a/premix/persist.nim b/premix/persist.nim index 42571f46b..8aaf1606f 100644 --- a/premix/persist.nim +++ b/premix/persist.nim @@ -1,14 +1,14 @@ # use this module to quickly populate db with data from geth/parity import - eth/[common, rlp], stint, stew/byteutils, nimcrypto, + eth/[common, rlp], stint, chronicles, downloader, configuration, ../nimbus/errors import - eth/trie/[hexary, db, trie_defs], + eth/trie/[hexary, db], ../nimbus/db/[storage_types, db_chain, select_backend], - ../nimbus/[genesis, utils], + ../nimbus/[genesis], ../nimbus/p2p/chain const diff --git a/tests/macro_assembler.nim b/tests/macro_assembler.nim index c4270c376..05334f4e3 100644 --- a/tests/macro_assembler.nim +++ b/tests/macro_assembler.nim @@ -224,7 +224,7 @@ proc initComputation(vmState: BaseVMState, tx: Transaction, sender: EthAddress, ) vmState.mutateStateDb: - db.setCode(contractAddress, tx.payload.toRange) + db.setCode(contractAddress, tx.payload) newComputation(vmState, msg) @@ -309,8 +309,8 @@ proc runVM*(blockNumber: Uint256, chainDB: BaseChainDB, boa: Assembler): bool = for kv in boa.storage: let key = kv[0].toHex() let val = kv[1].toHex() - let keyBytes = (@(kv[0])).toRange - let actual = trie.get(keyBytes).toOpenArray().toHex() + let keyBytes = (@(kv[0])) + let actual = trie.get(keyBytes).toHex() let zerosLen = 64 - (actual.len) let value = repeat('0', zerosLen) & actual if val != value: diff --git a/tests/test_helpers.nim b/tests/test_helpers.nim index 911bdef63..5618eb8be 100644 --- a/tests/test_helpers.nim +++ b/tests/test_helpers.nim @@ -136,7 +136,7 @@ proc setupStateDB*(wantedState: JsonNode, stateDB: var AccountStateDB) = stateDB.setStorage(account, fromHex(UInt256, slot), fromHex(UInt256, value.getStr)) let nonce = accountData{"nonce"}.getHexadecimalInt.AccountNonce - let code = accountData{"code"}.getStr.safeHexToSeqByte.toRange + let code = accountData{"code"}.getStr.safeHexToSeqByte let balance = UInt256.fromHex accountData{"balance"}.getStr stateDB.setNonce(account, nonce) @@ -158,7 +158,7 @@ proc verifyStateDB*(wantedState: JsonNode, stateDB: ReadOnlyStateDB) = raise newException(ValidationError, &"{ac} storageDiff: [{slot}] {actualValue.toHex} != {wantedValue.toHex}") let - wantedCode = hexToSeqByte(accountData{"code"}.getStr).toRange + wantedCode = hexToSeqByte(accountData{"code"}.getStr) wantedBalance = UInt256.fromHex accountData{"balance"}.getStr wantedNonce = accountData{"nonce"}.getHexadecimalInt.AccountNonce diff --git a/tests/test_op_env.nim b/tests/test_op_env.nim index 8a89d5c8f..2c3f18afc 100644 --- a/tests/test_op_env.nim +++ b/tests/test_op_env.nim @@ -191,7 +191,7 @@ proc opEnvMain*() = "51602001600a5254516040016014525451606001601e52545160800160285254" & "60a052546016604860003960166000f26000603f556103e756600054600053602002351234") - stateDB.setCode(acc, code.toRange) + stateDB.setCode(acc, code) parent.stateRoot = stateDB.rootHash chainDB.setHead(parent, true) diff --git a/tests/test_state_db.nim b/tests/test_state_db.nim index 3622f367c..a5bd0c3f0 100644 --- a/tests/test_state_db.nim +++ b/tests/test_state_db.nim @@ -25,7 +25,7 @@ proc stateDBMain*() = trie = initHexaryTrie(memDB) stateDB = newAccountStateDB(memDB, trie.rootHash, true) address = hexToByteArray[20]("0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6") - code = hexToSeqByte("0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6").toRange + code = hexToSeqByte("0x0f572e5295c57f15886f9b263e2f6d2d6c7b5ec6") rootHash: KeccakHash test "accountExists and isDeadAccount": @@ -48,7 +48,7 @@ proc stateDBMain*() = stateDB.setNonce(address, 0) check stateDB.isDeadAccount(address) == false - stateDB.setCode(address, BytesRange()) + stateDB.setCode(address, []) check stateDB.isDeadAccount(address) == true check stateDB.accountExists(address) == true @@ -128,7 +128,7 @@ proc stateDBMain*() = check ac.getCodeHash(addr2) == emptyAcc.codeHash check ac.getBalance(addr2) == emptyAcc.balance check ac.getNonce(addr2) == emptyAcc.nonce - check ac.getCode(addr2) == BytesRange() + check ac.getCode(addr2) == [] check ac.getCodeSize(addr2) == 0 check ac.getCommittedStorage(addr2, 1.u256) == 0.u256 check ac.getStorage(addr2, 1.u256) == 0.u256 diff --git a/vendor/nim-eth b/vendor/nim-eth index 7c709551a..0816bd1e9 160000 --- a/vendor/nim-eth +++ b/vendor/nim-eth @@ -1 +1 @@ -Subproject commit 7c709551a5ad2a42f66ca004cdc064bb70b60bd1 +Subproject commit 0816bd1e945ef4fa3d030c9c6cc27f260bbe639b diff --git a/vendor/nim-rocksdb b/vendor/nim-rocksdb index 08fec021c..8da2f1195 160000 --- a/vendor/nim-rocksdb +++ b/vendor/nim-rocksdb @@ -1 +1 @@ -Subproject commit 08fec021c0f28f63d1221d40a655078b5b923d1b +Subproject commit 8da2f119514d933f24efc009182cdea24a5fe107 diff --git a/vendor/nim-stew b/vendor/nim-stew index ff755bbf7..2a1df5d2d 160000 --- a/vendor/nim-stew +++ b/vendor/nim-stew @@ -1 +1 @@ -Subproject commit ff755bbf75d0d3f387b9f352b241d98eb3372323 +Subproject commit 2a1df5d2dd4963369f2dbae583ab714a1601a8cd diff --git a/wrappers/libnimbus.nim b/wrappers/libnimbus.nim index 82f9fa460..b31bbb20c 100644 --- a/wrappers/libnimbus.nim +++ b/wrappers/libnimbus.nim @@ -278,8 +278,8 @@ proc nimbus_post(message: ptr CPostMessage): bool {.exportc, dynlib.} = sigPrivKey: Option[PrivateKey] asymKey: Option[PublicKey] symKey: Option[SymKey] - padding: Option[Bytes] - payload: Bytes + padding: Option[seq[byte]] + payload: seq[byte] if not message.pubKey.isNil() and not message.symKeyID.isNil(): warn "Both symmetric and asymmetric keys are provided, choose one." @@ -473,7 +473,7 @@ proc nimbus_post_public(channel: cstring, payload: cstring) var ctx: HMAC[sha256] var symKey: SymKey - var npayload = cast[Bytes]($payload) + var npayload = cast[seq[byte]]($payload) discard ctx.pbkdf2($channel, "", 65356, symKey) let channelHash = digest(keccak256, $channel)