如何在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网络中得到错误的签名者地址

您是在尝试对字符串进行签名还是对事务进行签名@阿什温

我在签署字符串时也遇到了同样的问题,下面的内容帮助了我。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 signature=等待tronWeb.trx.sign(msg(;

您可以跟随第二个。

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

取自此处:

智能合约代码:

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;
}
}

客户端代码:

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();

根据https://github.com/tronprotocol/tronweb/blob/1435436f83b910f19e9205998e348ea093732ce5/src/lib/trx.js#L629

tronWeb.trx.sign()执行以下

  1. 传入32字节的哈希
  2. 前缀";\x19TRON签名消息:\n32">需要先添加
  3. 使用keccak256算法生成新的哈希
  4. 签名(TronLink或私钥(

因此,当使用solidity的ecrecover时,会传入步骤3的哈希。

function getHash(hash) {
hash = hash.replace(/^0x/, '')
if (!tronWeb.utils.isHex(hash)) {
return
}
if (hash.length !== 64) {
return
}
const {
keccak256,
toUtf8Bytes
} = tronWeb.utils.ethersUtils
const hashArray = tronWeb.utils.code.hexStr2byteArray(hash)
const TRX_MESSAGE_PREFIX = toUtf8Bytes('x19TRON Signed Message:n32')
return keccak256([
...TRX_MESSAGE_PREFIX,
...hashArray
])
}

相关内容

  • 没有找到相关文章

最新更新