-
Notifications
You must be signed in to change notification settings - Fork 48
Expand file tree
/
Copy pathTransactionSignTest.cs
More file actions
134 lines (104 loc) · 5 KB
/
TransactionSignTest.cs
File metadata and controls
134 lines (104 loc) · 5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using TronNet.Protocol;
using Google.Protobuf;
using TronNet.Crypto;
namespace TronNet.Test
{
public class TransactionSignTest
{
private readonly TronTestRecord _record;
private readonly Wallet.WalletClient _wallet;
public TransactionSignTest()
{
_record = TronTestServiceExtension.GetTestRecord();
_wallet = _record.TronClient.GetWallet().GetProtocol();
}
[Fact]
public async Task TestTransactionSignAsync()
{
var privateStr = "8e812436a0e3323166e1f0e8ba79e19e217b2c4a53c970d4cca0cfb1078979df";
var tronKey = new TronECKey(privateStr, _record.Options.Value.Network);
var from = tronKey.GetPublicAddress();
var to = "TGehVcNhud84JDCGrNHKVz9jEAVKUpbuiv";
var amount = 100_000_000L; // 100 TRX, api only receive trx in Sun, and 1 trx = 1000000 Sun
var transactionExtension = await CreateTransactionAsync(from, to, amount);
Assert.True(transactionExtension.Result.Result);
var transaction = transactionExtension.Transaction;
var transactionSignExtention = await _wallet.GetTransactionSign2Async(new TransactionSign
{
PrivateKey = ByteString.CopyFrom(privateStr.HexToByteArray()),
Transaction = transaction
});
Assert.NotNull(transactionSignExtention);
Assert.True(transactionSignExtention.Result.Result);
var transactionSigned = transactionSignExtention.Transaction;
var transactionBytes = transaction.ToByteArray();
var transaction4 = SignTransaction2Byte(transactionBytes, privateStr.HexToByteArray(), transactionSigned);
var transaction5 = transactionSigned.ToByteArray();
Assert.Equal(transaction4.ToHex(), transaction5.ToHex());
var result = await _wallet.BroadcastTransactionAsync(transactionSigned);
Assert.True(result.Result);
}
private async Task<TransactionExtention> CreateTransactionAsync(string from, string to, long amount)
{
var fromAddress = Base58Encoder.DecodeFromBase58Check(from);
var toAddress = Base58Encoder.DecodeFromBase58Check(to);
var transferContract = new TransferContract
{
OwnerAddress = ByteString.CopyFrom(fromAddress),
ToAddress = ByteString.CopyFrom(toAddress),
Amount = amount
};
var transaction = new Transaction();
var contract = new Transaction.Types.Contract();
try
{
contract.Parameter = Google.Protobuf.WellKnownTypes.Any.Pack(transferContract);
}
catch (Exception)
{
return new TransactionExtention
{
Result = new Return { Result = false, Code = Return.Types.response_code.OtherError },
};
}
var newestBlock = await _wallet.GetNowBlock2Async(new EmptyMessage());
contract.Type = Transaction.Types.Contract.Types.ContractType.TransferContract;
transaction.RawData = new Transaction.Types.raw();
transaction.RawData.Contract.Add(contract);
transaction.RawData.Timestamp = DateTime.Now.Ticks;
transaction.RawData.Expiration = newestBlock.BlockHeader.RawData.Timestamp + 10 * 60 * 60 * 1000;
var blockHeight = newestBlock.BlockHeader.RawData.Number;
var blockHash = Sha256Sm3Hash.Of(newestBlock.BlockHeader.RawData.ToByteArray()).GetBytes();
var bb = ByteBuffer.Allocate(8);
bb.PutLong(blockHeight);
var refBlockNum = bb.ToArray();
transaction.RawData.RefBlockHash = ByteString.CopyFrom(blockHash.SubArray(8, 8));
transaction.RawData.RefBlockBytes = ByteString.CopyFrom(refBlockNum.SubArray(6, 2));
var transactionExtension = new TransactionExtention
{
Transaction = transaction,
Txid = ByteString.CopyFromUtf8(transaction.GetTxid()),
Result = new Return { Result = true, Code = Return.Types.response_code.Success },
};
return transactionExtension;
}
private byte[] SignTransaction2Byte(byte[] transaction, byte[] privateKey, Transaction transactionSigned)
{
var ecKey = new ECKey(privateKey, true);
var transaction1 = Transaction.Parser.ParseFrom(transaction);
var rawdata = transaction1.RawData.ToByteArray();
var hash = rawdata.ToSHA256Hash();
var sign = ecKey.Sign(hash).ToByteArray();
transaction1.Signature.Add(ByteString.CopyFrom(sign));
return transaction1.ToByteArray();
}
}
}