From 497ab68ce0e2a02eb477f41679140360c9562269 Mon Sep 17 00:00:00 2001 From: Patrick Mylund Nielsen Date: Wed, 16 Nov 2016 12:57:41 -0500 Subject: [PATCH 1/2] Increment sender nonce even if we are ignoring a private transaction --- core/state_transition.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/core/state_transition.go b/core/state_transition.go index 92efe6029..9bb167e05 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -233,13 +233,24 @@ func (self *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *b if err = self.preCheck(); err != nil { return } - msg := self.msg - sender, _ := self.from() // err checked in preCheck - - var data []byte + var ( + msg = self.msg + sender, _ = self.from() // err checked in preCheck + contractCreation = MessageCreatesContract(msg) + vmenv = self.env + state = vmenv.Db() + data []byte + ) + if env, ok := vmenv.(DualStateEnv); ok { + state = env.PublicState() + } if tx, ok := msg.(*types.Transaction); ok && tx.IsPrivate() { data, err = private.P.Receive(self.data) if err != nil { + if !contractCreation { + // Increment the nonce even if we are ignoring this transaction + state.SetNonce(sender.Address(), state.GetNonce(sender.Address())+1) + } return nil, nil, nil, err } } else { @@ -247,13 +258,11 @@ func (self *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *b } homestead := self.env.RuleSet().IsHomestead(self.env.BlockNumber()) - contractCreation := MessageCreatesContract(msg) // Pay intrinsic gas if err = self.useGas(IntrinsicGas(data, contractCreation, homestead)); err != nil { return nil, nil, nil, InvalidTxError(err) } - vmenv := self.env //var addr common.Address if contractCreation { ret, _, err = vmenv.Create(sender, data, self.gas, self.gasPrice, self.value) @@ -266,10 +275,6 @@ func (self *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *b glog.V(logger.Core).Infoln("VM create err:", err) } } else { - state := vmenv.Db() - if env, ok := vmenv.(DualStateEnv); ok { - state = env.PublicState() - } // Increment the nonce for the next transaction state.SetNonce(sender.Address(), state.GetNonce(sender.Address())+1) ret, err = vmenv.Call(sender, self.to().Address(), data, self.gas, self.gasPrice, self.value) From 46d00bf6396345a34d0c32adfbdcd79e6af87329 Mon Sep 17 00:00:00 2001 From: Patrick Mylund Nielsen Date: Wed, 16 Nov 2016 13:03:42 -0500 Subject: [PATCH 2/2] Return zero gas usage on private transactions whether or not you're party to the transaction --- core/state_transition.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/state_transition.go b/core/state_transition.go index 9bb167e05..442f70aec 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -240,11 +240,13 @@ func (self *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *b vmenv = self.env state = vmenv.Db() data []byte + isPrivate bool ) if env, ok := vmenv.(DualStateEnv); ok { state = env.PublicState() } if tx, ok := msg.(*types.Transaction); ok && tx.IsPrivate() { + isPrivate = true data, err = private.P.Receive(self.data) if err != nil { if !contractCreation { @@ -297,6 +299,9 @@ func (self *StateTransition) TransitionDb() (ret []byte, requiredGas, usedGas *b self.refundGas() self.state.AddBalance(self.env.Coinbase(), new(big.Int).Mul(self.gasUsed(), self.gasPrice)) + if isPrivate { + return ret, new(big.Int), new(big.Int), err + } return ret, requiredGas, self.gasUsed(), err }