首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用solidity验证TRON地址

使用solidity验证TRON地址
EN

Stack Overflow用户
提问于 2020-06-07 15:01:45
回答 1查看 1.7K关注 0票数 0

我正在尝试使用在TRON网络上运行的智能契约来验证一条签名消息。我尝试过几种不同的方法,但都失败了:

基于这篇文章,我部署了以下智能契约:

代码语言: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;
    }
}

以及以下客户端(js)代码:

代码语言:javascript
复制
let contract = await tronWeb.contract().at(contract_address);
let msg = tronWeb.sha3('This is my message');
let 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);

let hexAddress = await contract.recoverAddr(msg, v, r, s).call();

但找错地址了。

基于这篇文章,我部署了以下智能契约:

代码语言:javascript
复制
contract Verifier {


  //return the address according to the signature and and the data
  function validate(bytes32 hash, bytes signature)
  public
  pure
  returns (address){
      bytes memory signedString = signature;
      bytes32  r = convertToBytes32(slice(signedString, 0, 32));
      bytes32  s = convertToBytes32(slice(signedString, 32, 32));
      byte  v1 = slice(signedString, 64, 1)[0];
      uint8 v = uint8(v1) + 27;
      return ecrecover(hash, uint8(r), s, bytes32(v));
  }

  //slice function
  function slice(bytes memory data, uint start, uint len)
  private
  pure
  returns (bytes){
      bytes memory b = new bytes(len);
      for(uint i = 0; i < len; i++){
          b[i] = data[i + start];
      }
      return b;
  }
  //convert bytes to bytes32
  function convertToBytes32(bytes memory source)
  private
  pure
  returns (bytes32 result) {
      assembly {
          result := mload(add(source, 32))
      }
  }
}

以及以下客户端(js)代码:

代码语言:javascript
复制
let contract = await tronWeb.contract().at(contract_address);
let msg = tronWeb.sha3('Hello World');
let signature = await tronWeb.trx.sign(msg);
let hexAddress = await contract.validate(msg, signature).call();

还是找错地址了。

我设法使用基于的纯js代码对地址进行签名和恢复。

代码语言:javascript
复制
const ethers = tronWeb.utils.ethersUtils;
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 recovered = ethers.recoverAddress(messageDigest, signature);
console.log("Recovered address: " + recovered);

如何使用js代码签署消息并使用智能契约进行恢复?我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-07 20:50:55

这样啊,原来是这么回事。

智能合同代码:

代码语言: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();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62247259

复制
相关文章

相似问题

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