core: improved check for contract creation

This commit is contained in:
Bas van Kervel 2016-02-15 10:13:39 +01:00
parent 4f28c5b69d
commit 0ff2adb21b
2 changed files with 32 additions and 35 deletions

View File

@ -73,7 +73,7 @@ func MessageCreatesContract(msg Message) bool {
return msg.To() == nil return msg.To() == nil
} }
// IntrinsicGas computes the 'intrisic gas' for a message // IntrinsicGas computes the 'intrinsic gas' for a message
// with the given data. // with the given data.
func IntrinsicGas(data []byte) *big.Int { func IntrinsicGas(data []byte) *big.Int {
igas := new(big.Int).Set(params.TxGas) igas := new(big.Int).Set(params.TxGas)

View File

@ -619,12 +619,12 @@ func (m callmsg) Value() *big.Int { return m.value }
func (m callmsg) Data() []byte { return m.data } func (m callmsg) Data() []byte { return m.data }
type CallArgs struct { type CallArgs struct {
From common.Address `json:"from"` From common.Address `json:"from"`
To common.Address `json:"to"` To *common.Address `json:"to"`
Gas rpc.HexNumber `json:"gas"` Gas rpc.HexNumber `json:"gas"`
GasPrice rpc.HexNumber `json:"gasPrice"` GasPrice rpc.HexNumber `json:"gasPrice"`
Value rpc.HexNumber `json:"value"` Value rpc.HexNumber `json:"value"`
Data string `json:"data"` Data string `json:"data"`
} }
func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (string, *big.Int, error) { func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (string, *big.Int, error) {
@ -652,7 +652,7 @@ func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (st
// Assemble the CALL invocation // Assemble the CALL invocation
msg := callmsg{ msg := callmsg{
from: from, from: from,
to: &args.To, to: args.To,
gas: args.Gas.BigInt(), gas: args.Gas.BigInt(),
gasPrice: args.GasPrice.BigInt(), gasPrice: args.GasPrice.BigInt(),
value: args.Value.BigInt(), value: args.Value.BigInt(),
@ -664,6 +664,7 @@ func (s *PublicBlockChainAPI) doCall(args CallArgs, blockNr rpc.BlockNumber) (st
if msg.gasPrice.Cmp(common.Big0) == 0 { if msg.gasPrice.Cmp(common.Big0) == 0 {
msg.gasPrice = new(big.Int).Mul(big.NewInt(50), common.Shannon) msg.gasPrice = new(big.Int).Mul(big.NewInt(50), common.Shannon)
} }
// Execute the call and return // Execute the call and return
vmenv := core.NewEnv(stateDb, s.bc, msg, block.Header()) vmenv := core.NewEnv(stateDb, s.bc, msg, block.Header())
gp := new(core.GasPool).AddGas(common.MaxBig) gp := new(core.GasPool).AddGas(common.MaxBig)
@ -1011,13 +1012,13 @@ func (s *PublicTransactionPoolAPI) sign(address common.Address, tx *types.Transa
} }
type SendTxArgs struct { type SendTxArgs struct {
From common.Address `json:"from"` From common.Address `json:"from"`
To common.Address `json:"to"` To *common.Address `json:"to"`
Gas *rpc.HexNumber `json:"gas"` Gas *rpc.HexNumber `json:"gas"`
GasPrice *rpc.HexNumber `json:"gasPrice"` GasPrice *rpc.HexNumber `json:"gasPrice"`
Value *rpc.HexNumber `json:"value"` Value *rpc.HexNumber `json:"value"`
Data string `json:"data"` Data string `json:"data"`
Nonce *rpc.HexNumber `json:"nonce"` Nonce *rpc.HexNumber `json:"nonce"`
} }
// SendTransaction will create a transaction for the given transaction argument, sign it and submit it to the // SendTransaction will create a transaction for the given transaction argument, sign it and submit it to the
@ -1041,12 +1042,12 @@ func (s *PublicTransactionPoolAPI) SendTransaction(args SendTxArgs) (common.Hash
} }
var tx *types.Transaction var tx *types.Transaction
contractCreation := (args.To == common.Address{}) contractCreation := (args.To == nil)
if contractCreation { if contractCreation {
tx = types.NewContractCreation(args.Nonce.Uint64(), args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) tx = types.NewContractCreation(args.Nonce.Uint64(), args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data))
} else { } 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) signedTx, err := s.sign(args.From, tx)
@ -1105,7 +1106,7 @@ func (s *PublicTransactionPoolAPI) Sign(address common.Address, data string) (st
type SignTransactionArgs struct { type SignTransactionArgs struct {
From common.Address From common.Address
To common.Address To *common.Address
Nonce *rpc.HexNumber Nonce *rpc.HexNumber
Value *rpc.HexNumber Value *rpc.HexNumber
Gas *rpc.HexNumber Gas *rpc.HexNumber
@ -1131,23 +1132,21 @@ type Tx struct {
func (tx *Tx) UnmarshalJSON(b []byte) (err error) { func (tx *Tx) UnmarshalJSON(b []byte) (err error) {
req := struct { req := struct {
To common.Address `json:"to"` To *common.Address `json:"to"`
From common.Address `json:"from"` From common.Address `json:"from"`
Nonce *rpc.HexNumber `json:"nonce"` Nonce *rpc.HexNumber `json:"nonce"`
Value *rpc.HexNumber `json:"value"` Value *rpc.HexNumber `json:"value"`
Data string `json:"data"` Data string `json:"data"`
GasLimit *rpc.HexNumber `json:"gas"` GasLimit *rpc.HexNumber `json:"gas"`
GasPrice *rpc.HexNumber `json:"gasPrice"` GasPrice *rpc.HexNumber `json:"gasPrice"`
Hash common.Hash `json:"hash"` Hash common.Hash `json:"hash"`
}{} }{}
if err := json.Unmarshal(b, &req); err != nil { if err := json.Unmarshal(b, &req); err != nil {
return err return err
} }
contractCreation := (req.To == (common.Address{})) tx.To = req.To
tx.To = &req.To
tx.From = req.From tx.From = req.From
tx.Nonce = req.Nonce tx.Nonce = req.Nonce
tx.Value = req.Value tx.Value = req.Value
@ -1171,12 +1170,10 @@ func (tx *Tx) UnmarshalJSON(b []byte) (err error) {
tx.GasPrice = rpc.NewHexNumber(int64(50000000000)) tx.GasPrice = rpc.NewHexNumber(int64(50000000000))
} }
contractCreation := (req.To == nil)
if contractCreation { if contractCreation {
tx.tx = types.NewContractCreation(tx.Nonce.Uint64(), tx.Value.BigInt(), tx.GasLimit.BigInt(), tx.GasPrice.BigInt(), data) tx.tx = types.NewContractCreation(tx.Nonce.Uint64(), tx.Value.BigInt(), tx.GasLimit.BigInt(), tx.GasPrice.BigInt(), data)
} else { } 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) tx.tx = types.NewTransaction(tx.Nonce.Uint64(), *tx.To, tx.Value.BigInt(), tx.GasLimit.BigInt(), tx.GasPrice.BigInt(), data)
} }
@ -1225,12 +1222,12 @@ func (s *PublicTransactionPoolAPI) SignTransaction(args *SignTransactionArgs) (*
} }
var tx *types.Transaction var tx *types.Transaction
contractCreation := (args.To == common.Address{}) contractCreation := (args.To == nil)
if contractCreation { if contractCreation {
tx = types.NewContractCreation(args.Nonce.Uint64(), args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data)) tx = types.NewContractCreation(args.Nonce.Uint64(), args.Value.BigInt(), args.Gas.BigInt(), args.GasPrice.BigInt(), common.FromHex(args.Data))
} else { } 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) signedTx, err := s.sign(args.From, tx)
@ -1323,7 +1320,7 @@ func (s *PublicTransactionPoolAPI) Resend(tx *Tx, gasPrice, gasLimit *rpc.HexNum
} }
var newTx *types.Transaction var newTx *types.Transaction
contractCreation := (*tx.tx.To() == common.Address{}) contractCreation := (tx.tx.To() == nil)
if contractCreation { if contractCreation {
newTx = types.NewContractCreation(tx.tx.Nonce(), tx.tx.Value(), gasPrice.BigInt(), gasLimit.BigInt(), tx.tx.Data()) newTx = types.NewContractCreation(tx.tx.Nonce(), tx.tx.Value(), gasPrice.BigInt(), gasLimit.BigInt(), tx.tx.Data())
} else { } else {