aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/vm/gas_table.go11
-rw-r--r--core/vm/instructions_test.go76
-rw-r--r--params/config.go26
-rw-r--r--tests/state_test_util.go6
4 files changed, 103 insertions, 16 deletions
diff --git a/core/vm/gas_table.go b/core/vm/gas_table.go
index 10b4f719a..df79f86ec 100644
--- a/core/vm/gas_table.go
+++ b/core/vm/gas_table.go
@@ -347,6 +347,17 @@ func gasCreate2(gt params.GasTable, evm *EVM, contract *Contract, stack *Stack,
if gas, overflow = math.SafeAdd(gas, params.Create2Gas); overflow {
return 0, errGasUintOverflow
}
+ wordGas, overflow := bigUint64(stack.Back(2))
+ if overflow {
+ return 0, errGasUintOverflow
+ }
+ if wordGas, overflow = math.SafeMul(toWordSize(wordGas), params.Sha3WordGas); overflow {
+ return 0, errGasUintOverflow
+ }
+ if gas, overflow = math.SafeAdd(gas, wordGas); overflow {
+ return 0, errGasUintOverflow
+ }
+
return gas, nil
}
diff --git a/core/vm/instructions_test.go b/core/vm/instructions_test.go
index 48caadf1f..c0e62e4ce 100644
--- a/core/vm/instructions_test.go
+++ b/core/vm/instructions_test.go
@@ -17,10 +17,12 @@
package vm
import (
+ "bytes"
"math/big"
"testing"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/crypto"
"github.com/ethereum/go-ethereum/params"
)
@@ -489,3 +491,77 @@ func BenchmarkOpMstore(bench *testing.B) {
}
poolOfIntPools.put(evmInterpreter.intPool)
}
+
+func TestCreate2Addreses(t *testing.T) {
+ type testcase struct {
+ origin string
+ salt string
+ code string
+ expected string
+ }
+
+ for i, tt := range []testcase{
+ {
+ origin: "0x0000000000000000000000000000000000000000",
+ salt: "0x0000000000000000000000000000000000000000",
+ code: "0x00",
+ expected: "0x4d1a2e2bb4f88f0250f26ffff098b0b30b26bf38",
+ },
+ {
+ origin: "0xdeadbeef00000000000000000000000000000000",
+ salt: "0x0000000000000000000000000000000000000000",
+ code: "0x00",
+ expected: "0xB928f69Bb1D91Cd65274e3c79d8986362984fDA3",
+ },
+ {
+ origin: "0xdeadbeef00000000000000000000000000000000",
+ salt: "0xfeed000000000000000000000000000000000000",
+ code: "0x00",
+ expected: "0xD04116cDd17beBE565EB2422F2497E06cC1C9833",
+ },
+ {
+ origin: "0x0000000000000000000000000000000000000000",
+ salt: "0x0000000000000000000000000000000000000000",
+ code: "0xdeadbeef",
+ expected: "0x70f2b2914A2a4b783FaEFb75f459A580616Fcb5e",
+ },
+ {
+ origin: "0x00000000000000000000000000000000deadbeef",
+ salt: "0xcafebabe",
+ code: "0xdeadbeef",
+ expected: "0x60f3f640a8508fC6a86d45DF051962668E1e8AC7",
+ },
+ {
+ origin: "0x00000000000000000000000000000000deadbeef",
+ salt: "0xcafebabe",
+ code: "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef",
+ expected: "0x1d8bfDC5D46DC4f61D6b6115972536eBE6A8854C",
+ },
+ {
+ origin: "0x0000000000000000000000000000000000000000",
+ salt: "0x0000000000000000000000000000000000000000",
+ code: "0x",
+ expected: "0xE33C0C7F7df4809055C3ebA6c09CFe4BaF1BD9e0",
+ },
+ } {
+
+ origin := common.BytesToAddress(common.FromHex(tt.origin))
+ salt := common.BytesToHash(common.FromHex(tt.salt))
+ code := common.FromHex(tt.code)
+ address := crypto.CreateAddress2(origin, salt, code)
+ /*
+ stack := newstack()
+ // salt, but we don't need that for this test
+ stack.push(big.NewInt(int64(len(code)))) //size
+ stack.push(big.NewInt(0)) // memstart
+ stack.push(big.NewInt(0)) // value
+ gas, _ := gasCreate2(params.GasTable{}, nil, nil, stack, nil, 0)
+ fmt.Printf("Example %d\n* address `0x%x`\n* salt `0x%x`\n* init_code `0x%x`\n* gas (assuming no mem expansion): `%v`\n* result: `%s`\n\n", i,origin, salt, code, gas, address.String())
+ */
+ expected := common.BytesToAddress(common.FromHex(tt.expected))
+ if !bytes.Equal(expected.Bytes(), address.Bytes()) {
+ t.Errorf("test %d: expected %s, got %s", i, expected.String(), address.String())
+ }
+
+ }
+}
diff --git a/params/config.go b/params/config.go
index b56775e32..ba719b873 100644
--- a/params/config.go
+++ b/params/config.go
@@ -49,10 +49,10 @@ var (
// MainnetTrustedCheckpoint contains the light client trusted checkpoint for the main network.
MainnetTrustedCheckpoint = &TrustedCheckpoint{
Name: "mainnet",
- SectionIndex: 193,
- SectionHead: common.HexToHash("0xc2d574295ecedc4d58530ae24c31a5a98be7d2b3327fba0dd0f4ed3913828a55"),
- CHTRoot: common.HexToHash("0x5d1027dfae688c77376e842679ceada87fd94738feb9b32ef165473bfbbb317b"),
- BloomRoot: common.HexToHash("0xd38be1a06aabd568e10957fee4fcc523bc64996bcf31bae3f55f86e0a583919f"),
+ SectionIndex: 195,
+ SectionHead: common.HexToHash("0x1cdd2a84cf6c1261ffccc88f6bcefb513abd7934a96c1e909fbf74767560f16b"),
+ CHTRoot: common.HexToHash("0xe453333c20391d16b91b6fe11c104704f62c8dba15f69db73b4cdf7e100105eb"),
+ BloomRoot: common.HexToHash("0x47f30069473072e00d2cdca146dce40f0aad243dfc8221bf810822c091674efe"),
}
// TestnetChainConfig contains the chain parameters to run a node on the Ropsten test network.
@@ -66,17 +66,17 @@ var (
EIP155Block: big.NewInt(10),
EIP158Block: big.NewInt(10),
ByzantiumBlock: big.NewInt(1700000),
- ConstantinopleBlock: big.NewInt(4200000),
+ ConstantinopleBlock: big.NewInt(4230000),
Ethash: new(EthashConfig),
}
// TestnetTrustedCheckpoint contains the light client trusted checkpoint for the Ropsten test network.
TestnetTrustedCheckpoint = &TrustedCheckpoint{
Name: "testnet",
- SectionIndex: 123,
- SectionHead: common.HexToHash("0xa372a53decb68ce453da12bea1c8ee7b568b276aa2aab94d9060aa7c81fc3dee"),
- CHTRoot: common.HexToHash("0x6b02e7fada79cd2a80d4b3623df9c44384d6647fc127462e1c188ccd09ece87b"),
- BloomRoot: common.HexToHash("0xf2d27490914968279d6377d42868928632573e823b5d1d4a944cba6009e16259"),
+ SectionIndex: 126,
+ SectionHead: common.HexToHash("0x48f7dd4c9c60be04bf15fd4d0bcac46ddd8caf6b01d6fb8f8e1f7955cdd1337a"),
+ CHTRoot: common.HexToHash("0x6e54cb80a1884881ea1a114243af9012c95e0296b47f103b5ab124313968508e"),
+ BloomRoot: common.HexToHash("0xb55accf6dce6455b47db8510d15eff38d0ed7378829f3036d26b48e7d15da3f6"),
}
// RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network.
@@ -100,10 +100,10 @@ var (
// RinkebyTrustedCheckpoint contains the light client trusted checkpoint for the Rinkeby test network.
RinkebyTrustedCheckpoint = &TrustedCheckpoint{
Name: "rinkeby",
- SectionIndex: 91,
- SectionHead: common.HexToHash("0x435b7b2d8a7922f3b9a522f2fb02730e95e0e1782f0f5443894d5415bba37154"),
- CHTRoot: common.HexToHash("0x0664bf7ecccfb6775c4eca6f0f264fb5282a22754a2135a1ac4bff2ef02898dd"),
- BloomRoot: common.HexToHash("0x2a64df2400c3a2cb6400639bb6ed29389abdb4d93e2e525aa7c21f38767cd96f"),
+ SectionIndex: 93,
+ SectionHead: common.HexToHash("0xdefb94aa217ab38f2919f7318d1d5476bd2aabf1ec9148047fe03e555615e0b4"),
+ CHTRoot: common.HexToHash("0x52c98c2fe508a8332c27dc10538f3fead43306e2b22b597587763c2fe6586da6"),
+ BloomRoot: common.HexToHash("0x93d83be0c1b12f732b1a027ecdfb16f39b0d020b8c10bfb90e76f3b01adfc5b6"),
}
// AllEthashProtocolChanges contains every protocol change (EIPs) introduced
diff --git a/tests/state_test_util.go b/tests/state_test_util.go
index 5d2251e52..3683aae32 100644
--- a/tests/state_test_util.go
+++ b/tests/state_test_util.go
@@ -143,9 +143,6 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD
if _, _, _, err := core.ApplyMessage(evm, msg, gaspool); err != nil {
statedb.RevertToSnapshot(snapshot)
}
- if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) {
- return statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs)
- }
// Commit block
statedb.Commit(config.IsEIP158(block.Number()))
// Add 0-value mining reward. This only makes a difference in the cases
@@ -161,6 +158,9 @@ func (t *StateTest) Run(subtest StateSubtest, vmconfig vm.Config) (*state.StateD
if root != common.Hash(post.Root) {
return statedb, fmt.Errorf("post state root mismatch: got %x, want %x", root, post.Root)
}
+ if logs := rlpHash(statedb.Logs()); logs != common.Hash(post.Logs) {
+ return statedb, fmt.Errorf("post state logs hash mismatch: got %x, want %x", logs, post.Logs)
+ }
return statedb, nil
}