浏览代码

Add missing err checks on From() (skip RPC for now)

Gustav Simonsson 10 年之前
父节点
当前提交
147a699c65
共有 4 个文件被更改,包括 25 次插入18 次删除
  1. 0 1
      cmd/geth/admin.go
  2. 20 15
      core/state_transition.go
  3. 1 1
      core/transaction_pool.go
  4. 4 1
      xeth/types.go

+ 0 - 1
cmd/geth/admin.go

@@ -160,7 +160,6 @@ func (js *jsre) pendingTransactions(call otto.FunctionCall) otto.Value {
 	//ltxs := make([]*tx, len(txs))
 	var ltxs []*tx
 	for _, tx := range txs {
-		// no need to check err
 		if from, _ := tx.From(); accountSet.Has(from) {
 			ltxs = append(ltxs, newTx(tx))
 		}

+ 20 - 15
core/state_transition.go

@@ -62,7 +62,6 @@ type Message interface {
 
 func AddressFromMessage(msg Message) common.Address {
 	from, _ := msg.From()
-
 	return crypto.CreateAddress(from, msg.Nonce())
 }
 
@@ -109,9 +108,12 @@ func NewStateTransition(env vm.Environment, msg Message, coinbase *state.StateOb
 func (self *StateTransition) Coinbase() *state.StateObject {
 	return self.state.GetOrNewStateObject(self.coinbase)
 }
-func (self *StateTransition) From() *state.StateObject {
-	f, _ := self.msg.From()
-	return self.state.GetOrNewStateObject(f)
+func (self *StateTransition) From() (*state.StateObject, error) {
+	f, err := self.msg.From()
+	if err != nil {
+		return nil, err
+	}
+	return self.state.GetOrNewStateObject(f), nil
 }
 func (self *StateTransition) To() *state.StateObject {
 	if self.msg == nil {
@@ -140,7 +142,10 @@ func (self *StateTransition) AddGas(amount *big.Int) {
 func (self *StateTransition) BuyGas() error {
 	var err error
 
-	sender := self.From()
+	sender, err := self.From()
+	if err != nil {
+		return err
+	}
 	if sender.Balance().Cmp(MessageGasValue(self.msg)) < 0 {
 		return fmt.Errorf("insufficient ETH for gas (%x). Req %v, has %v", sender.Address().Bytes()[:4], MessageGasValue(self.msg), sender.Balance())
 	}
@@ -159,10 +164,11 @@ func (self *StateTransition) BuyGas() error {
 }
 
 func (self *StateTransition) preCheck() (err error) {
-	var (
-		msg    = self.msg
-		sender = self.From()
-	)
+	msg := self.msg
+	sender, err := self.From()
+	if err != nil {
+		return err
+	}
 
 	// Make sure this transaction's nonce is correct
 	if sender.Nonce() != msg.Nonce() {
@@ -185,10 +191,8 @@ func (self *StateTransition) transitionState() (ret []byte, usedGas *big.Int, er
 		return
 	}
 
-	var (
-		msg    = self.msg
-		sender = self.From()
-	)
+	msg := self.msg
+	sender, _ := self.From() // err checked in preCheck
 
 	// Pay intrinsic gas
 	if err = self.UseGas(IntrinsicGas(self.msg)); err != nil {
@@ -212,7 +216,7 @@ func (self *StateTransition) transitionState() (ret []byte, usedGas *big.Int, er
 	} else {
 		// Increment the nonce for the next transaction
 		self.state.SetNonce(sender.Address(), sender.Nonce()+1)
-		ret, err = vmenv.Call(self.From(), self.To().Address(), self.msg.Data(), self.gas, self.gasPrice, self.value)
+		ret, err = vmenv.Call(sender, self.To().Address(), self.msg.Data(), self.gas, self.gasPrice, self.value)
 	}
 
 	if err != nil && IsValueTransferErr(err) {
@@ -226,7 +230,8 @@ func (self *StateTransition) transitionState() (ret []byte, usedGas *big.Int, er
 }
 
 func (self *StateTransition) refundGas() {
-	coinbase, sender := self.Coinbase(), self.From()
+	coinbase := self.Coinbase()
+	sender, _ := self.From() // err already checked
 	// Return remaining gas
 	remaining := new(big.Int).Mul(self.gas, self.msg.GasPrice())
 	sender.AddBalance(remaining)

+ 1 - 1
core/transaction_pool.go

@@ -277,7 +277,7 @@ func (pool *TxPool) Stop() {
 }
 
 func (self *TxPool) queueTx(tx *types.Transaction) {
-	from, _ := tx.From()
+	from, _ := tx.From() // already validated
 	self.queue[from] = append(self.queue[from], tx)
 }
 

+ 4 - 1
xeth/types.go

@@ -139,6 +139,10 @@ type Transaction struct {
 }
 
 func NewTx(tx *types.Transaction) *Transaction {
+	sender, err := tx.From()
+	if err != nil {
+		return nil
+	}
 	hash := tx.Hash().Hex()
 
 	var receiver string
@@ -147,7 +151,6 @@ func NewTx(tx *types.Transaction) *Transaction {
 	} else {
 		receiver = core.AddressFromMessage(tx).Hex()
 	}
-	sender, _ := tx.From()
 	createsContract := core.MessageCreatesContract(tx)
 
 	var data string