代码设置钱包(Tron)多签
2023-06-26 14:26:52
来源:博客园
(资料图片仅供参考)
经常有人问我多签代码怎么写,官网有很多资料,都是稀里糊涂的没有完整的例子,而且也没有C#的例子,最近刚好有需求就自己动手写了。
代码
//封装private static async Task AccountPermissionUpdateAsync(string privateKey, string toAddress) { var record = TronServiceExtension.GetRecord(); var transactionClient = record.TronClient?.GetTransaction(); var account = new TronAccount(privateKey, TronNetwork.MainNet); var transactionExtention = await transactionClient?.CreateAccountPermissionUpdateTransactionAsync(account.Address, toAddress)!; var transactionSigned = transactionClient.GetTransactionSign(transactionExtention.Transaction, privateKey); var returnObj = await transactionClient.BroadcastTransactionAsync(transactionSigned); return new { Result = returnObj.Result, Message = returnObj.Message, TransactionId = transactionExtention.Transaction.GetTxid() };}//调用var privateKey = ""; //这里设置需要被多签的私钥var ownerAddress = ""; //这里设置控制地址//注意被设置多签的地址,最少需要 100TRX 余额var result = await AccountPermissionUpdateAsync(privateKey, ownerAddress);Console.WriteLine(JsonConvert.SerializeObject(result));
Github 源码
https://github.com/jared1106/Tron.Wallet.Net
//接口Task CreateAccountPermissionUpdateTransactionAsync(string fromAddress, string toAddress);//实现public async Task CreateAccountPermissionUpdateTransactionAsync(string fromAddress, string toAddress) { var wallet = _walletClient.GetProtocol(); var accountPermissionUpdateContract = new AccountPermissionUpdateContract { OwnerAddress = _walletClient.ParseAddress(fromAddress), Owner = new Permission() { PermissionName = "owner", Threshold = 1, Type = Permission.Types.PermissionType.Owner } }; accountPermissionUpdateContract.Owner.Keys.Add(new Key { Address = _walletClient.ParseAddress(toAddress), Weight = 1 }); var activePermission = new Permission { PermissionName = "active", Threshold = 1, //授权需要的权重数量 Type = Permission.Types.PermissionType.Active, // 7fff1fc0037e0000000000000000000000000000000000000000000000000000 包含了除更新权限以外的全部权限,Owner 默认都有,不需要设置 Operations = ByteString.CopyFrom("7fff1fc0037e0000000000000000000000000000000000000000000000000000".HexToByteArray()) }; var activeKey = new Key { Address = _walletClient.ParseAddress(toAddress), //授予地址 Weight = 1 //权重值 }; activePermission.Keys.Add(activeKey); var permissions = new Google.Protobuf.Collections.RepeatedField { activePermission }; accountPermissionUpdateContract.Actives.Add(permissions); return await wallet.AccountPermissionUpdateAsync(accountPermissionUpdateContract);}
引入依赖库
PM> Install-Package Tron.Wallet.Net
设置波场主网RPC信息(配置)
namespace Console1 { using Tron.Wallet.Net; public record TronRecord(IServiceProvider ServiceProvider, ITronClient TronClient, IOptions 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(); var options = provider.GetService>(); return new TronRecord(provider, client, options); } }}
参考
https://cn.developers.tron.network/reference/accountpermissionupdate