波场(Tron)离线签名、广播交易笔记
  PtIp3fXqtY0m 2023年11月01日 199 0

NuGet 引入依赖库

PM> Install-Package Tron.Wallet.Net

配置波场RPC网络

public record TronRecord(IServiceProvider ServiceProvider, ITronClient? TronClient, IOptions<TronNetOptions>? Options);

public static class TronServiceExtension {
    private static IServiceProvider AddTronNet() {
        IServiceCollection services = new ServiceCollection();
        services.AddTronNet(x =>
        {
            x.Network = TronNetwork.MainNet;
            x.Channel = new GrpcChannelOption { Host = "grpc.trongrid.io", Port = 50051 };
            x.SolidityChannel = new GrpcChannelOption { Host = "grpc.trongrid.io", Port = 50052 };
            x.ApiKey = "80a8b20f-a917-43a9-a2f1-809fe6eec0d6";
        });
        services.AddLogging();
        return services.BuildServiceProvider();
    }

    public static TronRecord GetRecord() {
        var provider = AddTronNet();
        var client = provider.GetService<ITronClient>();
        var options = provider.GetService<IOptions<TronNetOptions>>();

        return new TronRecord(provider, client, options);
    }
}

这个类库非常的简单,几乎不用去关心波场链的东西,只需要生成私钥和地址,就可以轻松完成对地址里面的 trx 和 usdt 等资产进行管理操作。

签名并广播交易,以发送 TRX 为例子

private static async Task<dynamic> TrxTransferAsync(string privateKey, string to, long amount) {
    var record = TronServiceExtension.GetRecord();
    var transactionClient = record.TronClient?.GetTransaction();

    var account = new TronAccount(privateKey, TronNetwork.MainNet);

    var transactionExtension = await transactionClient?.CreateTransactionAsync(account.Address, to, amount)!;

    var transactionId = transactionExtension.Txid.ToStringUtf8();

    // 签名
    var transactionSigned = transactionClient.GetTransactionSign(transactionExtension.Transaction, privateKey);
    // 广播交易
    var returnObj = await transactionClient.BroadcastTransactionAsync(transactionSigned);

    return new { Result = returnObj.Result, Message = returnObj.Message, TransactionId = transactionId };
}

转出/发送 USDT

private static async Task<string> EtherTransferAsync(string privateKey, string toAddress, decimal amount, string? memo) {
    const string contractAddress = "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t";

    var record = TronServiceExtension.GetRecord();
    var contractClientFactory = record.ServiceProvider.GetService<IContractClientFactory>();
    var contractClient = contractClientFactory?.CreateClient(ContractProtocol.TRC20);

    var account = new TronAccount(privateKey, TronNetwork.MainNet);

    const long feeAmount = 30 * 1000000L;

    return await contractClient.TransferAsync(contractAddress, account, toAddress, amount, memo, feeAmount);
}

这里要设置波场手续费上限,现在必须设置30TRX,否则有可能交易失败,太贵了。其它 trc20 合约也是一样的操作,替换掉合约地址即可。
注意trc20合约交易的 amount 是 decimal 类型,不需要转换成 long 型

static async Task Main(string[] args) {
    Console.WriteLine("Program begin..");

    var privateKey = "D95611A9AF2A2A45359106222ED1AFED48853D9A44DEFF8DC7913F5CBA727366";

    //发送 trx
    var result = await TrxTransferAsync(privateKey, "TGehVcNhud84JDCGrNHKVz9jEAVKUpbuiv", 10000000L);
    Console.WriteLine(JsonConvert.SerializeObject(result));

    //发送 trc20 token usdt
    var transactionId = await EtherTransferAsync(privateKey, "TGehVcNhud84JDCGrNHKVz9jEAVKUpbuiv", 10, string.Empty);
    Console.WriteLine(transactionId);

    Console.WriteLine("Program end..\r\nPress any key to exit.");
    Console.ReadKey();
}

其他

波场(Tron)钱包设置多签
波场(Tron)网页版(本地)钱包开源
波场(Tron)项目常用工具分享
波场(Tron)离线签名、广播交易笔记
波场(Tron)离线生成私钥和地址笔记

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  U6UHQBKl2wpG   2024年08月07日   44   0   0 区块链
  U6UHQBKl2wpG   2024年08月07日   48   0   0 区块链
  SLI5qvYxXXnE   2024年08月07日   46   0   0 区块链
  SLI5qvYxXXnE   2024年08月07日   45   0   0 区块链
  SLI5qvYxXXnE   2024年08月07日   54   0   0 区块链
  SLI5qvYxXXnE   2024年08月07日   56   0   0 区块链
  dve6WtqypWN1   2024年08月06日   46   0   0 区块链
PtIp3fXqtY0m