在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()
执行以下
- 传入32字节的哈希
- 前缀";\x19TRON签名消息:\n32">需要先添加
- 使用
keccak256
算法生成新的哈希 - 签名(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
])
}