solidity - 如何在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 网络中得到错误的签名者地址
解决方案
您是要签署字符串还是签署交易?@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);
你可以关注第二个。
推荐阅读
- python - 如何在pygame中为我的角色添加加速?
- python-3.x - 如何将 3D 球面点配置(不是地球)映射到 2D 平面上?
- wordpress - 我怎样才能只获得那些有产品在售的类别?
- java - 获取imei信息时如何在dialogFragment中获取上下文
- python - MatPlotLib 文本位置奇怪的行为
- linux - 错误“useradd:组 '100' 不存在”
- jquery - 为什么单击两次后我的事件侦听器与按钮解除绑定?
- c# - 如何使用 C# 处理超大的 .xlsx 文件
- c# - SignalrR HubConnection 忽略查询参数
- c# - 将类添加到 ICollection 列表