diff --git a/consensus/ethash/consensus.go b/consensus/ethash/consensus.go index fc5269abe5..a6c1432e36 100644 --- a/consensus/ethash/consensus.go +++ b/consensus/ethash/consensus.go @@ -315,7 +315,7 @@ func calcDifficultyHomestead(time uint64, parent *types.Header) *big.Int { // (parent_diff / 2048 * max(1 - (block_timestamp - parent_timestamp) // 10, -99)) // ) + 2^(periodCount - 2) - bigTime := new(big.Int).Set(time) + bigTime := new(big.Int).SetUint64(time) bigParentTime := new(big.Int).Set(parent.Time) // holds intermediate values to make the algo easier to read & audit diff --git a/core/chain_makers.go b/core/chain_makers.go index 9677442823..c812396072 100644 --- a/core/chain_makers.go +++ b/core/chain_makers.go @@ -209,9 +209,6 @@ func makeHeader(config *params.ChainConfig, parent *types.Block, state *state.St } else { time = new(big.Int).Add(parent.Time(), big.NewInt(10)) // block time is fixed at 10 seconds } - parentHeader := parent.Header() - // adjust the parent time - parentHeader.Time = new(big.Int).Sub(time, big.NewInt(10)) return &types.Header{ Root: state.IntermediateRoot(config.IsEIP158(parent.Number())), diff --git a/core/types/transaction_signing.go b/core/types/transaction_signing.go index 25c08a580a..b0f3275b2a 100644 --- a/core/types/transaction_signing.go +++ b/core/types/transaction_signing.go @@ -108,17 +108,6 @@ type Signer interface { Equal(Signer) bool } -/* -// WithSignature returns a new transaction with the given signature. This signature -// needs to be in the [R || S || V] format where V is 0 or 1. -func (s EIP86Signer) WithSignature(tx *Transaction, sig []byte) (*Transaction, error) { -} - -// Hash returns the hash to be signed by the sender. -// It does not uniquely identify the transaction. -func (s EIP86Signer) Hash(tx *Transaction) common.Hash {} -*/ - // EIP155Transaction implements TransactionInterface using the // EIP155 rules type EIP155Signer struct { diff --git a/core/vm/interpreter.go b/core/vm/interpreter.go index 07971f8764..e54c725751 100644 --- a/core/vm/interpreter.go +++ b/core/vm/interpreter.go @@ -45,7 +45,7 @@ type Config struct { DisableGasMetering bool // Enable recording of SHA3/keccak preimages EnablePreimageRecording bool - // JumpTable contains the in instruction table. This + // JumpTable contains the EVM instruction table. This // may me left uninitialised and will be set the default // table. JumpTable [256]operation @@ -74,7 +74,7 @@ func NewInterpreter(evm *EVM, cfg Config) *Interpreter { case evm.ChainConfig().IsHomestead(evm.BlockNumber): cfg.JumpTable = homesteadInstructionSet default: - cfg.JumpTable = baseInstructionSet + cfg.JumpTable = frontierInstructionSet } } @@ -131,14 +131,14 @@ func (in *Interpreter) Run(snapshot int, contract *Contract, input []byte) (ret } }() - log.Debug("in running contract", "hash", codehash[:]) + log.Debug("interpreter running contract", "hash", codehash[:]) tstart := time.Now() - defer log.Debug("in finished running contract", "hash", codehash[:], "elapsed", time.Since(tstart)) + defer log.Debug("interpreter finished running contract", "hash", codehash[:], "elapsed", time.Since(tstart)) // The Interpreter main run loop (contextual). This loop runs until either an // explicit STOP, RETURN or SELFDESTRUCT is executed, an error occurred during - // the execution of one of the operations or until the in.done is set by - // the parent context.Context. + // the execution of one of the operations or until the done flag is set by the + // parent context. for atomic.LoadInt32(&in.evm.abort) == 0 { // Get the memory location of pc op = contract.GetOp(pc) diff --git a/core/vm/jump_table.go b/core/vm/jump_table.go index c4a1430b25..a6d49166e1 100644 --- a/core/vm/jump_table.go +++ b/core/vm/jump_table.go @@ -56,12 +56,14 @@ type operation struct { } var ( - baseInstructionSet = NewBaseInstructionSet() + frontierInstructionSet = NewFrontierInstructionSet() homesteadInstructionSet = NewHomesteadInstructionSet() ) +// NewHomesteadInstructionSet returns the frontier and homestead +// instructions that can be executed during the homestead phase. func NewHomesteadInstructionSet() [256]operation { - instructionSet := NewBaseInstructionSet() + instructionSet := NewFrontierInstructionSet() instructionSet[DELEGATECALL] = operation{ execute: opDelegateCall, gasCost: gasDelegateCall, @@ -72,7 +74,9 @@ func NewHomesteadInstructionSet() [256]operation { return instructionSet } -func NewBaseInstructionSet() [256]operation { +// NewFrontierInstructionSet returns the frontier instructions +// that can be executed during the frontier phase. +func NewFrontierInstructionSet() [256]operation { return [256]operation{ STOP: { execute: opStop, diff --git a/params/config.go b/params/config.go index 543682e443..50268f6336 100644 --- a/params/config.go +++ b/params/config.go @@ -56,14 +56,16 @@ var ( // RinkebyChainConfig contains the chain parameters to run a node on the Rinkeby test network. RinkebyChainConfig = &ChainConfig{ - ChainId: big.NewInt(4), - HomesteadBlock: big.NewInt(1), - DAOForkBlock: nil, - DAOForkSupport: true, - EIP150Block: big.NewInt(2), - EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"), - EIP155Block: big.NewInt(3), - EIP158Block: big.NewInt(3), + ChainId: big.NewInt(4), + HomesteadBlock: big.NewInt(1), + DAOForkBlock: nil, + DAOForkSupport: true, + EIP150Block: big.NewInt(2), + EIP150Hash: common.HexToHash("0x9b095b36c15eaf13044373aef8ee0bd3a382a5abb92e402afa44b8249c3a90e9"), + EIP155Block: big.NewInt(3), + EIP158Block: big.NewInt(3), + MetropolisBlock: TestNetMetropolisBlock, + Clique: &CliqueConfig{ Period: 15, Epoch: 30000, @@ -99,10 +101,10 @@ type ChainConfig struct { EIP150Block *big.Int `json:"eip150Block,omitempty"` // EIP150 HF block (nil = no fork) EIP150Hash common.Hash `json:"eip150Hash,omitempty"` // EIP150 HF hash (fast sync aid) - EIP155Block *big.Int `json:"eip155Block"` // EIP155 HF block - EIP158Block *big.Int `json:"eip158Block"` // EIP158 HF block + EIP155Block *big.Int `json:"eip155Block,omitempty"` // EIP155 HF block + EIP158Block *big.Int `json:"eip158Block,omitempty"` // EIP158 HF block - MetropolisBlock *big.Int `json:"metropolisBlock"` // Metropolis switch block (nil = no fork, 0 = alraedy on homestead) + MetropolisBlock *big.Int `json:"metropolisBlock,omitempty"` // Metropolis switch block (nil = no fork, 0 = alraedy on homestead) // Various consensus engines Ethash *EthashConfig `json:"ethash,omitempty"` @@ -174,6 +176,10 @@ func (c *ChainConfig) IsEIP158(num *big.Int) bool { return isForked(c.EIP158Block, num) } +func (c *ChainConfig) IsMetropolis(num *big.Int) bool { + return isForked(c.MetropolisBlock, num) +} + // GasTable returns the gas table corresponding to the current phase (homestead or homestead reprice). // // The returned GasTable's fields shouldn't, under any circumstances, be changed. @@ -231,6 +237,9 @@ func (c *ChainConfig) checkCompatible(newcfg *ChainConfig, head *big.Int) *Confi if c.IsEIP158(head) && !configNumEqual(c.ChainId, newcfg.ChainId) { return newCompatError("EIP158 chain ID", c.EIP158Block, newcfg.EIP158Block) } + if isForkIncompatible(c.MetropolisBlock, newcfg.MetropolisBlock, head) { + return newCompatError("Metropolis fork block", c.MetropolisBlock, newcfg.MetropolisBlock) + } return nil } @@ -258,13 +267,6 @@ func configNumEqual(x, y *big.Int) bool { return x.Cmp(y) == 0 } -func (c *ChainConfig) IsMetropolis(num *big.Int) bool { - if c.MetropolisBlock == nil || num == nil { - return false - } - return num.Cmp(c.MetropolisBlock) >= 0 -} - // ConfigCompatError is raised if the locally-stored blockchain is initialised with a // ChainConfig that would alter the past. type ConfigCompatError struct {