1

我正在尝试在 Ruby 中离线签署 Tron 交易。

TronGrid 有一个端点来签署交易,但他们需要向他们发送帐户私钥才能这样做,这感觉有潜在风险,所以我想在本地签署交易以避免私钥值离开服务器。

具体来说,我正在尝试在 Ruby 中转换此 Javascript 方法:https ://github.com/tronprotocol/tronweb/blob/master/src/utils/crypto.js#L218

我一直在尝试同时使用 OpenSSL 和gem来做到这一点,但没有取得多大成功。

这是我到目前为止所得到的:

  bn = OpenSSL::BN.new(hex_private_key, 16)
  ec = OpenSSL::PKey::EC.new('secp256k1')
  ec.private_key = bn
  ec.dsa_sign_asn1(transaction_id).unpack1('H*')

  bn = OpenSSL::BN.new(hex_private_key, 16)
  private_key = EC::PrivateKey.new(bn.to_i)
  signature = private_key.sign(transaction_id)

后者给了我rands然后在 javascript 函数中使用(即使它们与我在 JS 中得到的不匹配),我不确定我在哪里可以得到那个recoveryParam.

前者并没有返回我所期望的签名。

我有点迷失如何找到签署这些交易的方法。

4

1 回答 1

0

你知道怎么做吗?在示例中需要raw_data_hex

  private static byte[] signTransaction2Byte(byte[] transaction, byte[] privateKey)
      throws InvalidProtocolBufferException {
    ECKey ecKey = ECKey.fromPrivate(privateKey);
    Transaction transaction1 = Transaction.parseFrom(transaction);
    byte[] rawdata = transaction1.getRawData().toByteArray();
    byte[] hash = Sha256Sm3Hash.hash(rawdata);
    byte[] sign = ecKey.sign(hash).toByteArray();
    return transaction1.toBuilder().addSignature(ByteString.copyFrom(sign)).build().toByteArray();
  }`

`Sha256Sm3Hash.hash` returns `sha256` or `sm3` depends on private key.
于 2022-01-08T21:15:05.010 回答