From 5da18796730f3c08e246d4bd61b658fd17d4e553 Mon Sep 17 00:00:00 2001 From: Gav Wood Date: Wed, 21 Jan 2015 11:30:16 -0800 Subject: [PATCH] Better, modular Genesis info. --- libethereum/CanonBlockChain.cpp | 13 ++++++++++--- libethereum/GenesisInfo.cpp | 6 +++++- libevm/VM.cpp | 5 +++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/libethereum/CanonBlockChain.cpp b/libethereum/CanonBlockChain.cpp index 0e468970c..50184161e 100644 --- a/libethereum/CanonBlockChain.cpp +++ b/libethereum/CanonBlockChain.cpp @@ -48,13 +48,20 @@ std::map const& dev::eth::genesisState() js::mValue val; json_spirit::read_string(c_genesisInfo, val); for (auto account: val.get_obj()) - if (account.second.get_obj()["code"].get_str().size()) + { + u256 balance; + if (account.second.get_obj().count("balance")) + balance = fromBigEndian(fromHex(account.second.get_obj()["balance"].get_str())); + else + balance = u256(account.second.get_obj()["finney"].get_str()) * finney; + if (account.second.get_obj().count("code")) { - s_ret[Address(fromHex(account.first))] = Account(fromBigEndian(fromHex(account.second.get_obj()["balance"].get_str())), Account::ContractConception); + s_ret[Address(fromHex(account.first))] = Account(balance, Account::ContractConception); s_ret[Address(fromHex(account.first))].setCode(fromHex(account.second.get_obj()["code"].get_str())); } else - s_ret[Address(fromHex(account.first))] = Account(fromBigEndian(fromHex(account.second.get_obj()["balance"].get_str())), Account::NormalCreation); + s_ret[Address(fromHex(account.first))] = Account(balance, Account::NormalCreation); + } } return s_ret; } diff --git a/libethereum/GenesisInfo.cpp b/libethereum/GenesisInfo.cpp index 5b5a4ba5d..b417837a7 100644 --- a/libethereum/GenesisInfo.cpp +++ b/libethereum/GenesisInfo.cpp @@ -32,6 +32,10 @@ R"ETHEREUM( "cd2a3d9f938e13cd947ec05abc7fe734df8dd826": { "balance": "0000000000000100000000000000000000000000000000000000000000000000" }, "6c386a4b26f73c802f34673f7248bb118f97424a": { "balance": "0000000000000100000000000000000000000000000000000000000000000000" }, "e4157b34ea9615cfbde6b4fda419828124b70c78": { "balance": "0000000000000100000000000000000000000000000000000000000000000000" }, - "000000000000000000000000000000000000002a": { "balance": "0000000000000100000000000000000000000000000000000000000000000000", code: "60035415601c576000600060006000609660020a3360155a03f150005b610100331015602757005b60003560805260805160a060020a02330160a0523460a051540160a051553460805154016080515560006000546003600154041015607557506a027b46536c66c8e300000060005460015401115b608157600060025560a5565b600254608f574260025560a4565b62093a806002544203111560a35760016003555b5b5b" } + "000000000000000000000000000000000000002a": { "balance": "0000000000000100000000000000000000000000000000000000000000000000", "code": "60035415601c576000600060006000609660020a3360155a03f150005b610100331015602757005b60003560805260805160a060020a02330160a0523460a051540160a051553460805154016080515560006000546003600154041015607557506a027b46536c66c8e300000060005460015401115b608157600060025560a5565b600254608f574260025560a4565b62093a806002544203111560a35760016003555b5b5b" }, + "b0afc46d9ce366d06ab4952ca27db1d9557ae9fd": { "finney": "154162184" }, + "f6b1e9dc460d4d62cc22ec5f987d726929c0f9f0": { "finney": "102774789" }, + "cc45122d8b7fa0b1eaa6b29e0fb561422a9239d0": { "finney": "51387394" }, + "b7576e9d314df41ec5506494293afb1bd5d3f65d": { "finney": "69423399" }, } )ETHEREUM"; diff --git a/libevm/VM.cpp b/libevm/VM.cpp index d60f585a5..a922cbf14 100644 --- a/libevm/VM.cpp +++ b/libevm/VM.cpp @@ -34,7 +34,8 @@ void VM::reset(u256 _gas) noexcept bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _steps) { - auto memNeed = [](dev::u256 _offset, dev::u256 _size) { return _size ? (bigint)_offset + _size : (bigint)0; }; + auto memNeed = [](u256 _offset, dev::u256 _size) { return _size ? (bigint)_offset + _size : (bigint)0; }; + auto gasForMem = [](bigint _size) -> bigint { bigint s = _size / 32; return (bigint)c_memoryGas * (s + s * s / 1024); }; if (m_jumpDests.empty()) for (unsigned i = 0; i < _ext.code.size(); ++i) @@ -297,7 +298,7 @@ bytesConstRef VM::go(ExtVMFace& _ext, OnOpFunc const& _onOp, uint64_t _steps) newTempSize = (newTempSize + 31) / 32 * 32; if (newTempSize > m_temp.size()) - runGas += c_memoryGas * (newTempSize - m_temp.size()) / 32; + runGas += gasForMem(newTempSize) - gasForMem(m_temp.size()); runGas += c_copyGas * (copySize + 31) / 32; onOperation();