From 700a018a2a09797c1d1ac59d50352630d0f3d6b2 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Wed, 15 Jul 2020 17:37:17 +0800 Subject: [PATCH 1/9] fix: correct field name --- core/types.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/types.go b/core/types.go index 251e1ea..696a933 100644 --- a/core/types.go +++ b/core/types.go @@ -141,7 +141,7 @@ type Transition struct { type TransactionMessage struct { Amount string `json:"_amount"` - Receipt string `json:"_receipt"` + Recipient string `json:"_recipient"` Tag string `json:"_tag"` Params []ContractValue `json:"params"` } From aa8b2a16211401264aba86ffe96386a7bc8287f4 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 17:04:34 +0800 Subject: [PATCH 2/9] feat: compute transaction hash locally --- account/wallet_test.go | 3 +++ transaction/transaction.go | 9 +++++++++ 2 files changed, 12 insertions(+) diff --git a/account/wallet_test.go b/account/wallet_test.go index 4f11284..9844556 100644 --- a/account/wallet_test.go +++ b/account/wallet_test.go @@ -73,6 +73,9 @@ func TestSendTransaction(t *testing.T) { err2 := wallet.Sign(tx, *provider) assert.Nil(t, err2, err2) + h,_ := tx.Hash() + fmt.Println("local transaction hash: ",util.EncodeHex(h)) + rsp, err3 := provider.CreateTransaction(tx.ToTransactionPayload()) assert.Nil(t, err3, err3) assert.Nil(t, rsp.Error, rsp.Error) diff --git a/transaction/transaction.go b/transaction/transaction.go index e8050c4..9eeb9ea 100644 --- a/transaction/transaction.go +++ b/transaction/transaction.go @@ -129,6 +129,15 @@ func (t *Transaction) Bytes() ([]byte, error) { } } +func (t *Transaction) Hash() ([]byte,error){ + bytes,err := t.Bytes() + if err != nil { + return nil, err + } + hash := util.Sha256(bytes) + return hash,nil +} + func (t *Transaction) isPending() bool { return t.Status == core.Pending } From 2bb7ed879072d0a0cde20ba730b543a893064ef6 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 17:37:51 +0800 Subject: [PATCH 3/9] fix: payload json --- provider/transaction_payload.go | 18 ++++---- provider/transaction_payload_test.go | 67 +++------------------------- 2 files changed, 14 insertions(+), 71 deletions(-) diff --git a/provider/transaction_payload.go b/provider/transaction_payload.go index 530f01f..d820bdb 100644 --- a/provider/transaction_payload.go +++ b/provider/transaction_payload.go @@ -55,7 +55,7 @@ type payload struct { Nonce int `json:"nonce"` ToAddr string `json:"toAddr"` Amount int64 `json:"amount"` - //PubKey string `json:"pubKey"` + PubKey string `json:"pubKey"` GasPrice int64 `json:"gasPrice"` GasLimit int64 `json:"gasLimit"` Code string `json:"code"` @@ -69,7 +69,7 @@ type Init struct { Nonce int `json:"nonce"` ToAddr string `json:"toAddr"` Amount int64 `json:"amount"` - //PubKey string `json:"pubKey"` + PubKey string `json:"pubKey"` GasPrice int64 `json:"gasPrice"` GasLimit int64 `json:"gasLimit"` Code string `json:"code"` @@ -110,7 +110,7 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) { Nonce: pl.Nonce, ToAddr: pl.ToAddr, Amount: a, - //PubKey: pl.PubKey, + PubKey: pl.PubKey, GasPrice: price, GasLimit: limit, Code: pl.Code, @@ -126,7 +126,7 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) { Nonce: pl.Nonce, ToAddr: pl.ToAddr, Amount: a, - //PubKey: pl.PubKey, + PubKey: pl.PubKey, GasPrice: price, GasLimit: limit, Code: pl.Code, @@ -193,10 +193,10 @@ func NewFromMap(middle map[string]interface{}) (*TransactionPayload, error) { return nil, errors.New("parse payload json failed: limit") } - //pubkey, ok6 := middle["pubKey"].(string) - //if !ok6 { - // return nil, errors.New("parse payload json failed: public key") - //} + pubkey, ok6 := middle["pubKey"].(string) + if !ok6 { + return nil, errors.New("parse payload json failed: public key") + } code, ok7 := middle["code"].(string) if !ok7 { @@ -241,7 +241,7 @@ func NewFromMap(middle map[string]interface{}) (*TransactionPayload, error) { Nonce: int(n), ToAddr: toAddr.(string), Amount: fmt.Sprintf("%.0f", amount), - //PubKey: pubkey, + PubKey: pubkey, GasPrice: fmt.Sprintf("%.0f", price), GasLimit: fmt.Sprintf("%.0f", limit), Code: code, diff --git a/provider/transaction_payload_test.go b/provider/transaction_payload_test.go index 08bafe7..72e4041 100644 --- a/provider/transaction_payload_test.go +++ b/provider/transaction_payload_test.go @@ -2,71 +2,15 @@ package provider import ( "fmt" + "os" "testing" ) func TestNewFromJson(t *testing.T) { - data := []byte(`{ - "version": 65537, - "nonce": 1, - "toAddr": "0x0000000000000000000000000000000000000000", - "amount": 0, - "gasPrice": 10000000, - "gasLimit": 9000, - "code": "", - "data": [ - { - "vname": "_scilla_version", - "type": "Uint32", - "value": "0" - }, - { - "vname": "initial_owners", - "type": "List ByStr20", - "value": { - "constructor": "Cons", - "argtypes": [ - "ByStr20" - ], - "arguments": [ - "0x1234567890123456789012345678906784567890", - { - "constructor": "Cons", - "argtypes": [ - "ByStr20" - ], - "arguments": [ - "0xabcdeabcde123456786782345678901234567890", - { - "constructor": "Cons", - "argtypes": [ - "ByStr20" - ], - "arguments": [ - "0xffcdeabcde126786789012345678901234567890", - { - "constructor": "Nil", - "argtypes": [ - "ByStr20" - ], - "arguments": [] - } - ] - } - ] - } - ] - } - }, - { - "vname": "required_signatures", - "type": "Uint32", - "value": "2" - } - ], - "signature": "", - "pubKey": "" -}`) + if os.Getenv("CI") != "" { + t.Skip("Skipping testing in CI environment") + } + data := []byte(`{"version":21823489,"nonce":166471,"toAddr":"bd7198209529dC42320db4bC8508880BcD22a9f2","amount":0,"pubKey":"0246e7178dc8253201101e18fd6f6eb9972451d121fc57aa2a06dd5c111e58dc6a","gasPrice":1000000000,"gasLimit":1000,"code":"","data":{"_tag":"Transfer","params":[{"vname":"to","type":"ByStr20","value":"0x9bfec715a6bd658fcb62b0f8cc9bfa2ade71434a"},{"vname":"tokens","type":"Uint128","value":"10"}]},"signature":"e4ae77ba4534598a723a3792705dd7477ffef8a475da94388d1af0cd29b38a3737b64fbedc4eb72c66b28303ac1b0bb8c45a68da2d40d6def367cbf20e751747"}`) payload, err2 := NewFromJson(data) if err2 != nil { @@ -75,7 +19,6 @@ func TestNewFromJson(t *testing.T) { fmt.Println(payload) - data = []byte(`{"version":21823489,"nonce":959,"toAddr":"84eb5C96Bec8d29eDdFBe36865E9B7F26b816f0F","amount":0,"pubKey":"0246e7178dc8253201101e18fd6f6eb9972451d121fc57aa2a06dd5c111e58dc6a","gasPrice":1000000000,"gasLimit":10000,"code":"","data":{"_tag":"SubmitCustomMintTransaction","params":[{"vname":"proxyTokenContract","type":"ByStr20","value":"0x39550ab45d74cce5fef70e857c1326b2d9bee096"},{"vname":"to","type":"ByStr20","value":"0x39550ab45d74cce5fef70e857c1326b2d9bee096"},{"vname":"value","type":"Uint128","value":"10000000"}]},"signature":"c0dcffb4f5ef80b9e426c16fc1fb62b31356219deb84c5689ab6a73915ea962c0bc4d4a49985803cd1db8aabb6870e8c749003cab41246e17493767acc6cca90"}`) payload2, err3 := NewFromJson(data) if err3 != nil { t.Error(err3.Error()) From 6fd5e31386753a7e16e2c8a23ea8c3c25df24bc3 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 17:43:17 +0800 Subject: [PATCH 4/9] fix: unit test --- provider/transaction_payload_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/transaction_payload_test.go b/provider/transaction_payload_test.go index 72e4041..445a246 100644 --- a/provider/transaction_payload_test.go +++ b/provider/transaction_payload_test.go @@ -55,7 +55,7 @@ func TestTransactionPayload_ToJson(t *testing.T) { } fmt.Println(string(data)) - expect := "{\"version\":65537,\"nonce\":1,\"toAddr\":\"0x0000000000000000000000000000000000000000\",\"amount\":0,\"gasPrice\":10000000,\"gasLimit\":9000,\"code\":\"\",\"data\":[{\"vname\":\"_scilla_version\",\"type\":\"Uint32\",\"value\":\"0\"},{\"vname\":\"initial_owners\",\"type\":\"List ByStr20\",\"value\":{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0x1234567890123456789012345678906784567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xabcdeabcde123456786782345678901234567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xffcdeabcde126786789012345678901234567890\",{\"constructor\":\"Nil\",\"argtypes\":[\"ByStr20\"],\"arguments\":[]}]}]}]}},{\"vname\":\"required_signatures\",\"type\":\"Uint32\",\"value\":\"2\"}],\"signature\":\"\"}" + expect := "{\"version\":65537,\"nonce\":1,\"toAddr\":\"0x0000000000000000000000000000000000000000\",\"amount\":0,\"pubKey\":\"\",\"gasPrice\":10000000,\"gasLimit\":9000,\"code\":\"\",\"data\":[{\"vname\":\"_scilla_version\",\"type\":\"Uint32\",\"value\":\"0\"},{\"vname\":\"initial_owners\",\"type\":\"List ByStr20\",\"value\":{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0x1234567890123456789012345678906784567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xabcdeabcde123456786782345678901234567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xffcdeabcde126786789012345678901234567890\",{\"constructor\":\"Nil\",\"argtypes\":[\"ByStr20\"],\"arguments\":[]}]}]}]}},{\"vname\":\"required_signatures\",\"type\":\"Uint32\",\"value\":\"2\"}],\"signature\":\"\"}" if len(string(data)) != len(expect) { t.Fail() } From eb75996e81b7ff431f0ba1f1e2f6b5bcf178886a Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 20:03:09 +0800 Subject: [PATCH 5/9] fix(payload): add payment type --- account/wallet_test.go | 33 +++++++++++++++++++++++++++- provider/transaction_payload.go | 31 ++++++++++++++++++++++++++ provider/transaction_payload_test.go | 2 +- 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/account/wallet_test.go b/account/wallet_test.go index 9844556..1f1c45a 100644 --- a/account/wallet_test.go +++ b/account/wallet_test.go @@ -29,6 +29,38 @@ import ( "testing" ) +func TestPayload(t *testing.T) { + if os.Getenv("CI") != "" { + t.Skip("Skipping testing in CI environment") + } + wallet := NewWallet() + wallet.AddByPrivateKey("e19d05c5452598e24caad4a0d85a49146f7be089515c905ae6a19e8a578a6930") + provider := provider2.NewProvider("https://dev-api.zilliqa.com/") + + gasPrice, err := provider.GetMinimumGasPrice() + assert.Nil(t, err, err) + + tx := &transaction.Transaction{ + Version: strconv.FormatInt(int64(util.Pack(333, 1)), 10), + SenderPubKey: "0246E7178DC8253201101E18FD6F6EB9972451D121FC57AA2A06DD5C111E58DC6A", + ToAddr: "4BAF5faDA8e5Db92C3d3242618c5B47133AE003C", + Amount: "10000000", + GasPrice: gasPrice, + GasLimit: "1", + Code: "", + Data: "", + Priority: false, + } + err2 := wallet.Sign(tx, *provider) + assert.Nil(t, err2, err2) + + pl := tx.ToTransactionPayload() + payloadJson,err3 := pl.ToJson() + assert.Nil(t, err3, err3) + fmt.Println(string(payloadJson)) +} + + func TestWallet_SignWith(t *testing.T) { if os.Getenv("CI") != "" { t.Skip("Skipping testing in CI environment") @@ -69,7 +101,6 @@ func TestSendTransaction(t *testing.T) { Data: "", Priority: false, } - err2 := wallet.Sign(tx, *provider) assert.Nil(t, err2, err2) diff --git a/provider/transaction_payload.go b/provider/transaction_payload.go index d820bdb..d65f449 100644 --- a/provider/transaction_payload.go +++ b/provider/transaction_payload.go @@ -77,6 +77,19 @@ type Init struct { Signature string `json:"signature"` } +type Payment struct { + Version int `json:"version"` + Nonce int `json:"nonce"` + ToAddr string `json:"toAddr"` + Amount int64 `json:"amount"` + PubKey string `json:"pubKey"` + GasPrice int64 `json:"gasPrice"` + GasLimit int64 `json:"gasLimit"` + Code string `json:"code"` + Data string `json:"data"` + Signature string `json:"signature"` +} + func (pl *TransactionPayload) ToJson() ([]byte, error) { a, err := strconv.ParseInt(pl.Amount, 10, 64) if err != nil { @@ -93,6 +106,24 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) { return nil, err3 } + if pl.Data == "" { + p := Payment{ + Version: pl.Version, + Nonce: pl.Nonce, + ToAddr: pl.ToAddr, + Amount: a, + PubKey: pl.PubKey, + GasPrice: price, + GasLimit: limit, + Code: pl.Code, + Data: "", + Signature: pl.Signature, + //Priority: pl.Priority, + } + return json.Marshal(&p) + } + + originData := strings.TrimPrefix(pl.Data, `"`) originData = strings.TrimSuffix(originData, `"`) originData = strings.ReplaceAll(originData, "\\", "") diff --git a/provider/transaction_payload_test.go b/provider/transaction_payload_test.go index 445a246..fa28257 100644 --- a/provider/transaction_payload_test.go +++ b/provider/transaction_payload_test.go @@ -44,7 +44,7 @@ func TestTransactionPayload_ToJson(t *testing.T) { GasPrice: "10000000", GasLimit: "9000", Code: "", - Data: "[{\"vname\":\"_scilla_version\",\"type\":\"Uint32\",\"value\":\"0\"},{\"vname\":\"initial_owners\",\"type\":\"List ByStr20\",\"value\":{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0x1234567890123456789012345678906784567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xabcdeabcde123456786782345678901234567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xffcdeabcde126786789012345678901234567890\",{\"constructor\":\"Nil\",\"argtypes\":[\"ByStr20\"],\"arguments\":[]}]}]}]}},{\"vname\":\"required_signatures\",\"type\":\"Uint32\",\"value\":\"2\"}]", + Data: "", Signature: "", //Priority: false, } From a194f5f756beca984048ae63bec1cd634b45f366 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 20:09:59 +0800 Subject: [PATCH 6/9] fix: unit test --- provider/transaction_payload_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/provider/transaction_payload_test.go b/provider/transaction_payload_test.go index fa28257..2194d0b 100644 --- a/provider/transaction_payload_test.go +++ b/provider/transaction_payload_test.go @@ -55,7 +55,7 @@ func TestTransactionPayload_ToJson(t *testing.T) { } fmt.Println(string(data)) - expect := "{\"version\":65537,\"nonce\":1,\"toAddr\":\"0x0000000000000000000000000000000000000000\",\"amount\":0,\"pubKey\":\"\",\"gasPrice\":10000000,\"gasLimit\":9000,\"code\":\"\",\"data\":[{\"vname\":\"_scilla_version\",\"type\":\"Uint32\",\"value\":\"0\"},{\"vname\":\"initial_owners\",\"type\":\"List ByStr20\",\"value\":{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0x1234567890123456789012345678906784567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xabcdeabcde123456786782345678901234567890\",{\"constructor\":\"Cons\",\"argtypes\":[\"ByStr20\"],\"arguments\":[\"0xffcdeabcde126786789012345678901234567890\",{\"constructor\":\"Nil\",\"argtypes\":[\"ByStr20\"],\"arguments\":[]}]}]}]}},{\"vname\":\"required_signatures\",\"type\":\"Uint32\",\"value\":\"2\"}],\"signature\":\"\"}" + expect := "{\"version\":65537,\"nonce\":1,\"toAddr\":\"0x0000000000000000000000000000000000000000\",\"amount\":0,\"pubKey\":\"\",\"gasPrice\":10000000,\"gasLimit\":9000,\"code\":\"\",\"data\":\"\",\"signature\":\"\"}" if len(string(data)) != len(expect) { t.Fail() } From 28c777cfef39416bea861c05f1d0bb245afa0a90 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 20:16:46 +0800 Subject: [PATCH 7/9] fix(payload): add payment type for NewFromJson --- account/wallet_test.go | 7 ++-- core/types.go | 6 +-- provider/transaction_payload.go | 73 +++++++++++++++++---------------- transaction/transaction.go | 6 +-- transaction/transaction_test.go | 20 +++++++++ 5 files changed, 66 insertions(+), 46 deletions(-) diff --git a/account/wallet_test.go b/account/wallet_test.go index 1f1c45a..4eb40a8 100644 --- a/account/wallet_test.go +++ b/account/wallet_test.go @@ -55,12 +55,11 @@ func TestPayload(t *testing.T) { assert.Nil(t, err2, err2) pl := tx.ToTransactionPayload() - payloadJson,err3 := pl.ToJson() + payloadJson, err3 := pl.ToJson() assert.Nil(t, err3, err3) fmt.Println(string(payloadJson)) } - func TestWallet_SignWith(t *testing.T) { if os.Getenv("CI") != "" { t.Skip("Skipping testing in CI environment") @@ -104,8 +103,8 @@ func TestSendTransaction(t *testing.T) { err2 := wallet.Sign(tx, *provider) assert.Nil(t, err2, err2) - h,_ := tx.Hash() - fmt.Println("local transaction hash: ",util.EncodeHex(h)) + h, _ := tx.Hash() + fmt.Println("local transaction hash: ", util.EncodeHex(h)) rsp, err3 := provider.CreateTransaction(tx.ToTransactionPayload()) assert.Nil(t, err3, err3) diff --git a/core/types.go b/core/types.go index 696a933..d46692e 100644 --- a/core/types.go +++ b/core/types.go @@ -140,10 +140,10 @@ type Transition struct { } type TransactionMessage struct { - Amount string `json:"_amount"` + Amount string `json:"_amount"` Recipient string `json:"_recipient"` - Tag string `json:"_tag"` - Params []ContractValue `json:"params"` + Tag string `json:"_tag"` + Params []ContractValue `json:"params"` } type Transactions struct { diff --git a/provider/transaction_payload.go b/provider/transaction_payload.go index d65f449..5e9f7b5 100644 --- a/provider/transaction_payload.go +++ b/provider/transaction_payload.go @@ -51,10 +51,10 @@ type Data struct { } type payload struct { - Version int `json:"version"` - Nonce int `json:"nonce"` - ToAddr string `json:"toAddr"` - Amount int64 `json:"amount"` + Version int `json:"version"` + Nonce int `json:"nonce"` + ToAddr string `json:"toAddr"` + Amount int64 `json:"amount"` PubKey string `json:"pubKey"` GasPrice int64 `json:"gasPrice"` GasLimit int64 `json:"gasLimit"` @@ -65,10 +65,10 @@ type payload struct { } type Init struct { - Version int `json:"version"` - Nonce int `json:"nonce"` - ToAddr string `json:"toAddr"` - Amount int64 `json:"amount"` + Version int `json:"version"` + Nonce int `json:"nonce"` + ToAddr string `json:"toAddr"` + Amount int64 `json:"amount"` PubKey string `json:"pubKey"` GasPrice int64 `json:"gasPrice"` GasLimit int64 `json:"gasLimit"` @@ -78,16 +78,16 @@ type Init struct { } type Payment struct { - Version int `json:"version"` - Nonce int `json:"nonce"` - ToAddr string `json:"toAddr"` - Amount int64 `json:"amount"` - PubKey string `json:"pubKey"` - GasPrice int64 `json:"gasPrice"` - GasLimit int64 `json:"gasLimit"` - Code string `json:"code"` - Data string `json:"data"` - Signature string `json:"signature"` + Version int `json:"version"` + Nonce int `json:"nonce"` + ToAddr string `json:"toAddr"` + Amount int64 `json:"amount"` + PubKey string `json:"pubKey"` + GasPrice int64 `json:"gasPrice"` + GasLimit int64 `json:"gasLimit"` + Code string `json:"code"` + Data string `json:"data"` + Signature string `json:"signature"` } func (pl *TransactionPayload) ToJson() ([]byte, error) { @@ -108,22 +108,21 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) { if pl.Data == "" { p := Payment{ - Version: pl.Version, - Nonce: pl.Nonce, - ToAddr: pl.ToAddr, - Amount: a, + Version: pl.Version, + Nonce: pl.Nonce, + ToAddr: pl.ToAddr, + Amount: a, PubKey: pl.PubKey, GasPrice: price, GasLimit: limit, Code: pl.Code, - Data: "", + Data: "", Signature: pl.Signature, //Priority: pl.Priority, } return json.Marshal(&p) } - originData := strings.TrimPrefix(pl.Data, `"`) originData = strings.TrimSuffix(originData, `"`) originData = strings.ReplaceAll(originData, "\\", "") @@ -137,10 +136,10 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) { return nil, errors.New("wrong data") } else { p := Init{ - Version: pl.Version, - Nonce: pl.Nonce, - ToAddr: pl.ToAddr, - Amount: a, + Version: pl.Version, + Nonce: pl.Nonce, + ToAddr: pl.ToAddr, + Amount: a, PubKey: pl.PubKey, GasPrice: price, GasLimit: limit, @@ -153,10 +152,10 @@ func (pl *TransactionPayload) ToJson() ([]byte, error) { } } else { p := payload{ - Version: pl.Version, - Nonce: pl.Nonce, - ToAddr: pl.ToAddr, - Amount: a, + Version: pl.Version, + Nonce: pl.Nonce, + ToAddr: pl.ToAddr, + Amount: a, PubKey: pl.PubKey, GasPrice: price, GasLimit: limit, @@ -248,6 +247,8 @@ func NewFromMap(middle map[string]interface{}) (*TransactionPayload, error) { return nil, err } sd = string(s) + } else if reflect.TypeOf(d).Kind() == reflect.String { + sd = d.(string) } else { j, _ := json.Marshal(d) var data Data @@ -268,10 +269,10 @@ func NewFromMap(middle map[string]interface{}) (*TransactionPayload, error) { } return &TransactionPayload{ - Version: int(v), - Nonce: int(n), - ToAddr: toAddr.(string), - Amount: fmt.Sprintf("%.0f", amount), + Version: int(v), + Nonce: int(n), + ToAddr: toAddr.(string), + Amount: fmt.Sprintf("%.0f", amount), PubKey: pubkey, GasPrice: fmt.Sprintf("%.0f", price), GasLimit: fmt.Sprintf("%.0f", limit), diff --git a/transaction/transaction.go b/transaction/transaction.go index 9eeb9ea..4986112 100644 --- a/transaction/transaction.go +++ b/transaction/transaction.go @@ -129,13 +129,13 @@ func (t *Transaction) Bytes() ([]byte, error) { } } -func (t *Transaction) Hash() ([]byte,error){ - bytes,err := t.Bytes() +func (t *Transaction) Hash() ([]byte, error) { + bytes, err := t.Bytes() if err != nil { return nil, err } hash := util.Sha256(bytes) - return hash,nil + return hash, nil } func (t *Transaction) isPending() bool { diff --git a/transaction/transaction_test.go b/transaction/transaction_test.go index 5ea5233..e0c3951 100644 --- a/transaction/transaction_test.go +++ b/transaction/transaction_test.go @@ -143,3 +143,23 @@ func TestNewFromPayload2(t *testing.T) { assert.Nil(t, err, err) t.Log(string(data)) } + +func TestNewFromPayload3(t *testing.T) { + data := []byte(`{ + "version": 65537, + "nonce": 1, + "toAddr": "0x0000000000000000000000000000000000000000", + "amount": 0, + "gasPrice": 10000000, + "gasLimit": 9000, + "code": "", + "data":"", + "signature": "", + "pubKey": "" +}`) + + payload, err2 := provider.NewFromJson(data) + assert.Nil(t, err2, err2) + tx := NewFromPayload(payload) + t.Log(tx) +} From 6fbfdb813bcc0d533e7ca9bd58c339cbe79ffc16 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 21:02:23 +0800 Subject: [PATCH 8/9] fix: toAddr --- transaction/transaction.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transaction/transaction.go b/transaction/transaction.go index 4986112..970c92f 100644 --- a/transaction/transaction.go +++ b/transaction/transaction.go @@ -26,7 +26,7 @@ func NewFromPayload(payload *provider.TransactionPayload) *Transaction { Signature: payload.Signature, Receipt: core.TransactionReceipt{}, SenderPubKey: payload.PubKey, - ToAddr: payload.ToAddr, + ToAddr: "0x"+payload.ToAddr, Code: payload.Code, Data: payload.Data, Status: 0, From 568e389c78431c91bd929d7cf76bae2305bd8f42 Mon Sep 17 00:00:00 2001 From: xiaohuo Date: Fri, 17 Jul 2020 21:34:38 +0800 Subject: [PATCH 9/9] fix(payload): support deployment --- contract/contract.go | 1 - contract/contract_test.go | 1 - transaction/transaction.go | 84 ++++++++++++++++++++++++++++++-------- 3 files changed, 68 insertions(+), 18 deletions(-) diff --git a/contract/contract.go b/contract/contract.go index 899db7c..1b330fb 100644 --- a/contract/contract.go +++ b/contract/contract.go @@ -164,7 +164,6 @@ func (c *Contract) Call(transition string, args []core.ContractValue, params Cal if err2 != nil { return tx, err2 } - rsp, err := c.Provider.CreateTransaction(tx.ToTransactionPayload()) if err != nil { diff --git a/contract/contract_test.go b/contract/contract_test.go index ecacfb2..40f83c4 100644 --- a/contract/contract_test.go +++ b/contract/contract_test.go @@ -113,7 +113,6 @@ func TestContract_Call(t *testing.T) { privateKey := "e19d05c5452598e24caad4a0d85a49146f7be089515c905ae6a19e8a578a6930" chainID := 333 msgVersion := 1 - publickKey := keytools.GetPublicKeyFromPrivateKey(util.DecodeHex(privateKey), true) address := keytools.GetAddressFromPublic(publickKey) pubkey := util.EncodeHex(publickKey) diff --git a/transaction/transaction.go b/transaction/transaction.go index 970c92f..3aba360 100644 --- a/transaction/transaction.go +++ b/transaction/transaction.go @@ -16,23 +16,75 @@ type Transaction core.Transaction func NewFromPayload(payload *provider.TransactionPayload) *Transaction { v := strconv.FormatInt(int64(payload.Version), 10) n := strconv.FormatInt(int64(payload.Nonce), 10) - return &Transaction{ - ID: "", - Version: v, - Nonce: n, - Amount: payload.Amount, - GasPrice: payload.GasPrice, - GasLimit: payload.GasLimit, - Signature: payload.Signature, - Receipt: core.TransactionReceipt{}, - SenderPubKey: payload.PubKey, - ToAddr: "0x"+payload.ToAddr, - Code: payload.Code, - Data: payload.Data, - Status: 0, - ContractAddress: "", - Priority: payload.Priority, + var toAddr string + if payload.ToAddr == "0x0000000000000000000000000000000000000000" { + toAddr = "0x0000000000000000000000000000000000000000" + } else { + toAddr = "0x" + payload.ToAddr } + if payload.Data == "" { + // payment + return &Transaction{ + ID: "", + Version: v, + Nonce: n, + Amount: payload.Amount, + GasPrice: payload.GasPrice, + GasLimit: payload.GasLimit, + Signature: payload.Signature, + Receipt: core.TransactionReceipt{}, + SenderPubKey: payload.PubKey, + ToAddr: toAddr, + Code: payload.Code, + Data: "", + Status: 0, + ContractAddress: "", + Priority: payload.Priority, + } + } else if strings.Contains(payload.Data, "_tag") { + // contract call + var data provider.Data + json.Unmarshal([]byte(payload.Data), &data) + return &Transaction{ + ID: "", + Version: v, + Nonce: n, + Amount: payload.Amount, + GasPrice: payload.GasPrice, + GasLimit: payload.GasLimit, + Signature: payload.Signature, + Receipt: core.TransactionReceipt{}, + SenderPubKey: payload.PubKey, + ToAddr: toAddr, + Code: payload.Code, + Data: data, + Status: 0, + ContractAddress: "", + Priority: payload.Priority, + } + } else { + // contract deployment + var data []provider.Value + json.Unmarshal([]byte(payload.Data), &data) + return &Transaction{ + ID: "", + Version: v, + Nonce: n, + Amount: payload.Amount, + GasPrice: payload.GasPrice, + GasLimit: payload.GasLimit, + Signature: payload.Signature, + Receipt: core.TransactionReceipt{}, + SenderPubKey: payload.PubKey, + ToAddr: toAddr, + Code: payload.Code, + Data: data, + Status: 0, + ContractAddress: "", + Priority: payload.Priority, + } + } + } func (t *Transaction) toTransactionParam() TxParams {