9 "github.com/davecgh/go-spew/spew"
11 "github.com/vapor/encoding/blockchain"
12 "github.com/vapor/protocol/bc"
13 "github.com/vapor/testutil"
16 func TestSerializationTxOutput(t *testing.T) {
17 assetID := testutil.MustDecodeAsset("81756fdab39a17163b0ce582ee4ee256fb4d1e156c692b997d608a42ecb38d47")
18 txOutput := NewIntraChainOutput(assetID, 254354, []byte("TestSerializationTxOutput"))
19 wantHex := strings.Join([]string{
20 "01", // asset version
21 "40", // serialization length
23 "3e", // output commitment length
24 "81756fdab39a17163b0ce582ee4ee256fb4d1e156c692b997d608a42ecb38d47", // assetID
27 "19", // control program length
28 "5465737453657269616c697a6174696f6e54784f7574707574", // control program
29 "00", // witness length
32 // Test convert struct to hex
33 var buffer bytes.Buffer
34 if err := txOutput.writeTo(&buffer); err != nil {
38 gotHex := hex.EncodeToString(buffer.Bytes())
39 if gotHex != wantHex {
40 t.Errorf("serialization bytes = %s want %s", gotHex, wantHex)
43 // Test convert hex to struct
44 var gotTxOutput TxOutput
45 decodeHex, err := hex.DecodeString(wantHex)
50 if err := gotTxOutput.readFrom(blockchain.NewReader(decodeHex)); err != nil {
54 if !testutil.DeepEqual(*txOutput, gotTxOutput) {
55 t.Errorf("expected marshaled/unmarshaled txoutput to be:\n%sgot:\n%s", spew.Sdump(*txOutput), spew.Sdump(gotTxOutput))
59 func TestSerializationVoteTxOutput(t *testing.T) {
60 assetID := testutil.MustDecodeAsset("81756fdab39a17163b0ce582ee4ee256fb4d1e156c692b997d608a42ecb38d47")
61 voteTxOutput := NewVoteOutput(assetID, 1000, []byte("TestSerializationTxOutput"), []byte("af594006a40837d9f028daabb6d589df0b9138daefad5683e5233c2646279217294a8d532e60863bcf196625a35fb8ceeffa3c09610eb92dcfb655a947f13269"))
63 wantHex := strings.Join([]string{
64 "01", // asset version
65 "c101", // serialization length
67 "8001", // output xpub length
68 "6166353934303036613430383337643966303238646161626236643538396466306239313338646165666164353638336535323333633236343632373932313732393461386435333265363038363362636631393636323561333566623863656566666133633039363130656239326463666236353561393437663133323639", // xpub
69 "3d", // output commitment length
70 "81756fdab39a17163b0ce582ee4ee256fb4d1e156c692b997d608a42ecb38d47", // assetID
73 "19", // control program length
74 "5465737453657269616c697a6174696f6e54784f7574707574", // control program
75 "00", // witness length
78 // Test convert struct to hex
79 var buffer bytes.Buffer
80 if err := voteTxOutput.writeTo(&buffer); err != nil {
84 gotHex := hex.EncodeToString(buffer.Bytes())
85 if gotHex != wantHex {
86 t.Errorf("serialization bytes = %s want %s", gotHex, wantHex)
89 // Test convert hex to struct
90 var gotTxOutput TxOutput
91 decodeHex, err := hex.DecodeString(wantHex)
96 if err := gotTxOutput.readFrom(blockchain.NewReader(decodeHex)); err != nil {
100 if !testutil.DeepEqual(*voteTxOutput, gotTxOutput) {
101 t.Errorf("expected marshaled/unmarshaled txoutput to be:\n%sgot:\n%s", spew.Sdump(*voteTxOutput), spew.Sdump(gotTxOutput))
105 func TestComputeOutputID(t *testing.T) {
106 btmAssetID := testutil.MustDecodeAsset("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")
114 sc: &SpendCommitment{
115 AssetAmount: bc.AssetAmount{AssetId: &btmAssetID, Amount: 1000},
116 SourceID: testutil.MustDecodeHash("4b5cb973f5bef4eadde4c89b92ee73312b940e84164da0594149554cc8a2adea"),
119 ControlProgram: testutil.MustDecodeHexString("0014cb9f2391bafe2bc1159b2c4c8a0f17ba1b4dd94e"),
121 inputType: SpendInputType,
123 wantOutputID: "73eea4d38b22ffd60fc30d0941f3875f45e29d424227bfde100193a08568605b",
126 sc: &SpendCommitment{
127 AssetAmount: bc.AssetAmount{AssetId: &btmAssetID, Amount: 999},
128 SourceID: testutil.MustDecodeHash("9e74e35362ffc73c8967aa0008da8fcbc62a21d35673fb970445b5c2972f8603"),
131 ControlProgram: testutil.MustDecodeHexString("001418549d84daf53344d32563830c7cf979dc19d5c0"),
133 inputType: SpendInputType,
135 wantOutputID: "8371e76fd1c873503a326268bfd286ffe13009a0f1140d2c858e8187825696ab",
138 sc: &SpendCommitment{
139 AssetAmount: bc.AssetAmount{AssetId: &btmAssetID, Amount: 999},
140 SourceID: testutil.MustDecodeHash("993d3797fa3b2d958f300e599987dc10904b13f56ce89d158f60f9131424e0e2"),
143 ControlProgram: testutil.MustDecodeHexString("00145c47f3a0dd3e1e9956fe5b0f897072ed33f9efb9"),
145 inputType: UnvoteInputType,
146 vote: []byte("af594006a40837d9f028daabb6d589df0b9138daefad5683e5233c2646279217294a8d532e60863bcf196625a35fb8ceeffa3c09610eb92dcfb655a947f13269"),
147 wantOutputID: "c95701822db14f5c647158762e4d4b9bff270bfd3040f0ca32cb87c18e377429",
150 sc: &SpendCommitment{
151 AssetAmount: bc.AssetAmount{AssetId: &btmAssetID, Amount: 999},
152 SourceID: testutil.MustDecodeHash("993d3797fa3b2d958f300e599987dc10904b13f56ce89d158f60f9131424e0e2"),
155 ControlProgram: testutil.MustDecodeHexString("00145c47f3a0dd3e1e9956fe5b0f897072ed33f9efb9"),
157 inputType: UnvoteInputType,
159 wantOutputID: "8f17b871f3fd07bfe778e92c272e26d4bb19258c90af08310ef32feb526eaf9c",
163 for _, c := range cases {
164 outputID, err := ComputeOutputID(c.sc, c.inputType, c.vote)
169 if c.wantOutputID != outputID.String() {
170 t.Errorf("test compute output id fail, got:%s, want:%s", outputID.String(), c.wantOutputID)