目录

我的学习分享

记录精彩的程序人生

波场trident实现多重签名

参考
https://github.com/tronprotocol/wallet-cli/blob/develop/src/main/java/org/tron/common/utils/TransactionUtils.java
中的setPermissionId方法

public static Transaction setPermissionId(Transaction transaction, String tipString)
      throws CancelException {
    if (transaction.getSignatureCount() != 0
        || transaction.getRawData().getContract(0).getPermissionId() != 0) {
      return transaction;
    }

    System.out.println(tipString);
    int permission_id = inputPermissionId();
    if (permission_id < 0) {
      throw new CancelException("User cancelled");
    }
    if (permission_id != 0) {
      Transaction.raw.Builder raw = transaction.getRawData().toBuilder();
      Transaction.Contract.Builder contract =
          raw.getContract(0).toBuilder().setPermissionId(permission_id);
      raw.clearContract();
      raw.addContract(contract);
      transaction = transaction.toBuilder().setRawData(raw).build();
    }
    return transaction;
  }

在使用trident时,像往常一样获得Transaction对象后,需要增加permission_id参数,然后正常签名并广播

Response.TransactionExtention txnExt = wrapper.freezeBalance(...);
        Transaction.raw.Builder raw = txnExt.getTransaction().getRawData().toBuilder();
        Transaction.Contract.Builder contract = raw.getContract(0).toBuilder().setPermissionId(4);
        raw.clearContract();
        raw.addContract(contract);
        Transaction transaction = txnExt.getTransaction().toBuilder().setRawData(raw).build();
        
        System.out.println("transaction=" + transaction);
        
        System.out.println("————————————————————————————————————————————————");
        
        Transaction signedTransaction = wrapper.signTransaction(transaction);
        
        System.out.println("signedTransaction=" + signedTransaction);
        
        String hash = wrapper.broadcastTransaction(signedTransaction);