首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ecrecover在tron中获得正确的地址

如何使用ecrecover在tron中获得正确的地址
EN

Stack Overflow用户
提问于 2020-04-15 05:39:20
回答 4查看 1.7K关注 0票数 1

在实体契约代码中,通过ecrecover获取签名者地址的代码块与Ethereum一起运行良好,但是在TRON中,它返回错误的地址,我的合同端代码是

代码语言:javascript
复制
    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的侧码是

代码语言:javascript
复制
    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网络中的签名者地址出错。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-06-07 20:53:17

取自here

智能合同代码:

代码语言:javascript
复制
contract Verifier {
    function recoverAddr(bytes32 msgHash, uint8 v, bytes32 r, bytes32 s) returns (address) {
        return ecrecover(msgHash, v, r, s);
    }

    function isSigned(address _addr, bytes32 msgHash, uint8 v, bytes32 r, bytes32 s) returns (bool) {
        return ecrecover(msgHash, v, r, s) == _addr;
    }
}

客户端代码:

代码语言:javascript
复制
const ethers = tronWeb.utils.ethersUtils;
let contract = await tronWeb.contract().at(contract_address);
let signingKey = new ethers.SigningKey(tronWeb.defaultPrivateKey);

let message = "This is some message";
let messageBytes = ethers.toUtf8Bytes(message);
let messageDigest = ethers.keccak256(messageBytes);

let signature = signingKey.signDigest(messageDigest);
let hexAddress = await contract.recoverAddr(messageDigest, signature.v, signature.r, signature.s).call();
票数 0
EN

Stack Overflow用户

发布于 2020-05-12 12:11:12

你是想签字符串还是签交易?@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)

如果您正试图像这里提到的那样签署msg

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

你可以跟着第二个。

票数 1
EN

Stack Overflow用户

发布于 2020-05-13 17:50:39

您可以参考文章https://medium.com/@coredevs/verifying-elliptic-curve-digital-signature-with-tron-smart-contract-5d11347e7b5b。这将有助于完成对字符串的签名,以及@Aldo提供的上述答案。编码愉快。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61222017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档