mirror of https://github.com/status-im/op-geth.git
Changed how txs define their data & added init field
This commit is contained in:
parent
e09f0a5f2c
commit
720521ed4a
|
@ -14,7 +14,8 @@ type Transaction struct {
|
|||
Value *big.Int
|
||||
Gas *big.Int
|
||||
Gasprice *big.Int
|
||||
Data []string
|
||||
Data []byte
|
||||
Init []byte
|
||||
v byte
|
||||
r, s []byte
|
||||
|
||||
|
@ -22,11 +23,11 @@ type Transaction struct {
|
|||
contractCreation bool
|
||||
}
|
||||
|
||||
func NewContractCreationTx(value, gasprice *big.Int, data []string) *Transaction {
|
||||
func NewContractCreationTx(value, gasprice *big.Int, data []byte) *Transaction {
|
||||
return &Transaction{Value: value, Gasprice: gasprice, Data: data, contractCreation: true}
|
||||
}
|
||||
|
||||
func NewTransactionMessage(to []byte, value, gasprice, gas *big.Int, data []string) *Transaction {
|
||||
func NewTransactionMessage(to []byte, value, gasprice, gas *big.Int, data []byte) *Transaction {
|
||||
return &Transaction{Recipient: to, Value: value, Gasprice: gasprice, Gas: gas, Data: data}
|
||||
}
|
||||
|
||||
|
@ -45,19 +46,12 @@ func NewTransactionFromValue(val *ethutil.Value) *Transaction {
|
|||
}
|
||||
|
||||
func (tx *Transaction) Hash() []byte {
|
||||
data := make([]interface{}, len(tx.Data))
|
||||
for i, val := range tx.Data {
|
||||
data[i] = val
|
||||
data := []interface{}{tx.Nonce, tx.Value, tx.Gasprice, tx.Gas, tx.Recipient, string(tx.Data)}
|
||||
if tx.contractCreation {
|
||||
data = append(data, string(tx.Init))
|
||||
}
|
||||
|
||||
preEnc := []interface{}{
|
||||
tx.Nonce,
|
||||
tx.Recipient,
|
||||
tx.Value,
|
||||
data,
|
||||
}
|
||||
|
||||
return ethutil.Sha3Bin(ethutil.Encode(preEnc))
|
||||
return ethutil.Sha3Bin(ethutil.NewValue(data).Encode())
|
||||
}
|
||||
|
||||
func (tx *Transaction) IsContract() bool {
|
||||
|
@ -110,15 +104,17 @@ func (tx *Transaction) Sign(privk []byte) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// [ NONCE, VALUE, GASPRICE, GAS, TO, DATA, V, R, S ]
|
||||
// [ NONCE, VALUE, GASPRICE, GAS, 0, CODE, INIT, V, R, S ]
|
||||
func (tx *Transaction) RlpData() interface{} {
|
||||
data := []interface{}{tx.Nonce, tx.Value, tx.Gasprice}
|
||||
data := []interface{}{tx.Nonce, tx.Value, tx.Gasprice, tx.Gas, tx.Recipient, tx.Data}
|
||||
|
||||
if !tx.contractCreation {
|
||||
data = append(data, tx.Recipient, tx.Gas)
|
||||
if tx.contractCreation {
|
||||
data = append(data, tx.Init)
|
||||
}
|
||||
d := ethutil.NewSliceValue(tx.Data).Slice()
|
||||
//d := ethutil.NewSliceValue(tx.Data).Slice()
|
||||
|
||||
return append(data, d, tx.v, tx.r, tx.s)
|
||||
return append(data, tx.v, tx.r, tx.s)
|
||||
}
|
||||
|
||||
func (tx *Transaction) RlpValue() *ethutil.Value {
|
||||
|
@ -137,31 +133,19 @@ func (tx *Transaction) RlpValueDecode(decoder *ethutil.Value) {
|
|||
tx.Nonce = decoder.Get(0).Uint()
|
||||
tx.Value = decoder.Get(1).BigInt()
|
||||
tx.Gasprice = decoder.Get(2).BigInt()
|
||||
tx.Gas = decoder.Get(3).BigInt()
|
||||
tx.Recipient = decoder.Get(4).Bytes()
|
||||
tx.Data = decoder.Get(5).Bytes()
|
||||
|
||||
// If the 4th item is a list(slice) this tx
|
||||
// is a contract creation tx
|
||||
if decoder.Get(3).IsList() {
|
||||
d := decoder.Get(3)
|
||||
tx.Data = make([]string, d.Len())
|
||||
for i := 0; i < d.Len(); i++ {
|
||||
tx.Data[i] = d.Get(i).Str()
|
||||
}
|
||||
|
||||
tx.v = byte(decoder.Get(4).Uint())
|
||||
tx.r = decoder.Get(5).Bytes()
|
||||
tx.s = decoder.Get(6).Bytes()
|
||||
|
||||
// If the list is of length 10 it's a contract creation tx
|
||||
if decoder.Len() == 10 {
|
||||
tx.contractCreation = true
|
||||
tx.Init = decoder.Get(6).Bytes()
|
||||
|
||||
tx.v = byte(decoder.Get(7).Uint())
|
||||
tx.r = decoder.Get(8).Bytes()
|
||||
tx.s = decoder.Get(9).Bytes()
|
||||
} else {
|
||||
tx.Recipient = decoder.Get(3).Bytes()
|
||||
tx.Gas = decoder.Get(4).BigInt()
|
||||
|
||||
d := decoder.Get(5)
|
||||
tx.Data = make([]string, d.Len())
|
||||
for i := 0; i < d.Len(); i++ {
|
||||
tx.Data[i] = d.Get(i).Str()
|
||||
}
|
||||
|
||||
tx.v = byte(decoder.Get(6).Uint())
|
||||
tx.r = decoder.Get(7).Bytes()
|
||||
tx.s = decoder.Get(8).Bytes()
|
||||
|
|
|
@ -1,54 +1 @@
|
|||
package ethchain
|
||||
|
||||
import (
|
||||
"encoding/hex"
|
||||
"math/big"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestAddressRetrieval(t *testing.T) {
|
||||
// TODO
|
||||
// 88f9b82462f6c4bf4a0fb15e5c3971559a316e7f
|
||||
key, _ := hex.DecodeString("3ecb44df2159c26e0f995712d4f39b6f6e499b40749b1cf1246c37f9516cb6a4")
|
||||
|
||||
tx := &Transaction{
|
||||
Nonce: 0,
|
||||
Recipient: ZeroHash160,
|
||||
Value: big.NewInt(0),
|
||||
Data: nil,
|
||||
}
|
||||
//fmt.Printf("rlp %x\n", tx.RlpEncode())
|
||||
//fmt.Printf("sha rlp %x\n", tx.Hash())
|
||||
|
||||
tx.Sign(key)
|
||||
|
||||
//fmt.Printf("hex tx key %x\n", tx.PublicKey())
|
||||
//fmt.Printf("seder %x\n", tx.Sender())
|
||||
}
|
||||
|
||||
func TestAddressRetrieval2(t *testing.T) {
|
||||
// TODO
|
||||
// 88f9b82462f6c4bf4a0fb15e5c3971559a316e7f
|
||||
key, _ := hex.DecodeString("3ecb44df2159c26e0f995712d4f39b6f6e499b40749b1cf1246c37f9516cb6a4")
|
||||
addr, _ := hex.DecodeString("944400f4b88ac9589a0f17ed4671da26bddb668b")
|
||||
tx := &Transaction{
|
||||
Nonce: 0,
|
||||
Recipient: addr,
|
||||
Value: big.NewInt(1000),
|
||||
Data: nil,
|
||||
}
|
||||
tx.Sign(key)
|
||||
//data, _ := hex.DecodeString("f85d8094944400f4b88ac9589a0f17ed4671da26bddb668b8203e8c01ca0363b2a410de00bc89be40f468d16e70e543b72191fbd8a684a7c5bef51dc451fa02d8ecf40b68f9c64ed623f6ee24c9c878943b812e1e76bd73ccb2bfef65579e7")
|
||||
//tx := NewTransactionFromData(data)
|
||||
/*
|
||||
fmt.Println(tx.RlpValue())
|
||||
|
||||
fmt.Printf("rlp %x\n", tx.RlpEncode())
|
||||
fmt.Printf("sha rlp %x\n", tx.Hash())
|
||||
|
||||
//tx.Sign(key)
|
||||
|
||||
fmt.Printf("hex tx key %x\n", tx.PublicKey())
|
||||
fmt.Printf("seder %x\n", tx.Sender())
|
||||
*/
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue