首页 > 解决方案 > 如何在tron中使用ecrecover获取正确的地址

问题描述

在solidity合约代码中通过ecrecover获取签名者地址的代码块在以太坊上运行良好,但在TRON中它返回错误的地址我的合约端代码是

    function validate(string memory strTest,uint8 v, bytes32 r, bytes32 s) public view returns(address){
      bytes32 prefixedHash = keccak256(strTest);
      return ecrecover(keccak256(prefixedHash),v,r,s);
      // return ecrecover(prefixedHash,v,r,s):
   }

dapp 端代码是

    msg = tronWeb.sha3("this is test string");
    var signature = await tronWeb.trx.sign(msg);
    var r=signature.substr(0,66);
    var s= "0x" + signature.substr(66,64);
    var v="0x" + signature.substr(signature.length-2);
    retValue = await thisContractInstance.validate("this is test string",v,r,s).call();

但在这两种情况下(一种情况在合同端代码中注释)在 TRON shasta 网络中得到错误的签名者地址

标签: soliditytronsigner

解决方案


您是要签署字符串还是签署交易?@ashwin

我在签署字符串时遇到了同样的问题,下面的内容帮助了我。Tronweb 使用不同的方法来签署交易和签署字符串。

1)对于交易,您可以参考:https ://github.com/TRON-US/tronweb/blob/master/src/lib/trx.js#L651 ,

2)关于签名字符串,它使用

ethers.utils.SigningKey.signDigest ()

以太坊的:https ://docs.ethers.io/ethers.js/html/api-advanced.html?highlight=signingkey#id8 ,请注意最后的v字节将始终为 Solidity 规范化(27 或 28)

如果您尝试按照此处提到的方式签署味精

var 签名 = 等待 tronWeb.trx.sign(msg);

你可以关注第二个。


推荐阅读