Merge branch 'jangko-dao_fork'

This commit is contained in:
Ștefan Talpalaru 2019-04-07 19:29:52 +02:00
commit 4ec1af0fe7
No known key found for this signature in database
GPG Key ID: CBF7934204F1B6F9
9 changed files with 2735 additions and 7 deletions

View File

@ -12,6 +12,8 @@ PersistBlockTests
+ block1431916.json OK
+ block146675.json OK
+ block1487668.json OK
+ block1920000.json OK
+ block1927662.json OK
+ block196647.json OK
+ block226147.json OK
+ block226522.json OK
@ -41,7 +43,7 @@ PersistBlockTests
+ block97.json OK
+ block98.json OK
```
OK: 38/38 Fail: 0/38 Skip: 0/38
OK: 40/40 Fail: 0/40 Skip: 0/40
---TOTAL---
OK: 38/38 Fail: 0/38 Skip: 0/38
OK: 40/40 Fail: 0/40 Skip: 0/40

View File

@ -10,12 +10,13 @@ import
ranges, state_db, eth/trie/[hexary, db],
eth/[common, rlp], byteutils, chronicles,
../errors, ../constants, ./storage_types,
../utils
../utils, ../config
type
BaseChainDB* = ref object
db* : TrieDatabaseRef
pruneTrie*: bool
config* : ChainConfig
#KeyType = enum
# blockNumberToHash
@ -25,10 +26,11 @@ type
blockNumber: BlockNumber
index: int
proc newBaseChainDB*(db: TrieDatabaseRef, pruneTrie: bool = true): BaseChainDB =
proc newBaseChainDB*(db: TrieDatabaseRef, pruneTrie: bool = true, id: PublicNetwork = MainNet): BaseChainDB =
new(result)
result.db = db
result.pruneTrie = pruneTrie
result.config = publicChainConfig(id)
proc `$`*(db: BaseChainDB): string =
result = "BaseChainDB"

View File

@ -66,7 +66,9 @@ proc start(): NimbusObject =
createDir(conf.dataDir)
let trieDB = trieDB newChainDb(conf.dataDir)
let chainDB = newBaseChainDB(trieDB, conf.prune == PruneMode.Full)
let chainDB = newBaseChainDB(trieDB,
conf.prune == PruneMode.Full,
conf.net.networkId.toPublicNetwork())
if canonicalHeadHashKey().toOpenArray notin trieDB:
initializeEmptyDb(chainDb)

143
nimbus/p2p/dao.nim Normal file
View File

@ -0,0 +1,143 @@
import eth/common, byteutils, ../db/state_db
const
# DAOForkBlockExtra is the block header extra-data field to set for the DAO fork
# point and a number of consecutive blocks to allow fast/light syncers to correctly
# pick the side they want ("dao-hard-fork").
DAOForkBlockExtra* = "0x64616f2d686172642d666f726b"
# DAOForkExtraRange is the number of consecutive blocks from the DAO fork point
# to override the extra-data in to prevent no-fork attacks.
DAOForkExtraRange* = 10
# DAORefundContract is the address of the refund contract to send DAO balances to.
DAORefundContract: EthAddress = hexToByteArray[20]("0xbf4ed7b27f1d666546e30d74d50d173d20bca754")
DAODrainList = [
hexToByteArray[20]("0xd4fe7bc31cedb7bfb8a345f31e668033056b2728"),
hexToByteArray[20]("0xb3fb0e5aba0e20e5c49d252dfd30e102b171a425"),
hexToByteArray[20]("0x2c19c7f9ae8b751e37aeb2d93a699722395ae18f"),
hexToByteArray[20]("0xecd135fa4f61a655311e86238c92adcd779555d2"),
hexToByteArray[20]("0x1975bd06d486162d5dc297798dfc41edd5d160a7"),
hexToByteArray[20]("0xa3acf3a1e16b1d7c315e23510fdd7847b48234f6"),
hexToByteArray[20]("0x319f70bab6845585f412ec7724b744fec6095c85"),
hexToByteArray[20]("0x06706dd3f2c9abf0a21ddcc6941d9b86f0596936"),
hexToByteArray[20]("0x5c8536898fbb74fc7445814902fd08422eac56d0"),
hexToByteArray[20]("0x6966ab0d485353095148a2155858910e0965b6f9"),
hexToByteArray[20]("0x779543a0491a837ca36ce8c635d6154e3c4911a6"),
hexToByteArray[20]("0x2a5ed960395e2a49b1c758cef4aa15213cfd874c"),
hexToByteArray[20]("0x5c6e67ccd5849c0d29219c4f95f1a7a93b3f5dc5"),
hexToByteArray[20]("0x9c50426be05db97f5d64fc54bf89eff947f0a321"),
hexToByteArray[20]("0x200450f06520bdd6c527622a273333384d870efb"),
hexToByteArray[20]("0xbe8539bfe837b67d1282b2b1d61c3f723966f049"),
hexToByteArray[20]("0x6b0c4d41ba9ab8d8cfb5d379c69a612f2ced8ecb"),
hexToByteArray[20]("0xf1385fb24aad0cd7432824085e42aff90886fef5"),
hexToByteArray[20]("0xd1ac8b1ef1b69ff51d1d401a476e7e612414f091"),
hexToByteArray[20]("0x8163e7fb499e90f8544ea62bbf80d21cd26d9efd"),
hexToByteArray[20]("0x51e0ddd9998364a2eb38588679f0d2c42653e4a6"),
hexToByteArray[20]("0x627a0a960c079c21c34f7612d5d230e01b4ad4c7"),
hexToByteArray[20]("0xf0b1aa0eb660754448a7937c022e30aa692fe0c5"),
hexToByteArray[20]("0x24c4d950dfd4dd1902bbed3508144a54542bba94"),
hexToByteArray[20]("0x9f27daea7aca0aa0446220b98d028715e3bc803d"),
hexToByteArray[20]("0xa5dc5acd6a7968a4554d89d65e59b7fd3bff0f90"),
hexToByteArray[20]("0xd9aef3a1e38a39c16b31d1ace71bca8ef58d315b"),
hexToByteArray[20]("0x63ed5a272de2f6d968408b4acb9024f4cc208ebf"),
hexToByteArray[20]("0x6f6704e5a10332af6672e50b3d9754dc460dfa4d"),
hexToByteArray[20]("0x77ca7b50b6cd7e2f3fa008e24ab793fd56cb15f6"),
hexToByteArray[20]("0x492ea3bb0f3315521c31f273e565b868fc090f17"),
hexToByteArray[20]("0x0ff30d6de14a8224aa97b78aea5388d1c51c1f00"),
hexToByteArray[20]("0x9ea779f907f0b315b364b0cfc39a0fde5b02a416"),
hexToByteArray[20]("0xceaeb481747ca6c540a000c1f3641f8cef161fa7"),
hexToByteArray[20]("0xcc34673c6c40e791051898567a1222daf90be287"),
hexToByteArray[20]("0x579a80d909f346fbfb1189493f521d7f48d52238"),
hexToByteArray[20]("0xe308bd1ac5fda103967359b2712dd89deffb7973"),
hexToByteArray[20]("0x4cb31628079fb14e4bc3cd5e30c2f7489b00960c"),
hexToByteArray[20]("0xac1ecab32727358dba8962a0f3b261731aad9723"),
hexToByteArray[20]("0x4fd6ace747f06ece9c49699c7cabc62d02211f75"),
hexToByteArray[20]("0x440c59b325d2997a134c2c7c60a8c61611212bad"),
hexToByteArray[20]("0x4486a3d68fac6967006d7a517b889fd3f98c102b"),
hexToByteArray[20]("0x9c15b54878ba618f494b38f0ae7443db6af648ba"),
hexToByteArray[20]("0x27b137a85656544b1ccb5a0f2e561a5703c6a68f"),
hexToByteArray[20]("0x21c7fdb9ed8d291d79ffd82eb2c4356ec0d81241"),
hexToByteArray[20]("0x23b75c2f6791eef49c69684db4c6c1f93bf49a50"),
hexToByteArray[20]("0x1ca6abd14d30affe533b24d7a21bff4c2d5e1f3b"),
hexToByteArray[20]("0xb9637156d330c0d605a791f1c31ba5890582fe1c"),
hexToByteArray[20]("0x6131c42fa982e56929107413a9d526fd99405560"),
hexToByteArray[20]("0x1591fc0f688c81fbeb17f5426a162a7024d430c2"),
hexToByteArray[20]("0x542a9515200d14b68e934e9830d91645a980dd7a"),
hexToByteArray[20]("0xc4bbd073882dd2add2424cf47d35213405b01324"),
hexToByteArray[20]("0x782495b7b3355efb2833d56ecb34dc22ad7dfcc4"),
hexToByteArray[20]("0x58b95c9a9d5d26825e70a82b6adb139d3fd829eb"),
hexToByteArray[20]("0x3ba4d81db016dc2890c81f3acec2454bff5aada5"),
hexToByteArray[20]("0xb52042c8ca3f8aa246fa79c3feaa3d959347c0ab"),
hexToByteArray[20]("0xe4ae1efdfc53b73893af49113d8694a057b9c0d1"),
hexToByteArray[20]("0x3c02a7bc0391e86d91b7d144e61c2c01a25a79c5"),
hexToByteArray[20]("0x0737a6b837f97f46ebade41b9bc3e1c509c85c53"),
hexToByteArray[20]("0x97f43a37f595ab5dd318fb46e7a155eae057317a"),
hexToByteArray[20]("0x52c5317c848ba20c7504cb2c8052abd1fde29d03"),
hexToByteArray[20]("0x4863226780fe7c0356454236d3b1c8792785748d"),
hexToByteArray[20]("0x5d2b2e6fcbe3b11d26b525e085ff818dae332479"),
hexToByteArray[20]("0x5f9f3392e9f62f63b8eac0beb55541fc8627f42c"),
hexToByteArray[20]("0x057b56736d32b86616a10f619859c6cd6f59092a"),
hexToByteArray[20]("0x9aa008f65de0b923a2a4f02012ad034a5e2e2192"),
hexToByteArray[20]("0x304a554a310c7e546dfe434669c62820b7d83490"),
hexToByteArray[20]("0x914d1b8b43e92723e64fd0a06f5bdb8dd9b10c79"),
hexToByteArray[20]("0x4deb0033bb26bc534b197e61d19e0733e5679784"),
hexToByteArray[20]("0x07f5c1e1bc2c93e0402f23341973a0e043f7bf8a"),
hexToByteArray[20]("0x35a051a0010aba705c9008d7a7eff6fb88f6ea7b"),
hexToByteArray[20]("0x4fa802324e929786dbda3b8820dc7834e9134a2a"),
hexToByteArray[20]("0x9da397b9e80755301a3b32173283a91c0ef6c87e"),
hexToByteArray[20]("0x8d9edb3054ce5c5774a420ac37ebae0ac02343c6"),
hexToByteArray[20]("0x0101f3be8ebb4bbd39a2e3b9a3639d4259832fd9"),
hexToByteArray[20]("0x5dc28b15dffed94048d73806ce4b7a4612a1d48f"),
hexToByteArray[20]("0xbcf899e6c7d9d5a215ab1e3444c86806fa854c76"),
hexToByteArray[20]("0x12e626b0eebfe86a56d633b9864e389b45dcb260"),
hexToByteArray[20]("0xa2f1ccba9395d7fcb155bba8bc92db9bafaeade7"),
hexToByteArray[20]("0xec8e57756626fdc07c63ad2eafbd28d08e7b0ca5"),
hexToByteArray[20]("0xd164b088bd9108b60d0ca3751da4bceb207b0782"),
hexToByteArray[20]("0x6231b6d0d5e77fe001c2a460bd9584fee60d409b"),
hexToByteArray[20]("0x1cba23d343a983e9b5cfd19496b9a9701ada385f"),
hexToByteArray[20]("0xa82f360a8d3455c5c41366975bde739c37bfeb8a"),
hexToByteArray[20]("0x9fcd2deaff372a39cc679d5c5e4de7bafb0b1339"),
hexToByteArray[20]("0x005f5cee7a43331d5a3d3eec71305925a62f34b6"),
hexToByteArray[20]("0x0e0da70933f4c7849fc0d203f5d1d43b9ae4532d"),
hexToByteArray[20]("0xd131637d5275fd1a68a3200f4ad25c71a2a9522e"),
hexToByteArray[20]("0xbc07118b9ac290e4622f5e77a0853539789effbe"),
hexToByteArray[20]("0x47e7aa56d6bdf3f36be34619660de61275420af8"),
hexToByteArray[20]("0xacd87e28b0c9d1254e868b81cba4cc20d9a32225"),
hexToByteArray[20]("0xadf80daec7ba8dcf15392f1ac611fff65d94f880"),
hexToByteArray[20]("0x5524c55fb03cf21f549444ccbecb664d0acad706"),
hexToByteArray[20]("0x40b803a9abce16f50f36a77ba41180eb90023925"),
hexToByteArray[20]("0xfe24cdd8648121a43a7c86d289be4dd2951ed49f"),
hexToByteArray[20]("0x17802f43a0137c506ba92291391a8a8f207f487d"),
hexToByteArray[20]("0x253488078a4edf4d6f42f113d1e62836a942cf1a"),
hexToByteArray[20]("0x86af3e9626fce1957c82e88cbf04ddf3a2ed7915"),
hexToByteArray[20]("0xb136707642a4ea12fb4bae820f03d2562ebff487"),
hexToByteArray[20]("0xdbe9b615a3ae8709af8b93336ce9b477e4ac0940"),
hexToByteArray[20]("0xf14c14075d6c4ed84b86798af0956deef67365b5"),
hexToByteArray[20]("0xca544e5c4687d109611d0f8f928b53a25af72448"),
hexToByteArray[20]("0xaeeb8ff27288bdabc0fa5ebb731b6f409507516c"),
hexToByteArray[20]("0xcbb9d3703e651b0d496cdefb8b92c25aeb2171f7"),
hexToByteArray[20]("0x6d87578288b6cb5549d5076a207456a1f6a63dc0"),
hexToByteArray[20]("0xb2c6f0dfbb716ac562e2d85d6cb2f8d5ee87603e"),
hexToByteArray[20]("0xaccc230e8a6e5be9160b8cdf2864dd2a001c28b6"),
hexToByteArray[20]("0x2b3455ec7fedf16e646268bf88846bd7a2319bb2"),
hexToByteArray[20]("0x4613f3bca5c44ea06337a9e439fbc6d42e501d0a"),
hexToByteArray[20]("0xd343b217de44030afaa275f54d31a9317c7f441e"),
hexToByteArray[20]("0x84ef4b2357079cd7a7c69fd7a37cd0609a679106"),
hexToByteArray[20]("0xda2fef9e4a3230988ff17df2165440f37e8b1708"),
hexToByteArray[20]("0xf4c64518ea10f995918a454158c6b61407ea345c"),
hexToByteArray[20]("0x7602b46df5390e432ef1c307d4f2c9ff6d65cc97"),
hexToByteArray[20]("0xbb9bc244d798123fde783fcc1c72d3bb8c189413"),
hexToByteArray[20]("0x807640a13483f8ac783c557fcdf27be11ea4ac7a")
]
# ApplyDAOHardFork modifies the state database according to the DAO hard-fork
# rules, transferring all balances of a set of DAO accounts to a single refund
# contract.
proc applyDAOHardFork*(statedb: var AccountStateDB) =
const zero = 0.u256
# Move every DAO account and extra-balance account funds into the refund contract
for address in DAODrainList:
statedb.addBalance(DAORefundContract, statedb.getBalance(address))
statedb.setBalance(address, zero)

View File

@ -4,7 +4,8 @@ import options,
../utils, ../constants, ../transaction,
../vm_state, ../vm_types, ../vm_state_transactions,
../vm/[computation, message],
../vm/interpreter/vm_forks
../vm/interpreter/vm_forks,
./dao
proc processTransaction*(tx: Transaction, sender: EthAddress, vmState: BaseVMState, forkOverride=none(Fork)): GasInt =
## Process the transaction, write the results to db.
@ -72,6 +73,10 @@ proc makeReceipt(vmState: BaseVMState, cumulativeGasUsed: GasInt, fork = FkFront
proc processBlock*(chainDB: BaseChainDB, header: BlockHeader, body: BlockBody, vmState: BaseVMState): ValidationResult =
let blockReward = 5.u256 * pow(10.u256, 18) # 5 ETH
if chainDB.config.daoForkSupport and header.blockNumber == chainDB.config.daoForkBlock:
vmState.mutateStateDB:
db.applyDAOHardFork()
if body.transactions.calcTxRoot != header.txRoot:
debug "Mismatched txRoot", blockNumber=header.blockNumber
return ValidationResult.Error

View File

@ -182,7 +182,7 @@ proc postExecuteVM(computation: BaseComputation) =
if computation.isSuccess and computation.msg.isCreate:
let fork = computation.getFork
let contractFailed = not computation.writeContract(fork)
if contractFailed and fork == FkHomestead:
if contractFailed and fork >= FkHomestead:
computation.setError(&"writeContract failed, depth={computation.msg.depth}", true)
if computation.isSuccess:

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -91,6 +91,8 @@ proc main() =
chainDB.dumpTest(1417555) # writepadded regression zero len
chainDB.dumpTest(1_431_916) # deep recursion stack overflow problem
chainDB.dumpTest(1_487_668) # getScore uint64 vs uint256 overflow
chainDB.dumpTest(1_920_000) # the DAO fork
chainDB.dumpTest(1_927_662) # fork comparison bug in postExecuteVM
when isMainModule:
var message: string