【问题标题】:Passing ECDSA v, r, and s values as function arguments to Solidity smart contract将 ECDSA v、r 和 s 值作为函数参数传递给 Solidity 智能合约
【发布时间】:2022-08-20 00:59:34
【问题描述】:

我正在通过 ethers.js 与一个智能合约进行交互,该合约有一个函数withdraw(uint8 v, bytes32 r, bytes32 s),可以将存储在合约中的资金提取到调用者的账户中,其中vrs 参数是 ECDSA 值,用于验证调用者的 address msg.sender。如何使用 ethers.js 获取这些参数以传递给该函数?我有一个从帐户的私钥生成的 ethers.js 钱包对象,但不知道如何从 wallet 转到 vrs

    标签: blockchain solidity ethers.js


    【解决方案1】:

    vrs 参数是签名消息后签名的一部分。

    所以首先,你需要知道你需要签署什么消息。由于它已在合约中验证,您应该能够通过检查合约源代码找到所需的消息。

    然后您可以使用 Ethers signMessage() 函数 (docs) 使用您的私钥对消息进行签名。结果,您得到一个 65 字节的 Raw Signature (docs),您可以将其传递给 splitSignature() 函数 (docs) 以获取 @987654334 的 vrs 参数@对象 (docs)。

    【讨论】:

    • 感谢您的回复,尽管我不确定我是否完全理解。重申一下,我想调用withdraw(v, r, s),为此我需要vrs 参数。据我了解您的回复,我需要创建一个事务对象tx = { to: ..., data: ..., etc },其中tocontract.withdraw 的地址,data 是有关withdraw 函数的数据。然后,我调用signTransaction 并将结果传递给splitSignature,从而产生vrs。然后我可以通过await contract.withdraw(v, r, s) 拨打withdraw。这是正确的,我如何创建tx 对象?
    • 不是signTransaction 而是signMessage... 在此上下文中消息未知。但是因为合约执行了某种验证,例如require(recover(message, v, r, s) == expectedSignerAddress);(否则他们为什么不验证签名呢?),你应该能够从合约源代码中检索到预期的消息。
    【解决方案2】:

    看起来您想使用solidity 中可用的ecrecover 函数。 ecrecover 有助于从包含r,v,s 的签名中恢复地址

    您可以使用ethereumjs-util npm 包,它可以在 Node.js 和带有 browserify 的浏览器中使用。

    import * as util from "ethereumjs-util";
    
    
    const { v, r, s } = util.fromRpcSig(messageSignedByMetamask);
    
    // then pass them contract code
    

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2012-11-17
      • 2021-09-16
      • 1970-01-01
      相关资源
      最近更新 更多