|
|
@@ -19,6 +19,7 @@ package types
|
|
|
import (
|
|
|
"bytes"
|
|
|
"crypto/ecdsa"
|
|
|
+ "encoding/json"
|
|
|
"math/big"
|
|
|
"testing"
|
|
|
|
|
|
@@ -29,7 +30,6 @@ import (
|
|
|
|
|
|
// The values in those tests are from the Transaction Tests
|
|
|
// at github.com/ethereum/tests.
|
|
|
-
|
|
|
var (
|
|
|
emptyTx = NewTransaction(
|
|
|
0,
|
|
|
@@ -190,3 +190,45 @@ func TestTransactionPriceNonceSort(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// TestTransactionJSON tests serializing/de-serializing to/from JSON.
|
|
|
+func TestTransactionJSON(t *testing.T) {
|
|
|
+ key, err := crypto.GenerateKey()
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("could not generate key: %v", err)
|
|
|
+ }
|
|
|
+ signer := NewEIP155Signer(common.Big1)
|
|
|
+
|
|
|
+ for i := uint64(0); i < 25; i++ {
|
|
|
+ var tx *Transaction
|
|
|
+ switch i % 2 {
|
|
|
+ case 0:
|
|
|
+ tx = NewTransaction(i, common.Address{1}, common.Big0, common.Big1, common.Big2, []byte("abcdef"))
|
|
|
+ case 1:
|
|
|
+ tx = NewContractCreation(i, common.Big0, common.Big1, common.Big2, []byte("abcdef"))
|
|
|
+ }
|
|
|
+
|
|
|
+ tx, err := SignTx(tx, signer, key)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatalf("could not sign transaction: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ data, err := json.Marshal(tx)
|
|
|
+ if err != nil {
|
|
|
+ t.Errorf("json.Marshal failed: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ var parsedTx *Transaction
|
|
|
+ if err := json.Unmarshal(data, &parsedTx); err != nil {
|
|
|
+ t.Errorf("json.Unmarshal failed: %v", err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // compare nonce, price, gaslimit, recipient, amount, payload, V, R, S
|
|
|
+ if tx.Hash() != parsedTx.Hash() {
|
|
|
+ t.Errorf("parsed tx differs from original tx, want %v, got %v", tx, parsedTx)
|
|
|
+ }
|
|
|
+ if tx.ChainId().Cmp(parsedTx.ChainId()) != 0 {
|
|
|
+ t.Errorf("invalid chain id, want %d, got %d", tx.ChainId(), parsedTx.ChainId())
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|