aboutsummaryrefslogtreecommitdiffstats
path: root/ethchain
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2014-04-10 00:28:16 +0800
committerobscuren <geffobscura@gmail.com>2014-04-10 00:28:16 +0800
commit720521ed4a28c8a1b74bedd03e82bf4f887c9cb5 (patch)
tree1a1c9938bc75870ca564aa1ca2f70d95033941d0 /ethchain
parente09f0a5f2c1e1b46226656dbac9a4ae10e0dcd14 (diff)
downloadgo-tangerine-720521ed4a28c8a1b74bedd03e82bf4f887c9cb5.tar
go-tangerine-720521ed4a28c8a1b74bedd03e82bf4f887c9cb5.tar.gz
go-tangerine-720521ed4a28c8a1b74bedd03e82bf4f887c9cb5.tar.bz2
go-tangerine-720521ed4a28c8a1b74bedd03e82bf4f887c9cb5.tar.lz
go-tangerine-720521ed4a28c8a1b74bedd03e82bf4f887c9cb5.tar.xz
go-tangerine-720521ed4a28c8a1b74bedd03e82bf4f887c9cb5.tar.zst
go-tangerine-720521ed4a28c8a1b74bedd03e82bf4f887c9cb5.zip
Changed how txs define their data & added init field
Diffstat (limited to 'ethchain')
-rw-r--r--ethchain/transaction.go66
-rw-r--r--ethchain/transaction_test.go53
2 files changed, 25 insertions, 94 deletions
diff --git a/ethchain/transaction.go b/ethchain/transaction.go
index 506e3c159..b359c9151 100644
--- a/ethchain/transaction.go
+++ b/ethchain/transaction.go
@@ -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
- } 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.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.v = byte(decoder.Get(6).Uint())
tx.r = decoder.Get(7).Bytes()
tx.s = decoder.Get(8).Bytes()
diff --git a/ethchain/transaction_test.go b/ethchain/transaction_test.go
index a49768aea..3603fd8a7 100644
--- a/ethchain/transaction_test.go
+++ b/ethchain/transaction_test.go
@@ -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())
- */
-}