Merge branch 'master' into split
This commit is contained in:
commit
81b57ceddb
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -787,7 +787,7 @@ name = "ethjson"
|
|||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clippy 0.0.103 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ethcore-util 1.8.0",
|
"ethcore-bigint 0.1.3",
|
||||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"authorityRound": {
|
"authorityRound": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"stepDuration": 1,
|
"stepDuration": 1,
|
||||||
"startStep": 2,
|
"startStep": 2,
|
||||||
"validators": {
|
"validators": {
|
||||||
@ -17,6 +16,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"basicAuthority": {
|
"basicAuthority": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"validators": {
|
"validators": {
|
||||||
"list": ["0x9cce34f7ab185c7aba1b7c8140d620b4bda941d6"]
|
"list": ["0x9cce34f7ab185c7aba1b7c8140d620b4bda941d6"]
|
||||||
@ -12,6 +11,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0100000",
|
"accountStartNonce": "0x0100000",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -4,12 +4,14 @@
|
|||||||
"null": null
|
"null": null
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x2"
|
"networkID" : "0x2"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"seal": {
|
"seal": {
|
||||||
"generic": "0x"
|
"generic": "0x"
|
||||||
},
|
},
|
||||||
|
@ -4,15 +4,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": 1150000,
|
"homesteadTransition": 1150000,
|
||||||
"eip150Transition": 2500000,
|
"eip150Transition": 2500000,
|
||||||
"eip155Transition": 3000000,
|
|
||||||
"eip160Transition": 3000000,
|
"eip160Transition": 3000000,
|
||||||
"ecip1010PauseTransition": 3000000,
|
"ecip1010PauseTransition": 3000000,
|
||||||
"ecip1010ContinueTransition": 5000000,
|
"ecip1010ContinueTransition": 5000000,
|
||||||
@ -24,6 +20,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
@ -31,6 +30,8 @@
|
|||||||
"chainID": "0x3d",
|
"chainID": "0x3d",
|
||||||
"forkBlock": "0x1d4c00",
|
"forkBlock": "0x1d4c00",
|
||||||
"forkCanonHash": "0x94365e3a8c0b35089c1d1195081fe7489b528a84b22199c916180db8b28ade7f",
|
"forkCanonHash": "0x94365e3a8c0b35089c1d1195081fe7489b528a84b22199c916180db8b28ade7f",
|
||||||
|
"eip155Transition": 3000000,
|
||||||
|
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff"
|
||||||
},
|
},
|
||||||
|
@ -3,15 +3,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x0",
|
"homesteadTransition": "0x0",
|
||||||
"eip150Transition": "0x0",
|
"eip150Transition": "0x0",
|
||||||
"eip155Transition": "0x7fffffffffffffff",
|
|
||||||
"eip160Transition": "0x7fffffffffffffff",
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
"eip161abcTransition": "0x7fffffffffffffff",
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
"eip161dTransition": "0x7fffffffffffffff",
|
"eip161dTransition": "0x7fffffffffffffff",
|
||||||
@ -20,12 +16,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x1",
|
"networkID" : "0x1",
|
||||||
"eip98Transition": "0x7fffffffffffffff",
|
"eip98Transition": "0x7fffffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffffff"
|
"eip86Transition": "0x7fffffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -3,15 +3,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x0",
|
"homesteadTransition": "0x0",
|
||||||
"eip150Transition": "0x0",
|
"eip150Transition": "0x0",
|
||||||
"eip155Transition": "0x7fffffffffffffff",
|
|
||||||
"eip160Transition": "0x0",
|
"eip160Transition": "0x0",
|
||||||
"eip161abcTransition": "0x0",
|
"eip161abcTransition": "0x0",
|
||||||
"eip161dTransition": "0x0",
|
"eip161dTransition": "0x0",
|
||||||
@ -20,12 +16,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x1",
|
"networkID" : "0x1",
|
||||||
"eip98Transition": "0x7fffffffffffffff",
|
"eip98Transition": "0x7fffffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffffff"
|
"eip86Transition": "0x7fffffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -4,19 +4,15 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"difficultyIncrementDivisor": "60",
|
"difficultyIncrementDivisor": "60",
|
||||||
"durationLimit": "0x3C",
|
"durationLimit": "0x3C",
|
||||||
"blockReward": "0x6f05b59d3b200000",
|
|
||||||
"registrar" : "0x6c221ca53705f3497ec90ca7b84c59ae7382fc21",
|
|
||||||
"homesteadTransition": "0x30d40",
|
"homesteadTransition": "0x30d40",
|
||||||
"difficultyHardforkTransition": "0x59d9",
|
"difficultyHardforkTransition": "0x59d9",
|
||||||
"difficultyHardforkBoundDivisor": "0x0200",
|
"difficultyHardforkBoundDivisor": "0x0200",
|
||||||
"bombDefuseTransition": "0x30d40",
|
"bombDefuseTransition": "0x30d40",
|
||||||
"eip150Transition": "0x927C0",
|
"eip150Transition": "0x927C0",
|
||||||
"eip155Transition": "0x927C0",
|
|
||||||
"eip160Transition": "0x927C0",
|
"eip160Transition": "0x927C0",
|
||||||
"eip161abcTransition": "0x927C0",
|
"eip161abcTransition": "0x927C0",
|
||||||
"eip161dTransition": "0x927C0"
|
"eip161dTransition": "0x927C0"
|
||||||
@ -24,6 +20,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x6f05b59d3b200000",
|
||||||
|
"registrar" : "0x6c221ca53705f3497ec90ca7b84c59ae7382fc21",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
@ -31,7 +30,8 @@
|
|||||||
"chainID": "0x2",
|
"chainID": "0x2",
|
||||||
"subprotocolName": "exp",
|
"subprotocolName": "exp",
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff",
|
||||||
|
"eip155Transition": "0x927C0"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -4,12 +4,9 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xe3389675d0338462dC76C6f9A3e432550c36A142",
|
|
||||||
"homesteadTransition": "0x118c30",
|
"homesteadTransition": "0x118c30",
|
||||||
"daoHardforkTransition": "0x1d4c00",
|
"daoHardforkTransition": "0x1d4c00",
|
||||||
"daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754",
|
"daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754",
|
||||||
@ -132,7 +129,6 @@
|
|||||||
"0x807640a13483f8ac783c557fcdf27be11ea4ac7a"
|
"0x807640a13483f8ac783c557fcdf27be11ea4ac7a"
|
||||||
],
|
],
|
||||||
"eip150Transition": "0x259518",
|
"eip150Transition": "0x259518",
|
||||||
"eip155Transition": 2675000,
|
|
||||||
"eip160Transition": 2675000,
|
"eip160Transition": 2675000,
|
||||||
"eip161abcTransition": 2675000,
|
"eip161abcTransition": 2675000,
|
||||||
"eip161dTransition": 2675000,
|
"eip161dTransition": 2675000,
|
||||||
@ -141,12 +137,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xe3389675d0338462dC76C6f9A3e432550c36A142",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x1",
|
"networkID" : "0x1",
|
||||||
"forkBlock": "0x1d4c00",
|
"forkBlock": "0x1d4c00",
|
||||||
"forkCanonHash": "0x4985f5ca3d2afbec36529aa96f74de3cc10a2a4a6c44f2157a57d2c6059a11bb",
|
"forkCanonHash": "0x4985f5ca3d2afbec36529aa96f74de3cc10a2a4a6c44f2157a57d2c6059a11bb",
|
||||||
|
"eip155Transition": 2675000,
|
||||||
|
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff"
|
||||||
},
|
},
|
||||||
|
@ -3,12 +3,9 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x118c30",
|
"homesteadTransition": "0x118c30",
|
||||||
"daoHardforkTransition": "0x1d4c00",
|
"daoHardforkTransition": "0x1d4c00",
|
||||||
"daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754",
|
"daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754",
|
||||||
@ -131,7 +128,6 @@
|
|||||||
"0x807640a13483f8ac783c557fcdf27be11ea4ac7a"
|
"0x807640a13483f8ac783c557fcdf27be11ea4ac7a"
|
||||||
],
|
],
|
||||||
"eip150Transition": "0x7fffffffffffffff",
|
"eip150Transition": "0x7fffffffffffffff",
|
||||||
"eip155Transition": "0x7fffffffffffffff",
|
|
||||||
"eip160Transition": "0x7fffffffffffffff",
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
"eip161abcTransition": "0x7fffffffffffffff",
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
"eip161dTransition": "0x7fffffffffffffff"
|
"eip161dTransition": "0x7fffffffffffffff"
|
||||||
@ -139,12 +135,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x1",
|
"networkID" : "0x1",
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -3,15 +3,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x7fffffffffffffff",
|
"homesteadTransition": "0x7fffffffffffffff",
|
||||||
"eip150Transition": "0x7fffffffffffffff",
|
"eip150Transition": "0x7fffffffffffffff",
|
||||||
"eip155Transition": "0x7fffffffffffffff",
|
|
||||||
"eip160Transition": "0x7fffffffffffffff",
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
"eip161abcTransition": "0x7fffffffffffffff",
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
"eip161dTransition": "0x7fffffffffffffff"
|
"eip161dTransition": "0x7fffffffffffffff"
|
||||||
@ -19,12 +15,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x1",
|
"networkID" : "0x1",
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -3,15 +3,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x0",
|
"homesteadTransition": "0x0",
|
||||||
"eip150Transition": "0x7fffffffffffffff",
|
"eip150Transition": "0x7fffffffffffffff",
|
||||||
"eip155Transition": "0x7fffffffffffffff",
|
|
||||||
"eip160Transition": "0x7fffffffffffffff",
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
"eip161abcTransition": "0x7fffffffffffffff",
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
"eip161dTransition": "0x7fffffffffffffff"
|
"eip161dTransition": "0x7fffffffffffffff"
|
||||||
@ -19,12 +15,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x1",
|
"networkID" : "0x1",
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -4,10 +4,7 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"authorityRound": {
|
"authorityRound": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x400",
|
|
||||||
"registrar" : "0xfAb104398BBefbd47752E7702D9fE23047E1Bca3",
|
|
||||||
"stepDuration": "4",
|
"stepDuration": "4",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"validators" : {
|
"validators" : {
|
||||||
"list": [
|
"list": [
|
||||||
"0x00D6Cc1BA9cf89BD2e58009741f4F7325BAdc0ED",
|
"0x00D6Cc1BA9cf89BD2e58009741f4F7325BAdc0ED",
|
||||||
@ -25,16 +22,19 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"validateScoreTransition": 1000000,
|
"validateScoreTransition": 1000000,
|
||||||
"eip155Transition": 1000000,
|
|
||||||
"validateStepTransition": 1500000
|
"validateStepTransition": 1500000
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
"maximumExtraDataSize": "0x20",
|
"gasLimitBoundDivisor": "0x400",
|
||||||
|
"registrar" : "0xfAb104398BBefbd47752E7702D9fE23047E1Bca3",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x2A",
|
"networkID" : "0x2A",
|
||||||
"validateReceiptsTransition" : 1000000
|
"validateReceiptsTransition" : 1000000,
|
||||||
|
"eip155Transition": 1000000
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -3,15 +3,12 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x0",
|
"homesteadTransition": "0x0",
|
||||||
"eip150Transition": "0x0",
|
"eip150Transition": "0x0",
|
||||||
"eip155Transition": "0x0",
|
|
||||||
"eip160Transition": "0x0",
|
"eip160Transition": "0x0",
|
||||||
"eip161abcTransition": "0x0",
|
"eip161abcTransition": "0x0",
|
||||||
"eip161dTransition": "0x0",
|
"eip161dTransition": "0x0",
|
||||||
@ -20,6 +17,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
@ -27,7 +27,8 @@
|
|||||||
"eip98Transition": "0x0",
|
"eip98Transition": "0x0",
|
||||||
"eip86Transition": "0x0",
|
"eip86Transition": "0x0",
|
||||||
"eip140Transition": "0x0",
|
"eip140Transition": "0x0",
|
||||||
"eip210Transition": "0x0"
|
"eip210Transition": "0x0",
|
||||||
|
"eip155Transition": "0x0"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -4,15 +4,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar": "0x52dff57a8a1532e6afb3dc07e2af58bb9eb05b3d",
|
|
||||||
"homesteadTransition": 494000,
|
"homesteadTransition": 494000,
|
||||||
"eip150Transition": 1783000,
|
"eip150Transition": 1783000,
|
||||||
"eip155Transition": 1915000,
|
|
||||||
"eip160Transition": 1915000,
|
"eip160Transition": 1915000,
|
||||||
"ecip1010PauseTransition": 1915000,
|
"ecip1010PauseTransition": 1915000,
|
||||||
"ecip1010ContinueTransition": 3415000,
|
"ecip1010ContinueTransition": 3415000,
|
||||||
@ -23,6 +19,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar": "0x52dff57a8a1532e6afb3dc07e2af58bb9eb05b3d",
|
||||||
"accountStartNonce": "0x0100000",
|
"accountStartNonce": "0x0100000",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
@ -30,6 +29,8 @@
|
|||||||
"chainID": "0x3e",
|
"chainID": "0x3e",
|
||||||
"forkBlock": "0x1b34d8",
|
"forkBlock": "0x1b34d8",
|
||||||
"forkCanonHash": "0xf376243aeff1f256d970714c3de9fd78fa4e63cf63e32a51fe1169e375d98145",
|
"forkCanonHash": "0xf376243aeff1f256d970714c3de9fd78fa4e63cf63e32a51fe1169e375d98145",
|
||||||
|
"eip155Transition": 1915000,
|
||||||
|
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff"
|
||||||
},
|
},
|
||||||
|
@ -3,15 +3,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x08",
|
"durationLimit": "0x08",
|
||||||
"blockReward": "0x14D1120D7B160000",
|
|
||||||
"registrar": "5e70c0bbcd5636e0f9f9316e9f8633feb64d4050",
|
|
||||||
"homesteadTransition": "0x7fffffffffffffff",
|
"homesteadTransition": "0x7fffffffffffffff",
|
||||||
"eip150Transition": "0x7fffffffffffffff",
|
"eip150Transition": "0x7fffffffffffffff",
|
||||||
"eip155Transition": "0x7fffffffffffffff",
|
|
||||||
"eip160Transition": "0x7fffffffffffffff",
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
"eip161abcTransition": "0x7fffffffffffffff",
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
"eip161dTransition": "0x7fffffffffffffff"
|
"eip161dTransition": "0x7fffffffffffffff"
|
||||||
@ -19,12 +15,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x14D1120D7B160000",
|
||||||
|
"registrar": "5e70c0bbcd5636e0f9f9316e9f8633feb64d4050",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x0400",
|
"maximumExtraDataSize": "0x0400",
|
||||||
"minGasLimit": "125000",
|
"minGasLimit": "125000",
|
||||||
"networkID" : "0x0",
|
"networkID" : "0x0",
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -4,15 +4,11 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar": "0x81a4b044831c4f12ba601adb9274516939e9b8a2",
|
|
||||||
"homesteadTransition": 0,
|
"homesteadTransition": 0,
|
||||||
"eip150Transition": 0,
|
"eip150Transition": 0,
|
||||||
"eip155Transition": 10,
|
|
||||||
"eip160Transition": 10,
|
"eip160Transition": 10,
|
||||||
"eip161abcTransition": 10,
|
"eip161abcTransition": 10,
|
||||||
"eip161dTransition": 10,
|
"eip161dTransition": 10,
|
||||||
@ -21,12 +17,17 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar": "0x81a4b044831c4f12ba601adb9274516939e9b8a2",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x3",
|
"networkID" : "0x3",
|
||||||
"forkBlock": 641350,
|
"forkBlock": 641350,
|
||||||
"forkCanonHash": "0x8033403e9fe5811a7b6d6b469905915de1c59207ce2172cbcf5d6ff14fa6a2eb",
|
"forkCanonHash": "0x8033403e9fe5811a7b6d6b469905915de1c59207ce2172cbcf5d6ff14fa6a2eb",
|
||||||
|
"eip155Transition": 10,
|
||||||
|
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff"
|
||||||
},
|
},
|
||||||
|
@ -3,12 +3,9 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x5",
|
"homesteadTransition": "0x5",
|
||||||
"daoHardforkTransition": "0x8",
|
"daoHardforkTransition": "0x8",
|
||||||
"daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754",
|
"daoHardforkBeneficiary": "0xbf4ed7b27f1d666546e30d74d50d173d20bca754",
|
||||||
@ -131,7 +128,6 @@
|
|||||||
"0x807640a13483f8ac783c557fcdf27be11ea4ac7a"
|
"0x807640a13483f8ac783c557fcdf27be11ea4ac7a"
|
||||||
],
|
],
|
||||||
"eip150Transition": "0xa",
|
"eip150Transition": "0xa",
|
||||||
"eip155Transition": "0x7fffffffffffffff",
|
|
||||||
"eip160Transition": "0x7fffffffffffffff",
|
"eip160Transition": "0x7fffffffffffffff",
|
||||||
"eip161abcTransition": "0x7fffffffffffffff",
|
"eip161abcTransition": "0x7fffffffffffffff",
|
||||||
"eip161dTransition": "0x7fffffffffffffff"
|
"eip161dTransition": "0x7fffffffffffffff"
|
||||||
@ -139,12 +135,16 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x1",
|
"networkID" : "0x1",
|
||||||
"eip98Transition": "0x7fffffffffffff",
|
"eip98Transition": "0x7fffffffffffff",
|
||||||
"eip86Transition": "0x7fffffffffffff"
|
"eip86Transition": "0x7fffffffffffff",
|
||||||
|
"eip155Transition": "0x7fffffffffffffff"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "DevelopmentChain",
|
"name": "DevelopmentChain",
|
||||||
"engine": {
|
"engine": {
|
||||||
"instantSeal": {
|
"instantSeal": null
|
||||||
"params": {
|
|
||||||
"registrar": "0x0000000000000000000000000000000000000005"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
"null": null
|
"null": null
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
"null": null
|
"null": null
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"tendermint": {
|
"tendermint": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"validators" : {
|
"validators" : {
|
||||||
"list": [
|
"list": [
|
||||||
"0x82a978b3f5962a5b0957d9ee9eef472ee55b42f1",
|
"0x82a978b3f5962a5b0957d9ee9eef472ee55b42f1",
|
||||||
@ -18,6 +17,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"authorityRound": {
|
"authorityRound": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"stepDuration": 1,
|
"stepDuration": 1,
|
||||||
"startStep": 2,
|
"startStep": 2,
|
||||||
"validators": {
|
"validators": {
|
||||||
@ -14,6 +13,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"basicAuthority": {
|
"basicAuthority": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"validators": {
|
"validators": {
|
||||||
"multi": {
|
"multi": {
|
||||||
@ -15,6 +14,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -49,22 +49,14 @@ mod finality;
|
|||||||
|
|
||||||
/// `AuthorityRound` params.
|
/// `AuthorityRound` params.
|
||||||
pub struct AuthorityRoundParams {
|
pub struct AuthorityRoundParams {
|
||||||
/// Gas limit divisor.
|
|
||||||
pub gas_limit_bound_divisor: U256,
|
|
||||||
/// Time to wait before next block or authority switching.
|
/// Time to wait before next block or authority switching.
|
||||||
pub step_duration: Duration,
|
pub step_duration: Duration,
|
||||||
/// Block reward.
|
|
||||||
pub block_reward: U256,
|
|
||||||
/// Namereg contract address.
|
|
||||||
pub registrar: Address,
|
|
||||||
/// Starting step,
|
/// Starting step,
|
||||||
pub start_step: Option<u64>,
|
pub start_step: Option<u64>,
|
||||||
/// Valid validators.
|
/// Valid validators.
|
||||||
pub validators: Box<ValidatorSet>,
|
pub validators: Box<ValidatorSet>,
|
||||||
/// Chain score validation transition block.
|
/// Chain score validation transition block.
|
||||||
pub validate_score_transition: u64,
|
pub validate_score_transition: u64,
|
||||||
/// Number of first block where EIP-155 rules are validated.
|
|
||||||
pub eip155_transition: u64,
|
|
||||||
/// Monotonic step validation transition block.
|
/// Monotonic step validation transition block.
|
||||||
pub validate_step_transition: u64,
|
pub validate_step_transition: u64,
|
||||||
/// Immediate transitions.
|
/// Immediate transitions.
|
||||||
@ -74,14 +66,10 @@ pub struct AuthorityRoundParams {
|
|||||||
impl From<ethjson::spec::AuthorityRoundParams> for AuthorityRoundParams {
|
impl From<ethjson::spec::AuthorityRoundParams> for AuthorityRoundParams {
|
||||||
fn from(p: ethjson::spec::AuthorityRoundParams) -> Self {
|
fn from(p: ethjson::spec::AuthorityRoundParams) -> Self {
|
||||||
AuthorityRoundParams {
|
AuthorityRoundParams {
|
||||||
gas_limit_bound_divisor: p.gas_limit_bound_divisor.into(),
|
|
||||||
step_duration: Duration::from_secs(p.step_duration.into()),
|
step_duration: Duration::from_secs(p.step_duration.into()),
|
||||||
validators: new_validator_set(p.validators),
|
validators: new_validator_set(p.validators),
|
||||||
block_reward: p.block_reward.map_or_else(U256::zero, Into::into),
|
|
||||||
registrar: p.registrar.map_or_else(Address::new, Into::into),
|
|
||||||
start_step: p.start_step.map(Into::into),
|
start_step: p.start_step.map(Into::into),
|
||||||
validate_score_transition: p.validate_score_transition.map_or(0, Into::into),
|
validate_score_transition: p.validate_score_transition.map_or(0, Into::into),
|
||||||
eip155_transition: p.eip155_transition.map_or(0, Into::into),
|
|
||||||
validate_step_transition: p.validate_step_transition.map_or(0, Into::into),
|
validate_step_transition: p.validate_step_transition.map_or(0, Into::into),
|
||||||
immediate_transitions: p.immediate_transitions.unwrap_or(false),
|
immediate_transitions: p.immediate_transitions.unwrap_or(false),
|
||||||
}
|
}
|
||||||
@ -216,9 +204,6 @@ impl EpochManager {
|
|||||||
/// Engine using `AuthorityRound` proof-of-authority BFT consensus.
|
/// Engine using `AuthorityRound` proof-of-authority BFT consensus.
|
||||||
pub struct AuthorityRound {
|
pub struct AuthorityRound {
|
||||||
params: CommonParams,
|
params: CommonParams,
|
||||||
gas_limit_bound_divisor: U256,
|
|
||||||
block_reward: U256,
|
|
||||||
registrar: Address,
|
|
||||||
builtins: BTreeMap<Address, Builtin>,
|
builtins: BTreeMap<Address, Builtin>,
|
||||||
transition_service: IoService<()>,
|
transition_service: IoService<()>,
|
||||||
step: Arc<Step>,
|
step: Arc<Step>,
|
||||||
@ -227,7 +212,6 @@ pub struct AuthorityRound {
|
|||||||
signer: RwLock<EngineSigner>,
|
signer: RwLock<EngineSigner>,
|
||||||
validators: Box<ValidatorSet>,
|
validators: Box<ValidatorSet>,
|
||||||
validate_score_transition: u64,
|
validate_score_transition: u64,
|
||||||
eip155_transition: u64,
|
|
||||||
validate_step_transition: u64,
|
validate_step_transition: u64,
|
||||||
epoch_manager: Mutex<EpochManager>,
|
epoch_manager: Mutex<EpochManager>,
|
||||||
immediate_transitions: bool,
|
immediate_transitions: bool,
|
||||||
@ -364,9 +348,6 @@ impl AuthorityRound {
|
|||||||
let engine = Arc::new(
|
let engine = Arc::new(
|
||||||
AuthorityRound {
|
AuthorityRound {
|
||||||
params: params,
|
params: params,
|
||||||
gas_limit_bound_divisor: our_params.gas_limit_bound_divisor,
|
|
||||||
block_reward: our_params.block_reward,
|
|
||||||
registrar: our_params.registrar,
|
|
||||||
builtins: builtins,
|
builtins: builtins,
|
||||||
transition_service: IoService::<()>::start()?,
|
transition_service: IoService::<()>::start()?,
|
||||||
step: Arc::new(Step {
|
step: Arc::new(Step {
|
||||||
@ -379,7 +360,6 @@ impl AuthorityRound {
|
|||||||
signer: Default::default(),
|
signer: Default::default(),
|
||||||
validators: our_params.validators,
|
validators: our_params.validators,
|
||||||
validate_score_transition: our_params.validate_score_transition,
|
validate_score_transition: our_params.validate_score_transition,
|
||||||
eip155_transition: our_params.eip155_transition,
|
|
||||||
validate_step_transition: our_params.validate_step_transition,
|
validate_step_transition: our_params.validate_step_transition,
|
||||||
epoch_manager: Mutex::new(EpochManager::blank()),
|
epoch_manager: Mutex::new(EpochManager::blank()),
|
||||||
immediate_transitions: our_params.immediate_transitions,
|
immediate_transitions: our_params.immediate_transitions,
|
||||||
@ -435,7 +415,9 @@ impl Engine for AuthorityRound {
|
|||||||
|
|
||||||
fn params(&self) -> &CommonParams { &self.params }
|
fn params(&self) -> &CommonParams { &self.params }
|
||||||
|
|
||||||
fn additional_params(&self) -> HashMap<String, String> { hash_map!["registrar".to_owned() => self.registrar.hex()] }
|
fn additional_params(&self) -> HashMap<String, String> {
|
||||||
|
hash_map!["registrar".to_owned() => self.params().registrar.hex()]
|
||||||
|
}
|
||||||
|
|
||||||
fn builtins(&self) -> &BTreeMap<Address, Builtin> { &self.builtins }
|
fn builtins(&self) -> &BTreeMap<Address, Builtin> { &self.builtins }
|
||||||
|
|
||||||
@ -463,7 +445,7 @@ impl Engine for AuthorityRound {
|
|||||||
header.set_difficulty(new_difficulty);
|
header.set_difficulty(new_difficulty);
|
||||||
header.set_gas_limit({
|
header.set_gas_limit({
|
||||||
let gas_limit = parent.gas_limit().clone();
|
let gas_limit = parent.gas_limit().clone();
|
||||||
let bound_divisor = self.gas_limit_bound_divisor;
|
let bound_divisor = self.params().gas_limit_bound_divisor;
|
||||||
if gas_limit < gas_floor_target {
|
if gas_limit < gas_floor_target {
|
||||||
cmp::min(gas_floor_target, gas_limit + gas_limit / bound_divisor - 1.into())
|
cmp::min(gas_floor_target, gas_limit + gas_limit / bound_divisor - 1.into())
|
||||||
} else {
|
} else {
|
||||||
@ -566,7 +548,8 @@ impl Engine for AuthorityRound {
|
|||||||
fn on_close_block(&self, block: &mut ExecutedBlock) -> Result<(), Error> {
|
fn on_close_block(&self, block: &mut ExecutedBlock) -> Result<(), Error> {
|
||||||
let fields = block.fields_mut();
|
let fields = block.fields_mut();
|
||||||
// Bestow block reward
|
// Bestow block reward
|
||||||
let res = fields.state.add_balance(fields.header.author(), &self.block_reward, CleanupMode::NoEmpty)
|
let reward = self.params().block_reward;
|
||||||
|
let res = fields.state.add_balance(fields.header.author(), &reward, CleanupMode::NoEmpty)
|
||||||
.map_err(::error::Error::from)
|
.map_err(::error::Error::from)
|
||||||
.and_then(|_| fields.state.commit());
|
.and_then(|_| fields.state.commit());
|
||||||
// Commit state so that we can actually figure out the state root.
|
// Commit state so that we can actually figure out the state root.
|
||||||
@ -631,7 +614,7 @@ impl Engine for AuthorityRound {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let gas_limit_divisor = self.gas_limit_bound_divisor;
|
let gas_limit_divisor = self.params().gas_limit_bound_divisor;
|
||||||
let min_gas = parent.gas_limit().clone() - parent.gas_limit().clone() / gas_limit_divisor;
|
let min_gas = parent.gas_limit().clone() - parent.gas_limit().clone() / gas_limit_divisor;
|
||||||
let max_gas = parent.gas_limit().clone() + parent.gas_limit().clone() / gas_limit_divisor;
|
let max_gas = parent.gas_limit().clone() + parent.gas_limit().clone() / gas_limit_divisor;
|
||||||
if header.gas_limit() <= &min_gas || header.gas_limit() >= &max_gas {
|
if header.gas_limit() <= &min_gas || header.gas_limit() >= &max_gas {
|
||||||
@ -821,7 +804,7 @@ impl Engine for AuthorityRound {
|
|||||||
t.check_low_s()?;
|
t.check_low_s()?;
|
||||||
|
|
||||||
if let Some(n) = t.network_id() {
|
if let Some(n) = t.network_id() {
|
||||||
if header.number() >= self.eip155_transition && n != self.params().chain_id {
|
if header.number() >= self.params().eip155_transition && n != self.params().chain_id {
|
||||||
return Err(TransactionError::InvalidNetworkId.into());
|
return Err(TransactionError::InvalidNetworkId.into());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1017,18 +1000,19 @@ mod tests {
|
|||||||
fn reports_skipped() {
|
fn reports_skipped() {
|
||||||
let last_benign = Arc::new(AtomicUsize::new(0));
|
let last_benign = Arc::new(AtomicUsize::new(0));
|
||||||
let params = AuthorityRoundParams {
|
let params = AuthorityRoundParams {
|
||||||
gas_limit_bound_divisor: "400".parse::<U256>().unwrap(),
|
|
||||||
step_duration: Default::default(),
|
step_duration: Default::default(),
|
||||||
block_reward: Default::default(),
|
|
||||||
registrar: Default::default(),
|
|
||||||
start_step: Some(1),
|
start_step: Some(1),
|
||||||
validators: Box::new(TestSet::new(Default::default(), last_benign.clone())),
|
validators: Box::new(TestSet::new(Default::default(), last_benign.clone())),
|
||||||
validate_score_transition: 0,
|
validate_score_transition: 0,
|
||||||
validate_step_transition: 0,
|
validate_step_transition: 0,
|
||||||
eip155_transition: 0,
|
|
||||||
immediate_transitions: true,
|
immediate_transitions: true,
|
||||||
};
|
};
|
||||||
let aura = AuthorityRound::new(Default::default(), params, Default::default()).unwrap();
|
|
||||||
|
let aura = {
|
||||||
|
let mut c_params = ::spec::CommonParams::default();
|
||||||
|
c_params.gas_limit_bound_divisor = 5.into();
|
||||||
|
AuthorityRound::new(c_params, params, Default::default()).unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
let mut parent_header: Header = Header::default();
|
let mut parent_header: Header = Header::default();
|
||||||
parent_header.set_seal(vec![encode(&1usize).into_vec()]);
|
parent_header.set_seal(vec![encode(&1usize).into_vec()]);
|
||||||
|
@ -37,8 +37,6 @@ use super::validator_set::{ValidatorSet, SimpleList, new_validator_set};
|
|||||||
/// `BasicAuthority` params.
|
/// `BasicAuthority` params.
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct BasicAuthorityParams {
|
pub struct BasicAuthorityParams {
|
||||||
/// Gas limit divisor.
|
|
||||||
pub gas_limit_bound_divisor: U256,
|
|
||||||
/// Valid signatories.
|
/// Valid signatories.
|
||||||
pub validators: ethjson::spec::ValidatorSet,
|
pub validators: ethjson::spec::ValidatorSet,
|
||||||
}
|
}
|
||||||
@ -46,7 +44,6 @@ pub struct BasicAuthorityParams {
|
|||||||
impl From<ethjson::spec::BasicAuthorityParams> for BasicAuthorityParams {
|
impl From<ethjson::spec::BasicAuthorityParams> for BasicAuthorityParams {
|
||||||
fn from(p: ethjson::spec::BasicAuthorityParams) -> Self {
|
fn from(p: ethjson::spec::BasicAuthorityParams) -> Self {
|
||||||
BasicAuthorityParams {
|
BasicAuthorityParams {
|
||||||
gas_limit_bound_divisor: p.gas_limit_bound_divisor.into(),
|
|
||||||
validators: p.validators,
|
validators: p.validators,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -82,7 +79,6 @@ fn verify_external(header: &Header, validators: &ValidatorSet) -> Result<(), Err
|
|||||||
/// Engine using `BasicAuthority`, trivial proof-of-authority consensus.
|
/// Engine using `BasicAuthority`, trivial proof-of-authority consensus.
|
||||||
pub struct BasicAuthority {
|
pub struct BasicAuthority {
|
||||||
params: CommonParams,
|
params: CommonParams,
|
||||||
gas_limit_bound_divisor: U256,
|
|
||||||
builtins: BTreeMap<Address, Builtin>,
|
builtins: BTreeMap<Address, Builtin>,
|
||||||
signer: RwLock<EngineSigner>,
|
signer: RwLock<EngineSigner>,
|
||||||
validators: Box<ValidatorSet>,
|
validators: Box<ValidatorSet>,
|
||||||
@ -93,7 +89,6 @@ impl BasicAuthority {
|
|||||||
pub fn new(params: CommonParams, our_params: BasicAuthorityParams, builtins: BTreeMap<Address, Builtin>) -> Self {
|
pub fn new(params: CommonParams, our_params: BasicAuthorityParams, builtins: BTreeMap<Address, Builtin>) -> Self {
|
||||||
BasicAuthority {
|
BasicAuthority {
|
||||||
params: params,
|
params: params,
|
||||||
gas_limit_bound_divisor: our_params.gas_limit_bound_divisor,
|
|
||||||
builtins: builtins,
|
builtins: builtins,
|
||||||
validators: new_validator_set(our_params.validators),
|
validators: new_validator_set(our_params.validators),
|
||||||
signer: Default::default(),
|
signer: Default::default(),
|
||||||
@ -121,7 +116,7 @@ impl Engine for BasicAuthority {
|
|||||||
header.set_difficulty(parent.difficulty().clone());
|
header.set_difficulty(parent.difficulty().clone());
|
||||||
header.set_gas_limit({
|
header.set_gas_limit({
|
||||||
let gas_limit = parent.gas_limit().clone();
|
let gas_limit = parent.gas_limit().clone();
|
||||||
let bound_divisor = self.gas_limit_bound_divisor;
|
let bound_divisor = self.params().gas_limit_bound_divisor;
|
||||||
if gas_limit < gas_floor_target {
|
if gas_limit < gas_floor_target {
|
||||||
cmp::min(gas_floor_target, gas_limit + gas_limit / bound_divisor - 1.into())
|
cmp::min(gas_floor_target, gas_limit + gas_limit / bound_divisor - 1.into())
|
||||||
} else {
|
} else {
|
||||||
@ -174,7 +169,7 @@ impl Engine for BasicAuthority {
|
|||||||
if header.difficulty() != parent.difficulty() {
|
if header.difficulty() != parent.difficulty() {
|
||||||
return Err(From::from(BlockError::InvalidDifficulty(Mismatch { expected: *parent.difficulty(), found: *header.difficulty() })))
|
return Err(From::from(BlockError::InvalidDifficulty(Mismatch { expected: *parent.difficulty(), found: *header.difficulty() })))
|
||||||
}
|
}
|
||||||
let gas_limit_divisor = self.gas_limit_bound_divisor;
|
let gas_limit_divisor = self.params().gas_limit_bound_divisor;
|
||||||
let min_gas = parent.gas_limit().clone() - parent.gas_limit().clone() / gas_limit_divisor;
|
let min_gas = parent.gas_limit().clone() - parent.gas_limit().clone() / gas_limit_divisor;
|
||||||
let max_gas = parent.gas_limit().clone() + parent.gas_limit().clone() / gas_limit_divisor;
|
let max_gas = parent.gas_limit().clone() + parent.gas_limit().clone() / gas_limit_divisor;
|
||||||
if header.gas_limit() <= &min_gas || header.gas_limit() >= &max_gas {
|
if header.gas_limit() <= &min_gas || header.gas_limit() >= &max_gas {
|
||||||
|
@ -24,16 +24,14 @@ use block::ExecutedBlock;
|
|||||||
/// An engine which does not provide any consensus mechanism, just seals blocks internally.
|
/// An engine which does not provide any consensus mechanism, just seals blocks internally.
|
||||||
pub struct InstantSeal {
|
pub struct InstantSeal {
|
||||||
params: CommonParams,
|
params: CommonParams,
|
||||||
registrar: Address,
|
|
||||||
builtins: BTreeMap<Address, Builtin>,
|
builtins: BTreeMap<Address, Builtin>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InstantSeal {
|
impl InstantSeal {
|
||||||
/// Returns new instance of InstantSeal with default VM Factory
|
/// Returns new instance of InstantSeal with default VM Factory
|
||||||
pub fn new(params: CommonParams, registrar: Address, builtins: BTreeMap<Address, Builtin>) -> Self {
|
pub fn new(params: CommonParams, builtins: BTreeMap<Address, Builtin>) -> Self {
|
||||||
InstantSeal {
|
InstantSeal {
|
||||||
params: params,
|
params: params,
|
||||||
registrar: registrar,
|
|
||||||
builtins: builtins,
|
builtins: builtins,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,7 +47,7 @@ impl Engine for InstantSeal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn additional_params(&self) -> HashMap<String, String> {
|
fn additional_params(&self) -> HashMap<String, String> {
|
||||||
hash_map!["registrar".to_owned() => self.registrar.hex()]
|
hash_map!["registrar".to_owned() => self.params().registrar.hex()]
|
||||||
}
|
}
|
||||||
|
|
||||||
fn builtins(&self) -> &BTreeMap<Address, Builtin> {
|
fn builtins(&self) -> &BTreeMap<Address, Builtin> {
|
||||||
|
@ -73,12 +73,9 @@ pub type BlockHash = H256;
|
|||||||
/// Engine using `Tendermint` consensus algorithm, suitable for EVM chain.
|
/// Engine using `Tendermint` consensus algorithm, suitable for EVM chain.
|
||||||
pub struct Tendermint {
|
pub struct Tendermint {
|
||||||
params: CommonParams,
|
params: CommonParams,
|
||||||
gas_limit_bound_divisor: U256,
|
|
||||||
builtins: BTreeMap<Address, Builtin>,
|
builtins: BTreeMap<Address, Builtin>,
|
||||||
step_service: IoService<Step>,
|
step_service: IoService<Step>,
|
||||||
client: RwLock<Option<Weak<EngineClient>>>,
|
client: RwLock<Option<Weak<EngineClient>>>,
|
||||||
block_reward: U256,
|
|
||||||
registrar: Address,
|
|
||||||
/// Blockchain height.
|
/// Blockchain height.
|
||||||
height: AtomicUsize,
|
height: AtomicUsize,
|
||||||
/// Consensus view.
|
/// Consensus view.
|
||||||
@ -168,12 +165,9 @@ impl Tendermint {
|
|||||||
let engine = Arc::new(
|
let engine = Arc::new(
|
||||||
Tendermint {
|
Tendermint {
|
||||||
params: params,
|
params: params,
|
||||||
gas_limit_bound_divisor: our_params.gas_limit_bound_divisor,
|
|
||||||
builtins: builtins,
|
builtins: builtins,
|
||||||
client: RwLock::new(None),
|
client: RwLock::new(None),
|
||||||
step_service: IoService::<Step>::start()?,
|
step_service: IoService::<Step>::start()?,
|
||||||
block_reward: our_params.block_reward,
|
|
||||||
registrar: our_params.registrar,
|
|
||||||
height: AtomicUsize::new(1),
|
height: AtomicUsize::new(1),
|
||||||
view: AtomicUsize::new(0),
|
view: AtomicUsize::new(0),
|
||||||
step: RwLock::new(Step::Propose),
|
step: RwLock::new(Step::Propose),
|
||||||
@ -448,7 +442,9 @@ impl Engine for Tendermint {
|
|||||||
|
|
||||||
fn params(&self) -> &CommonParams { &self.params }
|
fn params(&self) -> &CommonParams { &self.params }
|
||||||
|
|
||||||
fn additional_params(&self) -> HashMap<String, String> { hash_map!["registrar".to_owned() => self.registrar.hex()] }
|
fn additional_params(&self) -> HashMap<String, String> {
|
||||||
|
hash_map!["registrar".to_owned() => self.params().registrar.hex()]
|
||||||
|
}
|
||||||
|
|
||||||
fn builtins(&self) -> &BTreeMap<Address, Builtin> { &self.builtins }
|
fn builtins(&self) -> &BTreeMap<Address, Builtin> { &self.builtins }
|
||||||
|
|
||||||
@ -473,7 +469,7 @@ impl Engine for Tendermint {
|
|||||||
header.set_difficulty(new_difficulty);
|
header.set_difficulty(new_difficulty);
|
||||||
header.set_gas_limit({
|
header.set_gas_limit({
|
||||||
let gas_limit = parent.gas_limit().clone();
|
let gas_limit = parent.gas_limit().clone();
|
||||||
let bound_divisor = self.gas_limit_bound_divisor;
|
let bound_divisor = self.params().gas_limit_bound_divisor;
|
||||||
if gas_limit < gas_floor_target {
|
if gas_limit < gas_floor_target {
|
||||||
cmp::min(gas_floor_target, gas_limit + gas_limit / bound_divisor - 1.into())
|
cmp::min(gas_floor_target, gas_limit + gas_limit / bound_divisor - 1.into())
|
||||||
} else {
|
} else {
|
||||||
@ -547,7 +543,8 @@ impl Engine for Tendermint {
|
|||||||
fn on_close_block(&self, block: &mut ExecutedBlock) -> Result<(), Error>{
|
fn on_close_block(&self, block: &mut ExecutedBlock) -> Result<(), Error>{
|
||||||
let fields = block.fields_mut();
|
let fields = block.fields_mut();
|
||||||
// Bestow block reward
|
// Bestow block reward
|
||||||
let res = fields.state.add_balance(fields.header.author(), &self.block_reward, CleanupMode::NoEmpty)
|
let reward = self.params().block_reward;
|
||||||
|
let res = fields.state.add_balance(fields.header.author(), &reward, CleanupMode::NoEmpty)
|
||||||
.map_err(::error::Error::from)
|
.map_err(::error::Error::from)
|
||||||
.and_then(|_| fields.state.commit());
|
.and_then(|_| fields.state.commit());
|
||||||
// Commit state so that we can actually figure out the state root.
|
// Commit state so that we can actually figure out the state root.
|
||||||
@ -619,7 +616,7 @@ impl Engine for Tendermint {
|
|||||||
self.check_above_threshold(origins.len())?
|
self.check_above_threshold(origins.len())?
|
||||||
}
|
}
|
||||||
|
|
||||||
let gas_limit_divisor = self.gas_limit_bound_divisor;
|
let gas_limit_divisor = self.params().gas_limit_bound_divisor;
|
||||||
let min_gas = parent.gas_limit().clone() - parent.gas_limit().clone() / gas_limit_divisor;
|
let min_gas = parent.gas_limit().clone() - parent.gas_limit().clone() / gas_limit_divisor;
|
||||||
let max_gas = parent.gas_limit().clone() + parent.gas_limit().clone() / gas_limit_divisor;
|
let max_gas = parent.gas_limit().clone() + parent.gas_limit().clone() / gas_limit_divisor;
|
||||||
if header.gas_limit() <= &min_gas || header.gas_limit() >= &max_gas {
|
if header.gas_limit() <= &min_gas || header.gas_limit() >= &max_gas {
|
||||||
|
@ -17,7 +17,6 @@
|
|||||||
//! Tendermint specific parameters.
|
//! Tendermint specific parameters.
|
||||||
|
|
||||||
use ethjson;
|
use ethjson;
|
||||||
use util::{U256, Address};
|
|
||||||
use time::Duration;
|
use time::Duration;
|
||||||
use super::super::validator_set::{ValidatorSet, new_validator_set};
|
use super::super::validator_set::{ValidatorSet, new_validator_set};
|
||||||
use super::super::transition::Timeouts;
|
use super::super::transition::Timeouts;
|
||||||
@ -25,16 +24,10 @@ use super::Step;
|
|||||||
|
|
||||||
/// `Tendermint` params.
|
/// `Tendermint` params.
|
||||||
pub struct TendermintParams {
|
pub struct TendermintParams {
|
||||||
/// Gas limit divisor.
|
|
||||||
pub gas_limit_bound_divisor: U256,
|
|
||||||
/// List of validators.
|
/// List of validators.
|
||||||
pub validators: Box<ValidatorSet>,
|
pub validators: Box<ValidatorSet>,
|
||||||
/// Timeout durations for different steps.
|
/// Timeout durations for different steps.
|
||||||
pub timeouts: TendermintTimeouts,
|
pub timeouts: TendermintTimeouts,
|
||||||
/// Block reward.
|
|
||||||
pub block_reward: U256,
|
|
||||||
/// Namereg contract address.
|
|
||||||
pub registrar: Address,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Base timeout of each step in ms.
|
/// Base timeout of each step in ms.
|
||||||
@ -81,7 +74,6 @@ impl From<ethjson::spec::TendermintParams> for TendermintParams {
|
|||||||
fn from(p: ethjson::spec::TendermintParams) -> Self {
|
fn from(p: ethjson::spec::TendermintParams) -> Self {
|
||||||
let dt = TendermintTimeouts::default();
|
let dt = TendermintTimeouts::default();
|
||||||
TendermintParams {
|
TendermintParams {
|
||||||
gas_limit_bound_divisor: p.gas_limit_bound_divisor.into(),
|
|
||||||
validators: new_validator_set(p.validators),
|
validators: new_validator_set(p.validators),
|
||||||
timeouts: TendermintTimeouts {
|
timeouts: TendermintTimeouts {
|
||||||
propose: p.timeout_propose.map_or(dt.propose, to_duration),
|
propose: p.timeout_propose.map_or(dt.propose, to_duration),
|
||||||
@ -89,8 +81,6 @@ impl From<ethjson::spec::TendermintParams> for TendermintParams {
|
|||||||
precommit: p.timeout_precommit.map_or(dt.precommit, to_duration),
|
precommit: p.timeout_precommit.map_or(dt.precommit, to_duration),
|
||||||
commit: p.timeout_commit.map_or(dt.commit, to_duration),
|
commit: p.timeout_commit.map_or(dt.commit, to_duration),
|
||||||
},
|
},
|
||||||
block_reward: p.block_reward.map_or_else(U256::zero, Into::into),
|
|
||||||
registrar: p.registrar.map_or_else(Address::new, Into::into),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,8 +44,6 @@ const SNAPSHOT_BLOCKS: u64 = 30000;
|
|||||||
/// Ethash params.
|
/// Ethash params.
|
||||||
#[derive(Debug, PartialEq)]
|
#[derive(Debug, PartialEq)]
|
||||||
pub struct EthashParams {
|
pub struct EthashParams {
|
||||||
/// Gas limit divisor.
|
|
||||||
pub gas_limit_bound_divisor: U256,
|
|
||||||
/// Minimum difficulty.
|
/// Minimum difficulty.
|
||||||
pub minimum_difficulty: U256,
|
pub minimum_difficulty: U256,
|
||||||
/// Difficulty bound divisor.
|
/// Difficulty bound divisor.
|
||||||
@ -56,10 +54,6 @@ pub struct EthashParams {
|
|||||||
pub metropolis_difficulty_increment_divisor: u64,
|
pub metropolis_difficulty_increment_divisor: u64,
|
||||||
/// Block duration.
|
/// Block duration.
|
||||||
pub duration_limit: u64,
|
pub duration_limit: u64,
|
||||||
/// Block reward.
|
|
||||||
pub block_reward: U256,
|
|
||||||
/// Namereg contract address.
|
|
||||||
pub registrar: Address,
|
|
||||||
/// Homestead transition block number.
|
/// Homestead transition block number.
|
||||||
pub homestead_transition: u64,
|
pub homestead_transition: u64,
|
||||||
/// DAO hard-fork transition block (X).
|
/// DAO hard-fork transition block (X).
|
||||||
@ -78,8 +72,6 @@ pub struct EthashParams {
|
|||||||
pub eip100b_transition: u64,
|
pub eip100b_transition: u64,
|
||||||
/// Number of first block where EIP-150 rules begin.
|
/// Number of first block where EIP-150 rules begin.
|
||||||
pub eip150_transition: u64,
|
pub eip150_transition: u64,
|
||||||
/// Number of first block where EIP-155 rules begin.
|
|
||||||
pub eip155_transition: u64,
|
|
||||||
/// Number of first block where EIP-160 rules begin.
|
/// Number of first block where EIP-160 rules begin.
|
||||||
pub eip160_transition: u64,
|
pub eip160_transition: u64,
|
||||||
/// Number of first block where EIP-161.abc begin.
|
/// Number of first block where EIP-161.abc begin.
|
||||||
@ -107,14 +99,11 @@ pub struct EthashParams {
|
|||||||
impl From<ethjson::spec::EthashParams> for EthashParams {
|
impl From<ethjson::spec::EthashParams> for EthashParams {
|
||||||
fn from(p: ethjson::spec::EthashParams) -> Self {
|
fn from(p: ethjson::spec::EthashParams) -> Self {
|
||||||
EthashParams {
|
EthashParams {
|
||||||
gas_limit_bound_divisor: p.gas_limit_bound_divisor.into(),
|
|
||||||
minimum_difficulty: p.minimum_difficulty.into(),
|
minimum_difficulty: p.minimum_difficulty.into(),
|
||||||
difficulty_bound_divisor: p.difficulty_bound_divisor.into(),
|
difficulty_bound_divisor: p.difficulty_bound_divisor.into(),
|
||||||
difficulty_increment_divisor: p.difficulty_increment_divisor.map_or(10, Into::into),
|
difficulty_increment_divisor: p.difficulty_increment_divisor.map_or(10, Into::into),
|
||||||
metropolis_difficulty_increment_divisor: p.metropolis_difficulty_increment_divisor.map_or(9, Into::into),
|
metropolis_difficulty_increment_divisor: p.metropolis_difficulty_increment_divisor.map_or(9, Into::into),
|
||||||
duration_limit: p.duration_limit.map_or(0, Into::into),
|
duration_limit: p.duration_limit.map_or(0, Into::into),
|
||||||
block_reward: p.block_reward.into(),
|
|
||||||
registrar: p.registrar.map_or_else(Address::new, Into::into),
|
|
||||||
homestead_transition: p.homestead_transition.map_or(0, Into::into),
|
homestead_transition: p.homestead_transition.map_or(0, Into::into),
|
||||||
dao_hardfork_transition: p.dao_hardfork_transition.map_or(u64::max_value(), Into::into),
|
dao_hardfork_transition: p.dao_hardfork_transition.map_or(u64::max_value(), Into::into),
|
||||||
dao_hardfork_beneficiary: p.dao_hardfork_beneficiary.map_or_else(Address::new, Into::into),
|
dao_hardfork_beneficiary: p.dao_hardfork_beneficiary.map_or_else(Address::new, Into::into),
|
||||||
@ -124,7 +113,6 @@ impl From<ethjson::spec::EthashParams> for EthashParams {
|
|||||||
bomb_defuse_transition: p.bomb_defuse_transition.map_or(u64::max_value(), Into::into),
|
bomb_defuse_transition: p.bomb_defuse_transition.map_or(u64::max_value(), Into::into),
|
||||||
eip100b_transition: p.eip100b_transition.map_or(u64::max_value(), Into::into),
|
eip100b_transition: p.eip100b_transition.map_or(u64::max_value(), Into::into),
|
||||||
eip150_transition: p.eip150_transition.map_or(0, Into::into),
|
eip150_transition: p.eip150_transition.map_or(0, Into::into),
|
||||||
eip155_transition: p.eip155_transition.map_or(0, Into::into),
|
|
||||||
eip160_transition: p.eip160_transition.map_or(0, Into::into),
|
eip160_transition: p.eip160_transition.map_or(0, Into::into),
|
||||||
eip161abc_transition: p.eip161abc_transition.map_or(0, Into::into),
|
eip161abc_transition: p.eip161abc_transition.map_or(0, Into::into),
|
||||||
eip161d_transition: p.eip161d_transition.map_or(u64::max_value(), Into::into),
|
eip161d_transition: p.eip161d_transition.map_or(u64::max_value(), Into::into),
|
||||||
@ -188,7 +176,7 @@ impl Engine for Arc<Ethash> {
|
|||||||
fn seal_fields(&self) -> usize { 2 }
|
fn seal_fields(&self) -> usize { 2 }
|
||||||
|
|
||||||
fn params(&self) -> &CommonParams { &self.params }
|
fn params(&self) -> &CommonParams { &self.params }
|
||||||
fn additional_params(&self) -> HashMap<String, String> { hash_map!["registrar".to_owned() => self.ethash_params.registrar.hex()] }
|
fn additional_params(&self) -> HashMap<String, String> { hash_map!["registrar".to_owned() => self.params().registrar.hex()] }
|
||||||
|
|
||||||
fn builtins(&self) -> &BTreeMap<Address, Builtin> {
|
fn builtins(&self) -> &BTreeMap<Address, Builtin> {
|
||||||
&self.builtins
|
&self.builtins
|
||||||
@ -219,7 +207,7 @@ impl Engine for Arc<Ethash> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn signing_network_id(&self, env_info: &EnvInfo) -> Option<u64> {
|
fn signing_network_id(&self, env_info: &EnvInfo) -> Option<u64> {
|
||||||
if env_info.number >= self.ethash_params.eip155_transition {
|
if env_info.number >= self.params().eip155_transition {
|
||||||
Some(self.params().chain_id)
|
Some(self.params().chain_id)
|
||||||
} else {
|
} else {
|
||||||
None
|
None
|
||||||
@ -234,7 +222,7 @@ impl Engine for Arc<Ethash> {
|
|||||||
}
|
}
|
||||||
let gas_limit = {
|
let gas_limit = {
|
||||||
let gas_limit = parent.gas_limit().clone();
|
let gas_limit = parent.gas_limit().clone();
|
||||||
let bound_divisor = self.ethash_params.gas_limit_bound_divisor;
|
let bound_divisor = self.params().gas_limit_bound_divisor;
|
||||||
let lower_limit = gas_limit - gas_limit / bound_divisor + 1.into();
|
let lower_limit = gas_limit - gas_limit / bound_divisor + 1.into();
|
||||||
let upper_limit = gas_limit + gas_limit / bound_divisor - 1.into();
|
let upper_limit = gas_limit + gas_limit / bound_divisor - 1.into();
|
||||||
let gas_limit = if gas_limit < gas_floor_target {
|
let gas_limit = if gas_limit < gas_floor_target {
|
||||||
@ -287,7 +275,7 @@ impl Engine for Arc<Ethash> {
|
|||||||
/// Apply the block reward on finalisation of the block.
|
/// Apply the block reward on finalisation of the block.
|
||||||
/// This assumes that all uncles are valid uncles (i.e. of at least one generation before the current).
|
/// This assumes that all uncles are valid uncles (i.e. of at least one generation before the current).
|
||||||
fn on_close_block(&self, block: &mut ExecutedBlock) -> Result<(), Error> {
|
fn on_close_block(&self, block: &mut ExecutedBlock) -> Result<(), Error> {
|
||||||
let reward = self.ethash_params.block_reward;
|
let reward = self.params().block_reward;
|
||||||
let fields = block.fields_mut();
|
let fields = block.fields_mut();
|
||||||
let eras_rounds = self.ethash_params.ecip1017_era_rounds;
|
let eras_rounds = self.ethash_params.ecip1017_era_rounds;
|
||||||
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, fields.header.number());
|
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, fields.header.number());
|
||||||
@ -390,7 +378,7 @@ impl Engine for Arc<Ethash> {
|
|||||||
if header.difficulty() != &expected_difficulty {
|
if header.difficulty() != &expected_difficulty {
|
||||||
return Err(From::from(BlockError::InvalidDifficulty(Mismatch { expected: expected_difficulty, found: header.difficulty().clone() })))
|
return Err(From::from(BlockError::InvalidDifficulty(Mismatch { expected: expected_difficulty, found: header.difficulty().clone() })))
|
||||||
}
|
}
|
||||||
let gas_limit_divisor = self.ethash_params.gas_limit_bound_divisor;
|
let gas_limit_divisor = self.params().gas_limit_bound_divisor;
|
||||||
let parent_gas_limit = *parent.gas_limit();
|
let parent_gas_limit = *parent.gas_limit();
|
||||||
let min_gas = parent_gas_limit - parent_gas_limit / gas_limit_divisor;
|
let min_gas = parent_gas_limit - parent_gas_limit / gas_limit_divisor;
|
||||||
let max_gas = parent_gas_limit + parent_gas_limit / gas_limit_divisor;
|
let max_gas = parent_gas_limit + parent_gas_limit / gas_limit_divisor;
|
||||||
@ -409,7 +397,7 @@ impl Engine for Arc<Ethash> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let check_low_s = header.number() >= self.ethash_params.homestead_transition;
|
let check_low_s = header.number() >= self.ethash_params.homestead_transition;
|
||||||
let network_id = if header.number() >= self.ethash_params.eip155_transition { Some(self.params().chain_id) } else { None };
|
let network_id = if header.number() >= self.params().eip155_transition { Some(self.params().chain_id) } else { None };
|
||||||
t.verify_basic(check_low_s, network_id, false)?;
|
t.verify_basic(check_low_s, network_id, false)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -815,36 +803,32 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn has_valid_ecip1017_eras_block_reward() {
|
fn has_valid_ecip1017_eras_block_reward() {
|
||||||
let ethparams = EthashParams {
|
let eras_rounds = 5000000;
|
||||||
// see ethcore/res/ethereum/classic.json
|
|
||||||
ecip1017_era_rounds: 5000000,
|
let start_reward: U256 = "4563918244F40000".parse().unwrap();
|
||||||
block_reward: U256::from_str("4563918244F40000").unwrap(),
|
|
||||||
..get_default_ethash_params()
|
|
||||||
};
|
|
||||||
let eras_rounds = ethparams.ecip1017_era_rounds;
|
|
||||||
let reward = ethparams.block_reward;
|
|
||||||
let block_number = 0;
|
let block_number = 0;
|
||||||
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, block_number);
|
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number);
|
||||||
assert_eq!(0, eras);
|
assert_eq!(0, eras);
|
||||||
assert_eq!(U256::from_str("4563918244F40000").unwrap(), reward);
|
assert_eq!(U256::from_str("4563918244F40000").unwrap(), reward);
|
||||||
let reward = ethparams.block_reward;
|
|
||||||
let block_number = 5000000;
|
let block_number = 5000000;
|
||||||
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, block_number);
|
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number);
|
||||||
assert_eq!(0, eras);
|
assert_eq!(0, eras);
|
||||||
assert_eq!(U256::from_str("4563918244F40000").unwrap(), reward);
|
assert_eq!(U256::from_str("4563918244F40000").unwrap(), reward);
|
||||||
let reward = ethparams.block_reward;
|
|
||||||
let block_number = 10000000;
|
let block_number = 10000000;
|
||||||
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, block_number);
|
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number);
|
||||||
assert_eq!(1, eras);
|
assert_eq!(1, eras);
|
||||||
assert_eq!(U256::from_str("3782DACE9D900000").unwrap(), reward);
|
assert_eq!(U256::from_str("3782DACE9D900000").unwrap(), reward);
|
||||||
let reward = ethparams.block_reward;
|
|
||||||
let block_number = 20000000;
|
let block_number = 20000000;
|
||||||
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, block_number);
|
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number);
|
||||||
assert_eq!(3, eras);
|
assert_eq!(3, eras);
|
||||||
assert_eq!(U256::from_str("2386F26FC1000000").unwrap(), reward);
|
assert_eq!(U256::from_str("2386F26FC1000000").unwrap(), reward);
|
||||||
let reward = ethparams.block_reward;
|
|
||||||
let block_number = 80000000;
|
let block_number = 80000000;
|
||||||
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, reward, block_number);
|
let (eras, reward) = ecip1017_eras_block_reward(eras_rounds, start_reward, block_number);
|
||||||
assert_eq!(15, eras);
|
assert_eq!(15, eras);
|
||||||
assert_eq!(U256::from_str("271000000000000").unwrap(), reward);
|
assert_eq!(U256::from_str("271000000000000").unwrap(), reward);
|
||||||
}
|
}
|
||||||
|
@ -1114,6 +1114,8 @@ impl MinerService for Miner {
|
|||||||
/// Prepare the block and work if the Engine does not seal internally.
|
/// Prepare the block and work if the Engine does not seal internally.
|
||||||
fn update_sealing(&self, chain: &MiningBlockChainClient) {
|
fn update_sealing(&self, chain: &MiningBlockChainClient) {
|
||||||
trace!(target: "miner", "update_sealing");
|
trace!(target: "miner", "update_sealing");
|
||||||
|
const NO_NEW_CHAIN_WITH_FORKS: &str = "Your chain specification contains one or more hard forks which are required to be \
|
||||||
|
on by default. Please remove these forks and start your chain again.";
|
||||||
|
|
||||||
if self.requires_reseal(chain.chain_info().best_block_number) {
|
if self.requires_reseal(chain.chain_info().best_block_number) {
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
@ -1122,6 +1124,14 @@ impl MinerService for Miner {
|
|||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
trace!(target: "miner", "update_sealing: preparing a block");
|
trace!(target: "miner", "update_sealing: preparing a block");
|
||||||
let (block, original_work_hash) = self.prepare_block(chain);
|
let (block, original_work_hash) = self.prepare_block(chain);
|
||||||
|
|
||||||
|
// refuse to seal the first block of the chain if it contains hard forks
|
||||||
|
// which should be on by default.
|
||||||
|
if block.block().fields().header.number() == 1 && self.engine.params().contains_bugfix_hard_fork() {
|
||||||
|
warn!("{}", NO_NEW_CHAIN_WITH_FORKS);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
match self.engine.seals_internally() {
|
match self.engine.seals_internally() {
|
||||||
Some(true) => {
|
Some(true) => {
|
||||||
trace!(target: "miner", "update_sealing: engine indicates internal sealing");
|
trace!(target: "miner", "update_sealing: engine indicates internal sealing");
|
||||||
@ -1129,11 +1139,11 @@ impl MinerService for Miner {
|
|||||||
trace!(target: "miner", "update_sealing: imported internally sealed block");
|
trace!(target: "miner", "update_sealing: imported internally sealed block");
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Some(false) => trace!(target: "miner", "update_sealing: engine is not keen to seal internally right now"),
|
||||||
None => {
|
None => {
|
||||||
trace!(target: "miner", "update_sealing: engine does not seal internally, preparing work");
|
trace!(target: "miner", "update_sealing: engine does not seal internally, preparing work");
|
||||||
self.prepare_work(block, original_work_hash)
|
self.prepare_work(block, original_work_hash)
|
||||||
},
|
},
|
||||||
_ => trace!(target: "miner", "update_sealing: engine is not keen to seal internally right now")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
"engine": {
|
"engine": {
|
||||||
"authorityRound": {
|
"authorityRound": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"stepDuration": 1,
|
"stepDuration": 1,
|
||||||
"startStep": 0,
|
"startStep": 0,
|
||||||
"validators": {
|
"validators": {
|
||||||
@ -17,6 +16,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
"accountStartNonce": "0x0",
|
"accountStartNonce": "0x0",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
|
@ -43,7 +43,12 @@ use trace::{NoopTracer, NoopVMTracer};
|
|||||||
use evm::CallType;
|
use evm::CallType;
|
||||||
use util::*;
|
use util::*;
|
||||||
|
|
||||||
/// Parameters common to all engines.
|
/// Parameters common to ethereum-like blockchains.
|
||||||
|
/// NOTE: when adding bugfix hard-fork parameters,
|
||||||
|
/// add to `contains_bugfix_hard_fork`
|
||||||
|
///
|
||||||
|
/// we define a "bugfix" hard fork as any hard fork which
|
||||||
|
/// you would put on-by-default in a new chain.
|
||||||
#[derive(Debug, PartialEq, Default)]
|
#[derive(Debug, PartialEq, Default)]
|
||||||
#[cfg_attr(test, derive(Clone))]
|
#[cfg_attr(test, derive(Clone))]
|
||||||
pub struct CommonParams {
|
pub struct CommonParams {
|
||||||
@ -63,8 +68,10 @@ pub struct CommonParams {
|
|||||||
pub fork_block: Option<(BlockNumber, H256)>,
|
pub fork_block: Option<(BlockNumber, H256)>,
|
||||||
/// Number of first block where EIP-98 rules begin.
|
/// Number of first block where EIP-98 rules begin.
|
||||||
pub eip98_transition: BlockNumber,
|
pub eip98_transition: BlockNumber,
|
||||||
|
/// Number of first block where EIP-155 rules begin.
|
||||||
|
pub eip155_transition: BlockNumber,
|
||||||
/// Validate block receipts root.
|
/// Validate block receipts root.
|
||||||
pub validate_receipts_transition: u64,
|
pub validate_receipts_transition: BlockNumber,
|
||||||
/// Number of first block where EIP-86 (Metropolis) rules begin.
|
/// Number of first block where EIP-86 (Metropolis) rules begin.
|
||||||
pub eip86_transition: BlockNumber,
|
pub eip86_transition: BlockNumber,
|
||||||
/// Number of first block where EIP-140 (Metropolis: REVERT opcode) rules begin.
|
/// Number of first block where EIP-140 (Metropolis: REVERT opcode) rules begin.
|
||||||
@ -89,6 +96,12 @@ pub struct CommonParams {
|
|||||||
pub remove_dust_contracts: bool,
|
pub remove_dust_contracts: bool,
|
||||||
/// Wasm support
|
/// Wasm support
|
||||||
pub wasm: bool,
|
pub wasm: bool,
|
||||||
|
/// Gas limit bound divisor (how much gas limit can change per block)
|
||||||
|
pub gas_limit_bound_divisor: U256,
|
||||||
|
/// Block reward in wei.
|
||||||
|
pub block_reward: U256,
|
||||||
|
/// Registrar contract address.
|
||||||
|
pub registrar: Address,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl CommonParams {
|
impl CommonParams {
|
||||||
@ -115,6 +128,19 @@ impl CommonParams {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Whether these params contain any bug-fix hard forks.
|
||||||
|
pub fn contains_bugfix_hard_fork(&self) -> bool {
|
||||||
|
self.eip98_transition != 0 &&
|
||||||
|
self.eip155_transition != 0 &&
|
||||||
|
self.validate_receipts_transition != 0 &&
|
||||||
|
self.eip86_transition != 0 &&
|
||||||
|
self.eip140_transition != 0 &&
|
||||||
|
self.eip210_transition != 0 &&
|
||||||
|
self.eip211_transition != 0 &&
|
||||||
|
self.eip214_transition != 0 &&
|
||||||
|
self.dust_protection_transition != 0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<ethjson::spec::Params> for CommonParams {
|
impl From<ethjson::spec::Params> for CommonParams {
|
||||||
@ -128,6 +154,7 @@ impl From<ethjson::spec::Params> for CommonParams {
|
|||||||
min_gas_limit: p.min_gas_limit.into(),
|
min_gas_limit: p.min_gas_limit.into(),
|
||||||
fork_block: if let (Some(n), Some(h)) = (p.fork_block, p.fork_hash) { Some((n.into(), h.into())) } else { None },
|
fork_block: if let (Some(n), Some(h)) = (p.fork_block, p.fork_hash) { Some((n.into(), h.into())) } else { None },
|
||||||
eip98_transition: p.eip98_transition.map_or(0, Into::into),
|
eip98_transition: p.eip98_transition.map_or(0, Into::into),
|
||||||
|
eip155_transition: p.eip155_transition.map_or(0, Into::into),
|
||||||
validate_receipts_transition: p.validate_receipts_transition.map_or(0, Into::into),
|
validate_receipts_transition: p.validate_receipts_transition.map_or(0, Into::into),
|
||||||
eip86_transition: p.eip86_transition.map_or(BlockNumber::max_value(), Into::into),
|
eip86_transition: p.eip86_transition.map_or(BlockNumber::max_value(), Into::into),
|
||||||
eip140_transition: p.eip140_transition.map_or(BlockNumber::max_value(), Into::into),
|
eip140_transition: p.eip140_transition.map_or(BlockNumber::max_value(), Into::into),
|
||||||
@ -143,6 +170,9 @@ impl From<ethjson::spec::Params> for CommonParams {
|
|||||||
nonce_cap_increment: p.nonce_cap_increment.map_or(64, Into::into),
|
nonce_cap_increment: p.nonce_cap_increment.map_or(64, Into::into),
|
||||||
remove_dust_contracts: p.remove_dust_contracts.unwrap_or(false),
|
remove_dust_contracts: p.remove_dust_contracts.unwrap_or(false),
|
||||||
wasm: p.wasm.unwrap_or(false),
|
wasm: p.wasm.unwrap_or(false),
|
||||||
|
gas_limit_bound_divisor: p.gas_limit_bound_divisor.into(),
|
||||||
|
block_reward: p.block_reward.map_or_else(U256::zero, Into::into),
|
||||||
|
registrar: p.registrar.map_or_else(Address::new, Into::into),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -246,7 +276,7 @@ impl Spec {
|
|||||||
) -> Arc<Engine> {
|
) -> Arc<Engine> {
|
||||||
match engine_spec {
|
match engine_spec {
|
||||||
ethjson::spec::Engine::Null => Arc::new(NullEngine::new(params, builtins)),
|
ethjson::spec::Engine::Null => Arc::new(NullEngine::new(params, builtins)),
|
||||||
ethjson::spec::Engine::InstantSeal(instant) => Arc::new(InstantSeal::new(params, instant.params.registrar.map_or_else(Address::new, Into::into), builtins)),
|
ethjson::spec::Engine::InstantSeal => Arc::new(InstantSeal::new(params, builtins)),
|
||||||
ethjson::spec::Engine::Ethash(ethash) => Arc::new(ethereum::Ethash::new(cache_dir, params, From::from(ethash.params), builtins)),
|
ethjson::spec::Engine::Ethash(ethash) => Arc::new(ethereum::Ethash::new(cache_dir, params, From::from(ethash.params), builtins)),
|
||||||
ethjson::spec::Engine::BasicAuthority(basic_authority) => Arc::new(BasicAuthority::new(params, From::from(basic_authority.params), builtins)),
|
ethjson::spec::Engine::BasicAuthority(basic_authority) => Arc::new(BasicAuthority::new(params, From::from(basic_authority.params), builtins)),
|
||||||
ethjson::spec::Engine::AuthorityRound(authority_round) => AuthorityRound::new(params, From::from(authority_round.params), builtins).expect("Failed to start AuthorityRound consensus engine."),
|
ethjson::spec::Engine::AuthorityRound(authority_round) => AuthorityRound::new(params, From::from(authority_round.params), builtins).expect("Failed to start AuthorityRound consensus engine."),
|
||||||
|
@ -396,16 +396,13 @@ pub fn get_bad_state_dummy_block() -> Bytes {
|
|||||||
create_test_block(&block_header)
|
create_test_block(&block_header)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_default_ethash_params() -> EthashParams{
|
pub fn get_default_ethash_params() -> EthashParams {
|
||||||
EthashParams {
|
EthashParams {
|
||||||
gas_limit_bound_divisor: U256::from(1024),
|
|
||||||
minimum_difficulty: U256::from(131072),
|
minimum_difficulty: U256::from(131072),
|
||||||
difficulty_bound_divisor: U256::from(2048),
|
difficulty_bound_divisor: U256::from(2048),
|
||||||
difficulty_increment_divisor: 10,
|
difficulty_increment_divisor: 10,
|
||||||
metropolis_difficulty_increment_divisor: 9,
|
metropolis_difficulty_increment_divisor: 9,
|
||||||
duration_limit: 13,
|
duration_limit: 13,
|
||||||
block_reward: U256::from(0),
|
|
||||||
registrar: "0000000000000000000000000000000000000001".into(),
|
|
||||||
homestead_transition: 1150000,
|
homestead_transition: 1150000,
|
||||||
dao_hardfork_transition: u64::max_value(),
|
dao_hardfork_transition: u64::max_value(),
|
||||||
dao_hardfork_beneficiary: "0000000000000000000000000000000000000001".into(),
|
dao_hardfork_beneficiary: "0000000000000000000000000000000000000001".into(),
|
||||||
@ -415,7 +412,6 @@ pub fn get_default_ethash_params() -> EthashParams{
|
|||||||
bomb_defuse_transition: u64::max_value(),
|
bomb_defuse_transition: u64::max_value(),
|
||||||
eip100b_transition: u64::max_value(),
|
eip100b_transition: u64::max_value(),
|
||||||
eip150_transition: u64::max_value(),
|
eip150_transition: u64::max_value(),
|
||||||
eip155_transition: u64::max_value(),
|
|
||||||
eip160_transition: u64::max_value(),
|
eip160_transition: u64::max_value(),
|
||||||
eip161abc_transition: u64::max_value(),
|
eip161abc_transition: u64::max_value(),
|
||||||
eip161d_transition: u64::max_value(),
|
eip161d_transition: u64::max_value(),
|
||||||
|
@ -14,58 +14,78 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
export default class Personal {
|
export default class Shh {
|
||||||
constructor (transport) {
|
constructor (transport) {
|
||||||
this._transport = transport;
|
this._transport = transport;
|
||||||
}
|
}
|
||||||
|
|
||||||
addToGroup (identity) {
|
info () {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_addToGroup', identity);
|
.execute('shh_info');
|
||||||
}
|
}
|
||||||
|
|
||||||
getFilterChanges (filterId) {
|
newKeyPair () {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_getFilterChanges', filterId);
|
.execute('shh_newKeyPair');
|
||||||
}
|
}
|
||||||
|
|
||||||
getMessages (filterId) {
|
addPrivateKey (privKey) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_getMessages', filterId);
|
.execute('shh_addPrivateKey', privKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
hasIdentity (identity) {
|
newSymKey () {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_hasIdentity', identity);
|
.execute('shh_newSymKey');
|
||||||
}
|
}
|
||||||
|
|
||||||
newFilter (options) {
|
getPublicKey (identity) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_newFilter', options);
|
.execute('shh_getPublicKey', identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
newGroup () {
|
getPrivateKey (identity) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_newGroup');
|
.execute('shh_getPrivateKey', identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
newIdentity () {
|
getSymKey (identity) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_newIdentity');
|
.execute('shh_getSymKey', identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
post (options) {
|
deleteKey (identity) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_post', options);
|
.execute('shh_deleteKey', identity);
|
||||||
}
|
}
|
||||||
|
|
||||||
uninstallFilter (filterId) {
|
post (messageObj) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_uninstallFilter', filterId);
|
.execute('shh_post', messageObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
version () {
|
newMessageFilter (filterObj) {
|
||||||
return this._transport
|
return this._transport
|
||||||
.execute('shh_version');
|
.execute('shh_newMessageFilter', filterObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
getFilterMessages (filterId) {
|
||||||
|
return this._transport
|
||||||
|
.execute('shh_getFilterMessages', filterId);
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteMessageFilter (filterId) {
|
||||||
|
return this._transport
|
||||||
|
.execute('shh_deleteMessageFilter', filterId);
|
||||||
|
}
|
||||||
|
|
||||||
|
subscribe (filterObj, callback) {
|
||||||
|
return this._transport
|
||||||
|
.subscribe('shh', callback, filterObj);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsubscribe (subscriptionId) {
|
||||||
|
return this._transport
|
||||||
|
.unsubscribe(subscriptionId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ export default class Ws extends JsonRpcBase {
|
|||||||
this._url = url;
|
this._url = url;
|
||||||
this._token = token;
|
this._token = token;
|
||||||
this._messages = {};
|
this._messages = {};
|
||||||
this._subscriptions = { 'eth_subscription': [], 'parity_subscription': [] };
|
this._subscriptions = { 'eth_subscription': [], 'parity_subscription': [], 'shh_subscription': [] };
|
||||||
this._sessionHash = null;
|
this._sessionHash = null;
|
||||||
|
|
||||||
this._connecting = false;
|
this._connecting = false;
|
||||||
|
@ -14,21 +14,37 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import { Data, Quantity } from '../types';
|
import { Data, Quantity, Float } from '../types';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
version: {
|
info: {
|
||||||
nodoc: 'Not present in Rust code',
|
|
||||||
desc: 'Returns the current whisper protocol version.',
|
desc: 'Returns the current whisper protocol version.',
|
||||||
params: [],
|
params: [],
|
||||||
returns: {
|
returns: {
|
||||||
type: String,
|
type: Object,
|
||||||
desc: 'The current whisper protocol version'
|
desc: 'The current whisper protocol version',
|
||||||
|
details: {
|
||||||
|
minPow: {
|
||||||
|
type: Float,
|
||||||
|
desc: 'required PoW threshold for a message to be accepted into the local pool, or null if there is empty space in the pool.'
|
||||||
|
},
|
||||||
|
messages: {
|
||||||
|
type: Quantity,
|
||||||
|
desc: 'Number of messages in the pool.'
|
||||||
|
},
|
||||||
|
memory: {
|
||||||
|
type: Quantity,
|
||||||
|
desc: 'Amount of memory used by messages in the pool.'
|
||||||
|
},
|
||||||
|
targetMemory: {
|
||||||
|
type: Quantity,
|
||||||
|
desc: 'Target amount of memory for the pool.'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
post: {
|
post: {
|
||||||
nodoc: 'Not present in Rust code',
|
|
||||||
desc: 'Sends a whisper message.',
|
desc: 'Sends a whisper message.',
|
||||||
params: [
|
params: [
|
||||||
{
|
{
|
||||||
@ -63,79 +79,122 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
newIdentity: {
|
newKeyPair: {
|
||||||
nodoc: 'Not present in Rust code',
|
desc: 'Generate a new key pair (identity) for asymmetric encryption.',
|
||||||
desc: 'Creates new whisper identity in the client.',
|
|
||||||
params: [],
|
params: [],
|
||||||
returns: {
|
returns: {
|
||||||
type: Data,
|
type: Data,
|
||||||
desc: '60 Bytes - the address of the new identiy'
|
desc: '32 Bytes - the address of the new identiy'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
hasIdentity: {
|
addPrivateKey: {
|
||||||
nodoc: 'Not present in Rust code',
|
desc: 'Import a private key to use for asymmetric decryption.',
|
||||||
desc: 'Checks if the client hold the private keys for a given identity.',
|
|
||||||
params: [
|
params: [
|
||||||
{
|
{
|
||||||
type: Data,
|
type: Data,
|
||||||
desc: '60 Bytes - The identity address to check'
|
desc: '32 Bytes - The private key to import'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: {
|
returns: {
|
||||||
type: Boolean,
|
type: Data,
|
||||||
desc: '`true` if the client holds the privatekey for that identity, otherwise `false`'
|
desc: '`32 Bytes` A unique identity to refer to this keypair by.'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
newGroup: {
|
newSymKey: {
|
||||||
nodoc: 'Not present in Rust code',
|
desc: 'Generate a key pair(identity) for symmetric encryption.',
|
||||||
desc: '(?)',
|
|
||||||
params: [],
|
params: [],
|
||||||
returns: {
|
returns: {
|
||||||
type: Data, desc: '60 Bytes - the address of the new group. (?)'
|
type: Data,
|
||||||
|
desc: '32 Bytes - the address of the new identiy'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
addToGroup: {
|
getPublicKey: {
|
||||||
nodoc: 'Not present in Rust code',
|
desc: 'Get the public key associated with an asymmetric identity.',
|
||||||
desc: '(?)',
|
|
||||||
params: [
|
params: [
|
||||||
{
|
{
|
||||||
type: Data,
|
type: Data,
|
||||||
desc: '60 Bytes - The identity address to add to a group (?)'
|
desc: '32 Bytes - The identity to fetch the public key for.'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: {
|
returns: {
|
||||||
type: Boolean,
|
type: Data,
|
||||||
desc: '`true` if the identity was successfully added to the group, otherwise `false` (?)'
|
desc: '`64 Bytes` - The public key of the asymmetric identity.'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
newFilter: {
|
getPrivateKey: {
|
||||||
nodoc: 'Not present in Rust code',
|
desc: 'Get the private key associated with an asymmetric identity.',
|
||||||
desc: 'Creates filter to notify, when client receives whisper message matching the filter options.',
|
params: [
|
||||||
|
{
|
||||||
|
type: Data,
|
||||||
|
desc: '32 Bytes - The identity to fetch the private key for.'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: Data,
|
||||||
|
desc: '`32 Bytes` - The private key of the asymmetric identity.'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
getSymKey: {
|
||||||
|
desc: 'Get the key associated with a symmetric identity.',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: Data,
|
||||||
|
desc: '`32 Bytes` - The identity to fetch the key for.'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: Data,
|
||||||
|
desc: '`64 Bytes` - The key of the asymmetric identity.'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
deleteKey: {
|
||||||
|
desc: 'Delete the key or key pair denoted by the given identity.',
|
||||||
|
params: [
|
||||||
|
{
|
||||||
|
type: Data,
|
||||||
|
desc: '`32 Bytes` - The identity to remove.'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
returns: {
|
||||||
|
type: Data,
|
||||||
|
desc: '`true` on successful removal, `false` on unkown identity'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
newMessageFilter: {
|
||||||
|
desc: 'Create a new polled filter for messages.',
|
||||||
params: [
|
params: [
|
||||||
{
|
{
|
||||||
type: Object, desc: 'The filter options:',
|
type: Object, desc: 'The filter options:',
|
||||||
details: {
|
details: {
|
||||||
to: {
|
decryptWith: {
|
||||||
type: Data, desc: '60 Bytes - Identity of the receiver. *When present it will try to decrypt any incoming message if the client holds the private key to this identity.*',
|
type: Data,
|
||||||
|
desc: '`32 bytes` - Identity of key used for description. null if listening for broadcasts.'
|
||||||
|
},
|
||||||
|
from: {
|
||||||
|
type: Data, desc: '`32 Bytes` - if present, only accept messages signed by this key.',
|
||||||
optional: true
|
optional: true
|
||||||
},
|
},
|
||||||
topics: {
|
topics: {
|
||||||
type: Array, desc: 'Array of `Data` topics which the incoming message\'s topics should match. You can use the following combinations'
|
type: Array,
|
||||||
|
desc: 'Array of `Data`. Only accept messages matching these topics. Should be non-empty.'
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: {
|
returns: {
|
||||||
type: Quantity,
|
type: Data,
|
||||||
desc: 'The newly created filter'
|
desc: '`32 bytes` - Unique identity for this filter.'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
uninstallFilter: {
|
getFilterMesssages: {
|
||||||
nodoc: 'Not present in Rust code',
|
nodoc: 'Not present in Rust code',
|
||||||
desc: 'Uninstalls a filter with given id. Should always be called when watch is no longer needed.\nAdditonally Filters timeout when they aren\'t requested with [shh_getFilterChanges](#shh_getfilterchanges) for a period of time.',
|
desc: 'Uninstalls a filter with given id. Should always be called when watch is no longer needed.\nAdditonally Filters timeout when they aren\'t requested with [shh_getFilterChanges](#shh_getfilterchanges) for a period of time.',
|
||||||
params: [
|
params: [
|
||||||
@ -150,30 +209,83 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getFilterChanges: {
|
getFilterMessages: {
|
||||||
nodoc: 'Not present in Rust code',
|
|
||||||
desc: 'Polling method for whisper filters. Returns new messages since the last call of this method.\n**Note** calling the [shh_getMessages](#shh_getmessages) method, will reset the buffer for this method, so that you won\'t receive duplicate messages.',
|
desc: 'Polling method for whisper filters. Returns new messages since the last call of this method.\n**Note** calling the [shh_getMessages](#shh_getmessages) method, will reset the buffer for this method, so that you won\'t receive duplicate messages.',
|
||||||
params: [
|
params: [
|
||||||
{
|
{
|
||||||
type: Quantity,
|
type: Data,
|
||||||
desc: 'The filter id'
|
desc: '`32 bytes` - Unique identity to fetch changes for.'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: {
|
returns: {
|
||||||
type: Array,
|
type: Array,
|
||||||
desc: 'Array of messages received since last poll'
|
desc: 'Array of `messages` received since last poll',
|
||||||
|
details: {
|
||||||
|
from: {
|
||||||
|
type: Data,
|
||||||
|
desc: '`64 bytes` - Public key that signed this message or null'
|
||||||
|
},
|
||||||
|
recipient: {
|
||||||
|
type: Data,
|
||||||
|
desc: '`32 bytes` - local identity which decrypted this message, or null if broadcast.'
|
||||||
|
},
|
||||||
|
ttl: {
|
||||||
|
type: Quantity,
|
||||||
|
desc: 'time to live of the message in seconds.'
|
||||||
|
},
|
||||||
|
topics: {
|
||||||
|
type: Array,
|
||||||
|
desc: 'Array of `Data` - Topics which matched the filter'
|
||||||
|
},
|
||||||
|
timestamp: {
|
||||||
|
type: Quantity,
|
||||||
|
desc: 'Unix timestamp of the message'
|
||||||
|
},
|
||||||
|
payload: {
|
||||||
|
type: Data,
|
||||||
|
desc: 'The message body'
|
||||||
|
},
|
||||||
|
padding: {
|
||||||
|
type: Data,
|
||||||
|
desc: 'Optional padding which was decoded.'
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
getMessages: {
|
deleteMessageFilter: {
|
||||||
nodoc: 'Not present in Rust code',
|
desc: 'Delete a message filter by identifier',
|
||||||
desc: 'Get all messages matching a filter. Unlike `shh_getFilterChanges` this returns all messages.',
|
|
||||||
params: [
|
params: [
|
||||||
{
|
{
|
||||||
type: Quantity,
|
type: Data,
|
||||||
desc: 'The filter id'
|
desc: '`32 bytes` - The identity of the filter to delete.'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: 'See [shh_getFilterChanges](#shh_getfilterchanges)'
|
returns: {
|
||||||
|
type: Boolean,
|
||||||
|
desc: '`true` on deletion, `false` on unrecognized ID.'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
subscribe: {
|
||||||
|
desc: 'Open a subscription to a filter.',
|
||||||
|
params: [{
|
||||||
|
type: Data,
|
||||||
|
desc: 'See [shh_newMessageFilter](#shh_newmessagefilter)'
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: Quantity,
|
||||||
|
desc: 'Unique subscription identifier'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
unsubscribe: {
|
||||||
|
desc: 'Close a subscribed filter',
|
||||||
|
params: [{
|
||||||
|
type: Quantity,
|
||||||
|
desc: 'Unique subscription identifier'
|
||||||
|
}],
|
||||||
|
returns: {
|
||||||
|
type: Boolean,
|
||||||
|
desc: '`true` on success, `false` on unkown subscription ID.'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -22,6 +22,8 @@ export class Hash {}
|
|||||||
|
|
||||||
export class Integer {}
|
export class Integer {}
|
||||||
|
|
||||||
|
export class Float {}
|
||||||
|
|
||||||
export class Quantity {}
|
export class Quantity {}
|
||||||
|
|
||||||
export class BlockNumber {
|
export class BlockNumber {
|
||||||
|
@ -4,7 +4,7 @@ version = "0.1.0"
|
|||||||
authors = ["Parity Technologies <admin@parity.io>"]
|
authors = ["Parity Technologies <admin@parity.io>"]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ethcore-util = { path = "../util" }
|
ethcore-bigint = { path = "../util/bigint" }
|
||||||
rustc-hex = "1.0"
|
rustc-hex = "1.0"
|
||||||
serde = "1.0"
|
serde = "1.0"
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
|
@ -21,7 +21,7 @@ use std::fmt;
|
|||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
use serde::de::{Error, Visitor};
|
use serde::de::{Error, Visitor};
|
||||||
use rustc_hex::ToHex;
|
use rustc_hex::ToHex;
|
||||||
use util::hash::{H64 as Hash64, H160 as Hash160, H256 as Hash256, H520 as Hash520, H2048 as Hash2048};
|
use bigint::hash::{H64 as Hash64, H160 as Hash160, H256 as Hash256, H520 as Hash520, H2048 as Hash2048};
|
||||||
|
|
||||||
|
|
||||||
macro_rules! impl_hash {
|
macro_rules! impl_hash {
|
||||||
@ -99,7 +99,7 @@ impl_hash!(Bloom, Hash2048);
|
|||||||
mod test {
|
mod test {
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use util::hash;
|
use bigint::hash;
|
||||||
use hash::H256;
|
use hash::H256;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
extern crate rustc_hex;
|
extern crate rustc_hex;
|
||||||
extern crate serde;
|
extern crate serde;
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
extern crate ethcore_util as util;
|
extern crate ethcore_bigint as bigint;
|
||||||
#[macro_use] extern crate serde_derive;
|
#[macro_use] extern crate serde_derive;
|
||||||
|
|
||||||
pub mod hash;
|
pub mod hash;
|
||||||
|
@ -68,7 +68,7 @@ impl<T> Into<Option<T>> for MaybeEmpty<T> {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use util::hash;
|
use bigint::hash;
|
||||||
use hash::H256;
|
use hash::H256;
|
||||||
use maybe::MaybeEmpty;
|
use maybe::MaybeEmpty;
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ mod tests {
|
|||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use spec::account::Account;
|
use spec::account::Account;
|
||||||
use util::U256;
|
use bigint::prelude::U256;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
|
|
||||||
|
@ -17,25 +17,16 @@
|
|||||||
//! Authority params deserialization.
|
//! Authority params deserialization.
|
||||||
|
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use hash::Address;
|
|
||||||
use super::ValidatorSet;
|
use super::ValidatorSet;
|
||||||
|
|
||||||
/// Authority params deserialization.
|
/// Authority params deserialization.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
pub struct AuthorityRoundParams {
|
pub struct AuthorityRoundParams {
|
||||||
/// Gas limit divisor.
|
|
||||||
#[serde(rename="gasLimitBoundDivisor")]
|
|
||||||
pub gas_limit_bound_divisor: Uint,
|
|
||||||
/// Block duration.
|
/// Block duration.
|
||||||
#[serde(rename="stepDuration")]
|
#[serde(rename="stepDuration")]
|
||||||
pub step_duration: Uint,
|
pub step_duration: Uint,
|
||||||
/// Valid authorities
|
/// Valid authorities
|
||||||
pub validators: ValidatorSet,
|
pub validators: ValidatorSet,
|
||||||
/// Block reward.
|
|
||||||
#[serde(rename="blockReward")]
|
|
||||||
pub block_reward: Option<Uint>,
|
|
||||||
/// Address of the registrar contract.
|
|
||||||
pub registrar: Option<Address>,
|
|
||||||
/// Starting step. Determined automatically if not specified.
|
/// Starting step. Determined automatically if not specified.
|
||||||
/// To be used for testing only.
|
/// To be used for testing only.
|
||||||
#[serde(rename="startStep")]
|
#[serde(rename="startStep")]
|
||||||
@ -43,9 +34,6 @@ pub struct AuthorityRoundParams {
|
|||||||
/// Block at which score validation should start.
|
/// Block at which score validation should start.
|
||||||
#[serde(rename="validateScoreTransition")]
|
#[serde(rename="validateScoreTransition")]
|
||||||
pub validate_score_transition: Option<Uint>,
|
pub validate_score_transition: Option<Uint>,
|
||||||
/// See main AuthorityRoundParams docs.
|
|
||||||
#[serde(rename="eip155Transition")]
|
|
||||||
pub eip155_transition: Option<Uint>,
|
|
||||||
/// Block from which monotonic steps start.
|
/// Block from which monotonic steps start.
|
||||||
#[serde(rename="validateStepTransition")]
|
#[serde(rename="validateStepTransition")]
|
||||||
pub validate_step_transition: Option<Uint>,
|
pub validate_step_transition: Option<Uint>,
|
||||||
@ -63,10 +51,10 @@ pub struct AuthorityRound {
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use util::{H160, U256};
|
use bigint::prelude::{U256, H160};
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use hash::Address;
|
|
||||||
use serde_json;
|
use serde_json;
|
||||||
|
use hash::Address;
|
||||||
use spec::validator_set::ValidatorSet;
|
use spec::validator_set::ValidatorSet;
|
||||||
use spec::authority_round::AuthorityRound;
|
use spec::authority_round::AuthorityRound;
|
||||||
|
|
||||||
@ -74,26 +62,19 @@ mod tests {
|
|||||||
fn authority_round_deserialization() {
|
fn authority_round_deserialization() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"stepDuration": "0x02",
|
"stepDuration": "0x02",
|
||||||
"validators": {
|
"validators": {
|
||||||
"list" : ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
"list" : ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
||||||
},
|
},
|
||||||
"blockReward": "0x50",
|
|
||||||
"startStep" : 24,
|
"startStep" : 24,
|
||||||
"eip155Transition": "0x42",
|
|
||||||
"validateStepTransition": 150
|
"validateStepTransition": 150
|
||||||
}
|
}
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
let deserialized: AuthorityRound = serde_json::from_str(s).unwrap();
|
let deserialized: AuthorityRound = serde_json::from_str(s).unwrap();
|
||||||
assert_eq!(deserialized.params.gas_limit_bound_divisor, Uint(U256::from(0x0400)));
|
|
||||||
assert_eq!(deserialized.params.step_duration, Uint(U256::from(0x02)));
|
assert_eq!(deserialized.params.step_duration, Uint(U256::from(0x02)));
|
||||||
assert_eq!(deserialized.params.validators, ValidatorSet::List(vec![Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))]));
|
assert_eq!(deserialized.params.validators, ValidatorSet::List(vec![Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))]));
|
||||||
assert_eq!(deserialized.params.block_reward, Some(Uint(U256::from(0x50))));
|
|
||||||
assert!(deserialized.params.registrar.is_none());
|
|
||||||
assert_eq!(deserialized.params.start_step, Some(Uint(U256::from(24))));
|
assert_eq!(deserialized.params.start_step, Some(Uint(U256::from(24))));
|
||||||
assert_eq!(deserialized.params.eip155_transition, Some(Uint(U256::from(0x42))));
|
|
||||||
assert_eq!(deserialized.params.immediate_transitions, None);
|
assert_eq!(deserialized.params.immediate_transitions, None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,9 +22,6 @@ use super::ValidatorSet;
|
|||||||
/// Authority params deserialization.
|
/// Authority params deserialization.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
pub struct BasicAuthorityParams {
|
pub struct BasicAuthorityParams {
|
||||||
/// Gas limit divisor.
|
|
||||||
#[serde(rename="gasLimitBoundDivisor")]
|
|
||||||
pub gas_limit_bound_divisor: Uint,
|
|
||||||
/// Block duration.
|
/// Block duration.
|
||||||
#[serde(rename="durationLimit")]
|
#[serde(rename="durationLimit")]
|
||||||
pub duration_limit: Uint,
|
pub duration_limit: Uint,
|
||||||
@ -43,9 +40,8 @@ pub struct BasicAuthority {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use util::U256;
|
use bigint::prelude::{U256, H160};
|
||||||
use hash::Address;
|
use hash::Address;
|
||||||
use util::hash::H160;
|
|
||||||
use spec::basic_authority::BasicAuthority;
|
use spec::basic_authority::BasicAuthority;
|
||||||
use spec::validator_set::ValidatorSet;
|
use spec::validator_set::ValidatorSet;
|
||||||
|
|
||||||
@ -53,7 +49,6 @@ mod tests {
|
|||||||
fn basic_authority_deserialization() {
|
fn basic_authority_deserialization() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"validators" : {
|
"validators" : {
|
||||||
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
||||||
@ -63,7 +58,6 @@ mod tests {
|
|||||||
|
|
||||||
let deserialized: BasicAuthority = serde_json::from_str(s).unwrap();
|
let deserialized: BasicAuthority = serde_json::from_str(s).unwrap();
|
||||||
|
|
||||||
assert_eq!(deserialized.params.gas_limit_bound_divisor, Uint(U256::from(0x0400)));
|
|
||||||
assert_eq!(deserialized.params.duration_limit, Uint(U256::from(0x0d)));
|
assert_eq!(deserialized.params.duration_limit, Uint(U256::from(0x0d)));
|
||||||
let vs = ValidatorSet::List(vec![Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))]);
|
let vs = ValidatorSet::List(vec![Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))]);
|
||||||
assert_eq!(deserialized.params.validators, vs);
|
assert_eq!(deserialized.params.validators, vs);
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
//! Engine deserialization.
|
//! Engine deserialization.
|
||||||
|
|
||||||
use super::{Ethash, InstantSeal, BasicAuthority, AuthorityRound, Tendermint};
|
use super::{Ethash, BasicAuthority, AuthorityRound, Tendermint};
|
||||||
|
|
||||||
/// Engine deserialization.
|
/// Engine deserialization.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
@ -26,7 +26,7 @@ pub enum Engine {
|
|||||||
Null,
|
Null,
|
||||||
/// Instantly sealing engine.
|
/// Instantly sealing engine.
|
||||||
#[serde(rename="instantSeal")]
|
#[serde(rename="instantSeal")]
|
||||||
InstantSeal(InstantSeal),
|
InstantSeal,
|
||||||
/// Ethash engine.
|
/// Ethash engine.
|
||||||
Ethash(Ethash),
|
Ethash(Ethash),
|
||||||
/// BasicAuthority engine.
|
/// BasicAuthority engine.
|
||||||
@ -55,23 +55,21 @@ mod tests {
|
|||||||
assert_eq!(Engine::Null, deserialized);
|
assert_eq!(Engine::Null, deserialized);
|
||||||
|
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"instantSeal": { "params": {} }
|
"instantSeal": null
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
let deserialized: Engine = serde_json::from_str(s).unwrap();
|
let deserialized: Engine = serde_json::from_str(s).unwrap();
|
||||||
match deserialized {
|
match deserialized {
|
||||||
Engine::InstantSeal(_) => {}, // instant seal is unit tested in its own file.
|
Engine::InstantSeal => {}, // instant seal is unit tested in its own file.
|
||||||
_ => assert!(false),
|
_ => assert!(false),
|
||||||
};
|
};
|
||||||
|
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"homesteadTransition" : "0x",
|
"homesteadTransition" : "0x",
|
||||||
"daoHardforkTransition": "0xffffffffffffffff",
|
"daoHardforkTransition": "0xffffffffffffffff",
|
||||||
@ -90,7 +88,6 @@ mod tests {
|
|||||||
let s = r#"{
|
let s = r#"{
|
||||||
"basicAuthority": {
|
"basicAuthority": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"validators" : {
|
"validators" : {
|
||||||
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
||||||
@ -107,14 +104,11 @@ mod tests {
|
|||||||
let s = r#"{
|
let s = r#"{
|
||||||
"authorityRound": {
|
"authorityRound": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"stepDuration": "0x02",
|
"stepDuration": "0x02",
|
||||||
"validators": {
|
"validators": {
|
||||||
"list" : ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
"list" : ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
||||||
},
|
},
|
||||||
"blockReward": "0x50",
|
|
||||||
"startStep" : 24,
|
"startStep" : 24,
|
||||||
"eip155Transition": "0x42",
|
|
||||||
"validateStepTransition": 150
|
"validateStepTransition": 150
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -128,11 +122,9 @@ mod tests {
|
|||||||
let s = r#"{
|
let s = r#"{
|
||||||
"tendermint": {
|
"tendermint": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"validators": {
|
"validators": {
|
||||||
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
||||||
},
|
}
|
||||||
"blockReward": "0x50"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}"#;
|
}"#;
|
||||||
|
@ -22,9 +22,6 @@ use hash::Address;
|
|||||||
/// Deserializable doppelganger of EthashParams.
|
/// Deserializable doppelganger of EthashParams.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
pub struct EthashParams {
|
pub struct EthashParams {
|
||||||
/// See main EthashParams docs.
|
|
||||||
#[serde(rename="gasLimitBoundDivisor")]
|
|
||||||
pub gas_limit_bound_divisor: Uint,
|
|
||||||
/// See main EthashParams docs.
|
/// See main EthashParams docs.
|
||||||
#[serde(rename="minimumDifficulty")]
|
#[serde(rename="minimumDifficulty")]
|
||||||
pub minimum_difficulty: Uint,
|
pub minimum_difficulty: Uint,
|
||||||
@ -40,11 +37,6 @@ pub struct EthashParams {
|
|||||||
/// See main EthashParams docs.
|
/// See main EthashParams docs.
|
||||||
#[serde(rename="durationLimit")]
|
#[serde(rename="durationLimit")]
|
||||||
pub duration_limit: Option<Uint>,
|
pub duration_limit: Option<Uint>,
|
||||||
/// See main EthashParams docs.
|
|
||||||
#[serde(rename="blockReward")]
|
|
||||||
pub block_reward: Uint,
|
|
||||||
/// See main EthashParams docs.
|
|
||||||
pub registrar: Option<Address>,
|
|
||||||
|
|
||||||
/// See main EthashParams docs.
|
/// See main EthashParams docs.
|
||||||
#[serde(rename="homesteadTransition")]
|
#[serde(rename="homesteadTransition")]
|
||||||
@ -78,10 +70,6 @@ pub struct EthashParams {
|
|||||||
#[serde(rename="eip150Transition")]
|
#[serde(rename="eip150Transition")]
|
||||||
pub eip150_transition: Option<Uint>,
|
pub eip150_transition: Option<Uint>,
|
||||||
|
|
||||||
/// See main EthashParams docs.
|
|
||||||
#[serde(rename="eip155Transition")]
|
|
||||||
pub eip155_transition: Option<Uint>,
|
|
||||||
|
|
||||||
/// See main EthashParams docs.
|
/// See main EthashParams docs.
|
||||||
#[serde(rename="eip160Transition")]
|
#[serde(rename="eip160Transition")]
|
||||||
pub eip160_transition: Option<Uint>,
|
pub eip160_transition: Option<Uint>,
|
||||||
@ -136,21 +124,17 @@ pub struct Ethash {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use util::U256;
|
use bigint::prelude::{H160, U256};
|
||||||
use hash::Address;
|
use hash::Address;
|
||||||
use util::hash::H160;
|
|
||||||
use spec::ethash::{Ethash, EthashParams};
|
use spec::ethash::{Ethash, EthashParams};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn ethash_deserialization() {
|
fn ethash_deserialization() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar": "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0x42",
|
"homesteadTransition": "0x42",
|
||||||
"daoHardforkTransition": "0x08",
|
"daoHardforkTransition": "0x08",
|
||||||
"daoHardforkBeneficiary": "0xabcabcabcabcabcabcabcabcabcabcabcabcabca",
|
"daoHardforkBeneficiary": "0xabcabcabcabcabcabcabcabcabcabcabcabcabca",
|
||||||
@ -181,7 +165,6 @@ mod tests {
|
|||||||
"bombDefuseTransition": "0x41",
|
"bombDefuseTransition": "0x41",
|
||||||
"eip100bTransition": "0x42",
|
"eip100bTransition": "0x42",
|
||||||
"eip150Transition": "0x43",
|
"eip150Transition": "0x43",
|
||||||
"eip155Transition": "0x44",
|
|
||||||
"eip160Transition": "0x45",
|
"eip160Transition": "0x45",
|
||||||
"eip161abcTransition": "0x46",
|
"eip161abcTransition": "0x46",
|
||||||
"eip161dTransition": "0x47"
|
"eip161dTransition": "0x47"
|
||||||
@ -190,16 +173,13 @@ mod tests {
|
|||||||
|
|
||||||
let deserialized: Ethash = serde_json::from_str(s).unwrap();
|
let deserialized: Ethash = serde_json::from_str(s).unwrap();
|
||||||
|
|
||||||
assert_eq!(deserialized, Ethash{
|
assert_eq!(deserialized, Ethash {
|
||||||
params: EthashParams{
|
params: EthashParams{
|
||||||
gas_limit_bound_divisor: Uint(U256::from(0x0400)),
|
|
||||||
minimum_difficulty: Uint(U256::from(0x020000)),
|
minimum_difficulty: Uint(U256::from(0x020000)),
|
||||||
difficulty_bound_divisor: Uint(U256::from(0x0800)),
|
difficulty_bound_divisor: Uint(U256::from(0x0800)),
|
||||||
difficulty_increment_divisor: None,
|
difficulty_increment_divisor: None,
|
||||||
metropolis_difficulty_increment_divisor: None,
|
metropolis_difficulty_increment_divisor: None,
|
||||||
duration_limit: Some(Uint(U256::from(0x0d))),
|
duration_limit: Some(Uint(U256::from(0x0d))),
|
||||||
block_reward: Uint(U256::from(0x4563918244F40000u64)),
|
|
||||||
registrar: Some(Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))),
|
|
||||||
homestead_transition: Some(Uint(U256::from(0x42))),
|
homestead_transition: Some(Uint(U256::from(0x42))),
|
||||||
dao_hardfork_transition: Some(Uint(U256::from(0x08))),
|
dao_hardfork_transition: Some(Uint(U256::from(0x08))),
|
||||||
dao_hardfork_beneficiary: Some(Address(H160::from("0xabcabcabcabcabcabcabcabcabcabcabcabcabca"))),
|
dao_hardfork_beneficiary: Some(Address(H160::from("0xabcabcabcabcabcabcabcabcabcabcabcabcabca"))),
|
||||||
@ -230,7 +210,6 @@ mod tests {
|
|||||||
bomb_defuse_transition: Some(Uint(U256::from(0x41))),
|
bomb_defuse_transition: Some(Uint(U256::from(0x41))),
|
||||||
eip100b_transition: Some(Uint(U256::from(0x42))),
|
eip100b_transition: Some(Uint(U256::from(0x42))),
|
||||||
eip150_transition: Some(Uint(U256::from(0x43))),
|
eip150_transition: Some(Uint(U256::from(0x43))),
|
||||||
eip155_transition: Some(Uint(U256::from(0x44))),
|
|
||||||
eip160_transition: Some(Uint(U256::from(0x45))),
|
eip160_transition: Some(Uint(U256::from(0x45))),
|
||||||
eip161abc_transition: Some(Uint(U256::from(0x46))),
|
eip161abc_transition: Some(Uint(U256::from(0x46))),
|
||||||
eip161d_transition: Some(Uint(U256::from(0x47))),
|
eip161d_transition: Some(Uint(U256::from(0x47))),
|
||||||
@ -250,24 +229,19 @@ mod tests {
|
|||||||
fn ethash_deserialization_missing_optionals() {
|
fn ethash_deserialization_missing_optionals() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"blockReward": "0x4563918244F40000"
|
"minimumDifficulty": "0x020000"
|
||||||
}
|
}
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
let deserialized: Ethash = serde_json::from_str(s).unwrap();
|
let deserialized: Ethash = serde_json::from_str(s).unwrap();
|
||||||
assert_eq!(deserialized, Ethash{
|
assert_eq!(deserialized, Ethash {
|
||||||
params: EthashParams{
|
params: EthashParams {
|
||||||
gas_limit_bound_divisor: Uint(U256::from(0x0400)),
|
|
||||||
minimum_difficulty: Uint(U256::from(0x020000)),
|
minimum_difficulty: Uint(U256::from(0x020000)),
|
||||||
difficulty_bound_divisor: Uint(U256::from(0x0800)),
|
difficulty_bound_divisor: Uint(U256::from(0x0800)),
|
||||||
difficulty_increment_divisor: None,
|
difficulty_increment_divisor: None,
|
||||||
metropolis_difficulty_increment_divisor: None,
|
metropolis_difficulty_increment_divisor: None,
|
||||||
duration_limit: None,
|
duration_limit: None,
|
||||||
block_reward: Uint(U256::from(0x4563918244F40000u64)),
|
|
||||||
registrar: None,
|
|
||||||
homestead_transition: None,
|
homestead_transition: None,
|
||||||
dao_hardfork_transition: None,
|
dao_hardfork_transition: None,
|
||||||
dao_hardfork_beneficiary: None,
|
dao_hardfork_beneficiary: None,
|
||||||
@ -277,7 +251,6 @@ mod tests {
|
|||||||
bomb_defuse_transition: None,
|
bomb_defuse_transition: None,
|
||||||
eip100b_transition: None,
|
eip100b_transition: None,
|
||||||
eip150_transition: None,
|
eip150_transition: None,
|
||||||
eip155_transition: None,
|
|
||||||
eip160_transition: None,
|
eip160_transition: None,
|
||||||
eip161abc_transition: None,
|
eip161abc_transition: None,
|
||||||
eip161d_transition: None,
|
eip161d_transition: None,
|
||||||
|
@ -60,10 +60,8 @@ mod tests {
|
|||||||
use serde_json;
|
use serde_json;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use util::U256;
|
use bigint::prelude::{U256, H160, H64 as Eth64, H256 as Eth256};
|
||||||
use hash::{H64, H256, Address};
|
use hash::{H64, H256, Address};
|
||||||
use util::hash::H160;
|
|
||||||
use util::{H64 as Eth64, H256 as Eth256};
|
|
||||||
use spec::genesis::Genesis;
|
use spec::genesis::Genesis;
|
||||||
use spec::{Ethereum, Seal};
|
use spec::{Ethereum, Seal};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
@ -1,53 +0,0 @@
|
|||||||
// Copyright 2015-2017 Parity Technologies (UK) Ltd.
|
|
||||||
// This file is part of Parity.
|
|
||||||
|
|
||||||
// Parity is free software: you can redistribute it and/or modify
|
|
||||||
// it under the terms of the GNU General Public License as published by
|
|
||||||
// the Free Software Foundation, either version 3 of the License, or
|
|
||||||
// (at your option) any later version.
|
|
||||||
|
|
||||||
// Parity is distributed in the hope that it will be useful,
|
|
||||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
// GNU General Public License for more details.
|
|
||||||
|
|
||||||
// You should have received a copy of the GNU General Public License
|
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
//! Instant params deserialization.
|
|
||||||
|
|
||||||
use hash::Address;
|
|
||||||
|
|
||||||
/// Instant params deserialization.
|
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
|
||||||
pub struct InstantSealParams {
|
|
||||||
/// Address of the registrar contract.
|
|
||||||
pub registrar: Option<Address>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Instant engine deserialization.
|
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
|
||||||
pub struct InstantSeal {
|
|
||||||
/// Instant Seal params.
|
|
||||||
pub params: InstantSealParams,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(test)]
|
|
||||||
mod tests {
|
|
||||||
use serde_json;
|
|
||||||
use hash::Address;
|
|
||||||
use util::hash::H160;
|
|
||||||
use spec::instant_seal::InstantSeal;
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn instant_seal_deserialization() {
|
|
||||||
let s = r#"{
|
|
||||||
"params": {
|
|
||||||
"registrar": "0xc6d9d2cd449a754c494264e1809c50e34d64562b"
|
|
||||||
}
|
|
||||||
}"#;
|
|
||||||
|
|
||||||
let deserialized: InstantSeal = serde_json::from_str(s).unwrap();
|
|
||||||
assert_eq!(deserialized.params.registrar, Some(Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))));
|
|
||||||
}
|
|
||||||
}
|
|
@ -26,7 +26,6 @@ pub mod engine;
|
|||||||
pub mod state;
|
pub mod state;
|
||||||
pub mod ethash;
|
pub mod ethash;
|
||||||
pub mod validator_set;
|
pub mod validator_set;
|
||||||
pub mod instant_seal;
|
|
||||||
pub mod basic_authority;
|
pub mod basic_authority;
|
||||||
pub mod authority_round;
|
pub mod authority_round;
|
||||||
pub mod tendermint;
|
pub mod tendermint;
|
||||||
@ -41,7 +40,6 @@ pub use self::engine::Engine;
|
|||||||
pub use self::state::State;
|
pub use self::state::State;
|
||||||
pub use self::ethash::{Ethash, EthashParams};
|
pub use self::ethash::{Ethash, EthashParams};
|
||||||
pub use self::validator_set::ValidatorSet;
|
pub use self::validator_set::ValidatorSet;
|
||||||
pub use self::instant_seal::{InstantSeal, InstantSealParams};
|
|
||||||
pub use self::basic_authority::{BasicAuthority, BasicAuthorityParams};
|
pub use self::basic_authority::{BasicAuthority, BasicAuthorityParams};
|
||||||
pub use self::authority_round::{AuthorityRound, AuthorityRoundParams};
|
pub use self::authority_round::{AuthorityRound, AuthorityRoundParams};
|
||||||
pub use self::tendermint::{Tendermint, TendermintParams};
|
pub use self::tendermint::{Tendermint, TendermintParams};
|
||||||
|
@ -55,6 +55,9 @@ pub struct Params {
|
|||||||
#[serde(rename="eip98Transition")]
|
#[serde(rename="eip98Transition")]
|
||||||
pub eip98_transition: Option<Uint>,
|
pub eip98_transition: Option<Uint>,
|
||||||
/// See `CommonParams` docs.
|
/// See `CommonParams` docs.
|
||||||
|
#[serde(rename="eip155Transition")]
|
||||||
|
pub eip155_transition: Option<Uint>,
|
||||||
|
/// See `CommonParams` docs.
|
||||||
#[serde(rename="validateReceiptsTransition")]
|
#[serde(rename="validateReceiptsTransition")]
|
||||||
pub validate_receipts_transition: Option<Uint>,
|
pub validate_receipts_transition: Option<Uint>,
|
||||||
/// See `CommonParams` docs.
|
/// See `CommonParams` docs.
|
||||||
@ -91,13 +94,21 @@ pub struct Params {
|
|||||||
pub remove_dust_contracts : Option<bool>,
|
pub remove_dust_contracts : Option<bool>,
|
||||||
/// Wasm support flag
|
/// Wasm support flag
|
||||||
pub wasm: Option<bool>,
|
pub wasm: Option<bool>,
|
||||||
|
/// See `CommonParams` docs.
|
||||||
|
#[serde(rename="gasLimitBoundDivisor")]
|
||||||
|
pub gas_limit_bound_divisor: Uint,
|
||||||
|
/// See `CommonParams` docs.
|
||||||
|
#[serde(rename="blockReward")]
|
||||||
|
pub block_reward: Option<Uint>,
|
||||||
|
/// See `CommonParams` docs.
|
||||||
|
pub registrar: Option<Address>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use util::U256;
|
use bigint::prelude::U256;
|
||||||
use spec::params::Params;
|
use spec::params::Params;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -108,7 +119,8 @@ mod tests {
|
|||||||
"chainID" : "0x15",
|
"chainID" : "0x15",
|
||||||
"subprotocolName" : "exp",
|
"subprotocolName" : "exp",
|
||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"accountStartNonce": "0x01"
|
"accountStartNonce": "0x01",
|
||||||
|
"gasLimitBoundDivisor": "0x20"
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
let deserialized: Params = serde_json::from_str(s).unwrap();
|
let deserialized: Params = serde_json::from_str(s).unwrap();
|
||||||
@ -118,5 +130,6 @@ mod tests {
|
|||||||
assert_eq!(deserialized.subprotocol_name, Some("exp".to_owned()));
|
assert_eq!(deserialized.subprotocol_name, Some("exp".to_owned()));
|
||||||
assert_eq!(deserialized.min_gas_limit, Uint(U256::from(0x1388)));
|
assert_eq!(deserialized.min_gas_limit, Uint(U256::from(0x1388)));
|
||||||
assert_eq!(deserialized.account_start_nonce, Some(Uint(U256::from(0x01))));
|
assert_eq!(deserialized.account_start_nonce, Some(Uint(U256::from(0x01))));
|
||||||
|
assert_eq!(deserialized.gas_limit_bound_divisor, Uint(U256::from(0x20)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -73,8 +73,7 @@ mod tests {
|
|||||||
use hash::*;
|
use hash::*;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use util::U256;
|
use bigint::prelude::{U256, H64 as Eth64, H256 as Eth256, H520 as Eth520};
|
||||||
use util::{H64 as Eth64, H256 as Eth256, H520 as Eth520};
|
|
||||||
use spec::{Ethereum, AuthorityRoundSeal, TendermintSeal, Seal};
|
use spec::{Ethereum, AuthorityRoundSeal, TendermintSeal, Seal};
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -61,12 +61,9 @@ mod tests {
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition" : "0x",
|
"homesteadTransition" : "0x",
|
||||||
"daoHardforkTransition": "0xffffffffffffffff",
|
"daoHardforkTransition": "0xffffffffffffffff",
|
||||||
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
||||||
@ -81,7 +78,8 @@ mod tests {
|
|||||||
"minGasLimit": "0x1388",
|
"minGasLimit": "0x1388",
|
||||||
"networkID" : "0x2",
|
"networkID" : "0x2",
|
||||||
"forkBlock": "0xffffffffffffffff",
|
"forkBlock": "0xffffffffffffffff",
|
||||||
"forkCanonHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
|
"forkCanonHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
|
||||||
|
"gasLimitBoundDivisor": "0x20"
|
||||||
},
|
},
|
||||||
"genesis": {
|
"genesis": {
|
||||||
"seal": {
|
"seal": {
|
||||||
|
@ -17,15 +17,11 @@
|
|||||||
//! Tendermint params deserialization.
|
//! Tendermint params deserialization.
|
||||||
|
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use hash::Address;
|
|
||||||
use super::ValidatorSet;
|
use super::ValidatorSet;
|
||||||
|
|
||||||
/// Tendermint params deserialization.
|
/// Tendermint params deserialization.
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
pub struct TendermintParams {
|
pub struct TendermintParams {
|
||||||
/// Gas limit divisor.
|
|
||||||
#[serde(rename="gasLimitBoundDivisor")]
|
|
||||||
pub gas_limit_bound_divisor: Uint,
|
|
||||||
/// Valid validators.
|
/// Valid validators.
|
||||||
pub validators: ValidatorSet,
|
pub validators: ValidatorSet,
|
||||||
/// Propose step timeout in milliseconds.
|
/// Propose step timeout in milliseconds.
|
||||||
@ -40,11 +36,6 @@ pub struct TendermintParams {
|
|||||||
/// Commit step timeout in milliseconds.
|
/// Commit step timeout in milliseconds.
|
||||||
#[serde(rename="timeoutCommit")]
|
#[serde(rename="timeoutCommit")]
|
||||||
pub timeout_commit: Option<Uint>,
|
pub timeout_commit: Option<Uint>,
|
||||||
/// Block reward.
|
|
||||||
#[serde(rename="blockReward")]
|
|
||||||
pub block_reward: Option<Uint>,
|
|
||||||
/// Address of the registrar contract.
|
|
||||||
pub registrar: Option<Address>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Tendermint engine deserialization.
|
/// Tendermint engine deserialization.
|
||||||
@ -57,10 +48,7 @@ pub struct Tendermint {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use uint::Uint;
|
use bigint::prelude::H160;
|
||||||
use util::U256;
|
|
||||||
use hash::Address;
|
|
||||||
use util::hash::H160;
|
|
||||||
use spec::tendermint::Tendermint;
|
use spec::tendermint::Tendermint;
|
||||||
use spec::validator_set::ValidatorSet;
|
use spec::validator_set::ValidatorSet;
|
||||||
|
|
||||||
@ -68,18 +56,14 @@ mod tests {
|
|||||||
fn tendermint_deserialization() {
|
fn tendermint_deserialization() {
|
||||||
let s = r#"{
|
let s = r#"{
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"validators": {
|
"validators": {
|
||||||
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
"list": ["0xc6d9d2cd449a754c494264e1809c50e34d64562b"]
|
||||||
},
|
}
|
||||||
"blockReward": "0x50"
|
|
||||||
}
|
}
|
||||||
}"#;
|
}"#;
|
||||||
|
|
||||||
let deserialized: Tendermint = serde_json::from_str(s).unwrap();
|
let deserialized: Tendermint = serde_json::from_str(s).unwrap();
|
||||||
assert_eq!(deserialized.params.gas_limit_bound_divisor, Uint(U256::from(0x0400)));
|
|
||||||
let vs = ValidatorSet::List(vec![Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))]);
|
let vs = ValidatorSet::List(vec![Address(H160::from("0xc6d9d2cd449a754c494264e1809c50e34d64562b"))]);
|
||||||
assert_eq!(deserialized.params.validators, vs);
|
assert_eq!(deserialized.params.validators, vs);
|
||||||
assert_eq!(deserialized.params.block_reward, Some(Uint(U256::from(0x50))));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,9 +41,8 @@ pub enum ValidatorSet {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use util::U256;
|
use bigint::prelude::{H160, U256};
|
||||||
use hash::Address;
|
use hash::Address;
|
||||||
use util::hash::H160;
|
|
||||||
use spec::validator_set::ValidatorSet;
|
use spec::validator_set::ValidatorSet;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -20,7 +20,7 @@ use std::fmt;
|
|||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
use serde::{Deserialize, Deserializer};
|
use serde::{Deserialize, Deserializer};
|
||||||
use serde::de::{Error, Visitor};
|
use serde::de::{Error, Visitor};
|
||||||
use util::U256;
|
use bigint::prelude::U256;
|
||||||
|
|
||||||
/// Lenient uint json deserialization for test json files.
|
/// Lenient uint json deserialization for test json files.
|
||||||
#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
|
#[derive(Default, Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
|
||||||
@ -93,7 +93,7 @@ impl<'a> Visitor<'a> for UintVisitor {
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use util::U256;
|
use bigint::prelude::U256;
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -39,7 +39,7 @@ pub struct Call {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use serde_json;
|
use serde_json;
|
||||||
use vm::Call;
|
use vm::Call;
|
||||||
use util::{U256, H160 as Hash160};
|
use bigint::prelude::{U256, H160 as Hash160};
|
||||||
use uint::Uint;
|
use uint::Uint;
|
||||||
use hash::Address;
|
use hash::Address;
|
||||||
use maybe::MaybeEmpty;
|
use maybe::MaybeEmpty;
|
||||||
|
@ -227,12 +227,9 @@ const TRANSACTION_COUNT_SPEC: &'static [u8] = br#"{
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0xffffffffffffffff",
|
"homesteadTransition": "0xffffffffffffffff",
|
||||||
"daoHardforkTransition": "0xffffffffffffffff",
|
"daoHardforkTransition": "0xffffffffffffffff",
|
||||||
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
||||||
@ -241,6 +238,9 @@ const TRANSACTION_COUNT_SPEC: &'static [u8] = br#"{
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x00",
|
"accountStartNonce": "0x00",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x50000",
|
"minGasLimit": "0x50000",
|
||||||
@ -275,12 +275,9 @@ const POSITIVE_NONCE_SPEC: &'static [u8] = br#"{
|
|||||||
"engine": {
|
"engine": {
|
||||||
"Ethash": {
|
"Ethash": {
|
||||||
"params": {
|
"params": {
|
||||||
"gasLimitBoundDivisor": "0x0400",
|
|
||||||
"minimumDifficulty": "0x020000",
|
"minimumDifficulty": "0x020000",
|
||||||
"difficultyBoundDivisor": "0x0800",
|
"difficultyBoundDivisor": "0x0800",
|
||||||
"durationLimit": "0x0d",
|
"durationLimit": "0x0d",
|
||||||
"blockReward": "0x4563918244F40000",
|
|
||||||
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
|
||||||
"homesteadTransition": "0xffffffffffffffff",
|
"homesteadTransition": "0xffffffffffffffff",
|
||||||
"daoHardforkTransition": "0xffffffffffffffff",
|
"daoHardforkTransition": "0xffffffffffffffff",
|
||||||
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
"daoHardforkBeneficiary": "0x0000000000000000000000000000000000000000",
|
||||||
@ -289,6 +286,9 @@ const POSITIVE_NONCE_SPEC: &'static [u8] = br#"{
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"params": {
|
"params": {
|
||||||
|
"gasLimitBoundDivisor": "0x0400",
|
||||||
|
"blockReward": "0x4563918244F40000",
|
||||||
|
"registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b",
|
||||||
"accountStartNonce": "0x0100",
|
"accountStartNonce": "0x0100",
|
||||||
"maximumExtraDataSize": "0x20",
|
"maximumExtraDataSize": "0x20",
|
||||||
"minGasLimit": "0x50000",
|
"minGasLimit": "0x50000",
|
||||||
|
Loading…
Reference in New Issue
Block a user