diff options
author | Péter Szilágyi <peterke@gmail.com> | 2016-03-01 16:59:12 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2016-03-01 16:59:12 +0800 |
commit | f30b809f00cfe98190c682407943583f235f39d0 (patch) | |
tree | cd908d75bb01a821bd6ea72224d0154a9e8a16a6 /eth | |
parent | 7d598af49324176cd60b6ce89bc8a72080098675 (diff) | |
parent | 0ff2adb21b4d9a4699f50b1d1a65873fac39d258 (diff) | |
download | go-tangerine-f30b809f00cfe98190c682407943583f235f39d0.tar go-tangerine-f30b809f00cfe98190c682407943583f235f39d0.tar.gz go-tangerine-f30b809f00cfe98190c682407943583f235f39d0.tar.bz2 go-tangerine-f30b809f00cfe98190c682407943583f235f39d0.tar.lz go-tangerine-f30b809f00cfe98190c682407943583f235f39d0.tar.xz go-tangerine-f30b809f00cfe98190c682407943583f235f39d0.tar.zst go-tangerine-f30b809f00cfe98190c682407943583f235f39d0.zip |
Merge pull request #2215 from bas-vk/estimategas
core: improved check for contract creation
Diffstat (limited to 'eth')
-rw-r--r-- | eth/api.go | 65 |
1 files changed, 31 insertions, 34 deletions
diff --git a/eth/api.go b/eth/api.go index cfbafd79f..38b67a07a 100644 --- a/eth/api.go +++ b/eth/api.go @@ -620,12 +620,12 @@ func (m callmsg) Value() *big.Int { return m.value } func (m callmsg) Data() []byte { return m.data } type CallArgs struct { - From common.Address `json:"from"` - To common.Address `json:"to"` - Gas rpc.HexNumber `json:"gas"` - GasPrice rpc.HexNumber `json:"gasPrice"` - Value rpc.HexNumber `json:"value"` - Data string `json:"data"` + From common.Address `json:"from"` + To *common.Address `json:"to"` + Gas rpc.HexNumber `json:"gas"` + GasPrice rpc.HexNumber `json:"gasPrice"` + Value rpc.HexNumber `json:"value"` + Data string `json:"data"` } func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (string, *big.Int, error) { @@ -653,7 +653,7 @@ func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (st // Assemble the CALL invocation msg := callmsg{ from: from, - to: &args.To, + to: args.To, gas: args.Gas.BigInt(), gasPrice: args.GasPrice.BigInt(), value: args.Value.BigInt(), @@ -665,6 +665,7 @@ func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (st if msg.gasPrice.Cmp(common.Big0) == 0 { msg.gasPrice = new(big.Int).Mul(big.NewInt(50), common.Shannon) } + // Execute the call and return vmenv := core.NewEnv(stateDb, s.bc, msg, block.Header()) gp := new(core.GasPool).AddGas(common.MaxBig) @@ -1012,13 +1013,13 @@ func (s *PublicTransactionPoolAPI) sign(address common.Address, tx *types.Transa } type SendTxArgs struct { - From common.Address `json:"from"` - To common.Address `json:"to"` - Gas *rpc.HexNumber `json:"gas"` - GasPrice *rpc.HexNumber `json:"gasPrice"` - Value *rpc.HexNumber `json:"value"` - Data string `json:"data"` - Nonce *rpc.HexNumber `json:"nonce"` + From common.Address `json:"from"` + To *common.Address `json:"to"` + Gas *rpc.HexNumber `json:"gas"` + GasPrice *rpc.HexNumber `json:"gasPrice"` + Value *rpc.HexNumber `json:"value"` + Data string `json:"data"` + Nonce *rpc.HexNumber `json:"nonce"` } // SendTransaction will create a transaction for the given transaction argument, sign it and submit it to the @@ -1042,12 +1043,12 @@ func (s *PublicTransactionPoolAPI) SendTransaction(args SendTxArgs) (common.Hash } var tx *types.Transaction - contractCreation := (args.To == common.Address{}) + contractCreation := (args.To == nil) if contractCreation { tx = types.NewContractCreation(args.Nonce.Uint64(), args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) } else { - tx = types.NewTransaction(args.Nonce.Uint64(), args.To, args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) + tx = types.NewTransaction(args.Nonce.Uint64(), *args.To, args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) } signedTx, err := s.sign(args.From, tx) @@ -1106,7 +1107,7 @@ func (s *PublicTransactionPoolAPI) Sign(address common.Address, data string) (st type SignTransactionArgs struct { From common.Address - To common.Address + To *common.Address Nonce *rpc.HexNumber Value *rpc.HexNumber Gas *rpc.HexNumber @@ -1132,23 +1133,21 @@ type Tx struct { func (tx *Tx) UnmarshalJSON(b []byte) (err error) { req := struct { - To common.Address `json:"to"` - From common.Address `json:"from"` - Nonce *rpc.HexNumber `json:"nonce"` - Value *rpc.HexNumber `json:"value"` - Data string `json:"data"` - GasLimit *rpc.HexNumber `json:"gas"` - GasPrice *rpc.HexNumber `json:"gasPrice"` - Hash common.Hash `json:"hash"` + To *common.Address `json:"to"` + From common.Address `json:"from"` + Nonce *rpc.HexNumber `json:"nonce"` + Value *rpc.HexNumber `json:"value"` + Data string `json:"data"` + GasLimit *rpc.HexNumber `json:"gas"` + GasPrice *rpc.HexNumber `json:"gasPrice"` + Hash common.Hash `json:"hash"` }{} if err := json.Unmarshal(b, &req); err != nil { return err } - contractCreation := (req.To == (common.Address{})) - - tx.To = &req.To + tx.To = req.To tx.From = req.From tx.Nonce = req.Nonce tx.Value = req.Value @@ -1172,12 +1171,10 @@ func (tx *Tx) UnmarshalJSON(b []byte) (err error) { tx.GasPrice = rpc.NewHexNumber(int64(50000000000)) } + contractCreation := (req.To == nil) if contractCreation { tx.tx = types.NewContractCreation(tx.Nonce.Uint64(), tx.Value.BigInt(), tx.GasLimit.BigInt(), tx.GasPrice.BigInt(), data) } else { - if tx.To == nil { - return fmt.Errorf("need to address") - } tx.tx = types.NewTransaction(tx.Nonce.Uint64(), *tx.To, tx.Value.BigInt(), tx.GasLimit.BigInt(), tx.GasPrice.BigInt(), data) } @@ -1226,12 +1223,12 @@ func (s *PublicTransactionPoolAPI) SignTransaction(args *SignTransactionArgs) (* } var tx *types.Transaction - contractCreation := (args.To == common.Address{}) + contractCreation := (args.To == nil) if contractCreation { tx = types.NewContractCreation(args.Nonce.Uint64(), args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) } else { - tx = types.NewTransaction(args.Nonce.Uint64(), args.To, args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) + tx = types.NewTransaction(args.Nonce.Uint64(), *args.To, args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) } signedTx, err := s.sign(args.From, tx) @@ -1324,7 +1321,7 @@ func (s *PublicTransactionPoolAPI) Resend(tx *Tx, gasPrice, gasLimit *rpc.HexNum } var newTx *types.Transaction - contractCreation := (*tx.tx.To() == common.Address{}) + contractCreation := (tx.tx.To() == nil) if contractCreation { newTx = types.NewContractCreation(tx.tx.Nonce(), tx.tx.Value(), gasPrice.BigInt(), gasLimit.BigInt(), tx.tx.Data()) } else { |