Bas van Kervel пре 10 година
родитељ
комит
a5d5387dee
2 измењених фајлова са 33 додато и 15 уклоњено
  1. 9 0
      rpc/api/eth.go
  2. 24 15
      rpc/api/eth_args.go

+ 9 - 0
rpc/api/eth.go

@@ -7,7 +7,9 @@ import (
 
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/core/types"
+	"github.com/ethereum/go-ethereum/crypto/sha3"
 	"github.com/ethereum/go-ethereum/eth"
+	"github.com/ethereum/go-ethereum/rlp"
 	"github.com/ethereum/go-ethereum/rpc/codec"
 	"github.com/ethereum/go-ethereum/rpc/shared"
 	"github.com/ethereum/go-ethereum/xeth"
@@ -555,6 +557,13 @@ func (self *ethApi) SubmitWork(req *shared.Request) (interface{}, error) {
 	return self.xeth.RemoteMining().SubmitWork(args.Nonce, common.HexToHash(args.Digest), common.HexToHash(args.Header)), nil
 }
 
+func rlpHash(x interface{}) (h common.Hash) {
+	hw := sha3.NewKeccak256()
+	rlp.Encode(hw, x)
+	hw.Sum(h[:0])
+	return h
+}
+
 func (self *ethApi) Resend(req *shared.Request) (interface{}, error) {
 	args := new(ResendArgs)
 	if err := self.codec.Decode(req.Params, &args); err != nil {

+ 24 - 15
rpc/api/eth_args.go

@@ -885,10 +885,10 @@ func newTx(t *types.Transaction) *tx {
 		tx:       t,
 		To:       to,
 		From:     from.Hex(),
-		Value:    t.Amount.String(),
+		Value:    t.Value().String(),
 		Nonce:    strconv.Itoa(int(t.Nonce())),
 		Data:     "0x" + common.Bytes2Hex(t.Data()),
-		GasLimit: t.GasLimit.String(),
+		GasLimit: t.Gas().String(),
 		GasPrice: t.GasPrice().String(),
 	}
 }
@@ -905,16 +905,21 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) {
 		return shared.NewDecodeParamError(err.Error())
 	}
 
-	trans := new(types.Transaction)
-	trans.Amount = new(big.Int)
-	trans.GasLimit = new(big.Int)
-	trans.Price = new(big.Int)
+	var (
+		nonce            uint64
+		to               common.Address
+		amount           = new(big.Int).Set(common.Big0)
+		gasLimit         = new(big.Int).Set(common.Big0)
+		gasPrice         = new(big.Int).Set(common.Big0)
+		data             []byte
+		contractCreation = true
+	)
 
 	if val, found := fields["To"]; found {
 		if strVal, ok := val.(string); ok && len(strVal) > 0 {
 			tx.To = strVal
-			to := common.StringToAddress(strVal)
-			trans.Recipient = &to
+			to = common.HexToAddress(strVal)
+			contractCreation = false
 		}
 	}
 
@@ -927,7 +932,7 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) {
 	if val, found := fields["Nonce"]; found {
 		if strVal, ok := val.(string); ok {
 			tx.Nonce = strVal
-			if trans.AccountNonce, err = strconv.ParseUint(strVal, 10, 64); err != nil {
+			if nonce, err = strconv.ParseUint(strVal, 10, 64); err != nil {
 				return shared.NewDecodeParamError(fmt.Sprintf("Unable to decode tx.Nonce - %v", err))
 			}
 		}
@@ -939,7 +944,7 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) {
 	if val, found := fields["Value"]; found {
 		if strVal, ok := val.(string); ok {
 			tx.Value = strVal
-			if _, parseOk = trans.Amount.SetString(strVal, 0); !parseOk {
+			if _, parseOk = amount.SetString(strVal, 0); !parseOk {
 				return shared.NewDecodeParamError(fmt.Sprintf("Unable to decode tx.Amount - %v", err))
 			}
 		}
@@ -949,9 +954,9 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) {
 		if strVal, ok := val.(string); ok {
 			tx.Data = strVal
 			if strings.HasPrefix(strVal, "0x") {
-				trans.Payload = common.Hex2Bytes(strVal[2:])
+				data = common.Hex2Bytes(strVal[2:])
 			} else {
-				trans.Payload = common.Hex2Bytes(strVal)
+				data = common.Hex2Bytes(strVal)
 			}
 		}
 	}
@@ -959,7 +964,7 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) {
 	if val, found := fields["GasLimit"]; found {
 		if strVal, ok := val.(string); ok {
 			tx.GasLimit = strVal
-			if _, parseOk = trans.GasLimit.SetString(strVal, 0); !parseOk {
+			if _, parseOk = gasLimit.SetString(strVal, 0); !parseOk {
 				return shared.NewDecodeParamError(fmt.Sprintf("Unable to decode tx.GasLimit - %v", err))
 			}
 		}
@@ -968,13 +973,17 @@ func (tx *tx) UnmarshalJSON(b []byte) (err error) {
 	if val, found := fields["GasPrice"]; found {
 		if strVal, ok := val.(string); ok {
 			tx.GasPrice = strVal
-			if _, parseOk = trans.Price.SetString(strVal, 0); !parseOk {
+			if _, parseOk = gasPrice.SetString(strVal, 0); !parseOk {
 				return shared.NewDecodeParamError(fmt.Sprintf("Unable to decode tx.GasPrice - %v", err))
 			}
 		}
 	}
 
-	tx.tx = trans
+	if contractCreation {
+		tx.tx = types.NewContractCreation(nonce, amount, gasLimit, gasPrice, data)
+	} else {
+		tx.tx = types.NewTransaction(nonce, to, amount, gasLimit, gasPrice, data)
+	}
 
 	return nil
 }