通过SignTypedData扩展Web3

  • danfinlay
  • 发布于 2018-04-21 23:18
  • 阅读 35

本文介绍了以太坊在扩展性方面的创新,特别是如何利用MetaMask的signTypedData方法构建状态通道。文章详细阐述了该方法的背景、优势,并提供了具体的JavaScript代码实例,展示了如何进行用户签名和验证,适合开发者学习和应用。

请注意:这是一个非常早期的功能,具体实现可能会有所改变!如果将来 API 发生变化,请不要将此方法用于你无法更新的生产应用程序!

以太坊计划采用多种方式进行扩展,且这是区块链爱好者广泛关注的话题,因为区块链的可扩展性是其实用性的重要技术限制。

你现在可以开始扩展你在以太坊上的应用程序,而无需等待任何其他技术可用的方法之一,就是构建机制,允许用户签署状态更改,这些更改并不总是提交到区块链,但在需要时可以提交,比如 状态通道。要创建一个可用的状态通道,利用 MetaMask 新的 signTypedData 方法是最简单的选择。

该方法最初由 0xLeonid Logvinov 提出,并由 MachimonySergey Ukustov 为 MetaMask 实现。这个新方法使得创建涉及用户签名的应用程序变得比以往更加简单:

  • 表示结构化数据。
  • 易于人类阅读。
  • 无法冒充以太坊交易。
  • 在链上计算成本低。

在本文中,你将学习展示给 MetaMask 用户如下内容:

结构化数据用户提示在链上计算成本低?不可能!

API 是简单的,一旦在新的 EthJS 和 Web3.js 版本中部署,将变得更加简单。与此同时,使用它将让你接触到 MetaMask 提供给你的最低级别 API:以太坊提供者。

你可以在 github 上在线找到此代码:这里

// 一个用于恢复签名的 JS 库:
const sigUtil = require('eth-sig-util')const msgParams = [\
  {\
    type: 'string',      // 任何有效的 solidity 类型\
    name: 'Message',     // 任何你想要的字符串标签\
    value: 'Hi, Alice!'  // 要签名的值\
 },\
 {\
   type: 'uint32',\
      name: '一个数字',\
      value: '1337'\
  }\
]   // 获取当前账户:web3.eth.getAccounts(function (err, accounts) {  if (!accounts) return  signMsg(msgParams, accounts[0])})function signMsg(msgParams, from) {  web3.currentProvider.sendAsync({
    method: 'eth_signTypedData',
    params: [msgParams, from],
    from: from,
  }, function (err, result) {    if (err) return console.error(err)
    if (result.error) {
      return console.error(result.error.message)
    }    const recovered = sigUtil.recoverTypedSignature({
      data: msgParams,
      sig: result.result
    })    if (recovered === from ) {
      alert('恢复的签名者: ' + from)
    } else {
      alert('验证签名者失败,得到: ' + result)
    }
  })
}

如你所见,在这里我们:

  • 导入了签名恢复库 eth-sig-util
  • 为方法组装参数。
  • 从 web3 API 中检索了当前用户的地址。
  • 请求用户签署这些参数。
  • 使用参数和签名,我们能够验证该签名来自他们的地址(仅来自他们的地址!)。

你不仅可以使用 JavaScript 验证此数据,还可以在 Solidity 中进行验证。以下是 在 Solidity 中验证这些签名的示例。这是编写关闭状态通道代码时可能会有用。

我希望这对你有所帮助,如有任何问题,请告诉我们,如果你创建了任何想要分享的示例,也请告诉我们!

  • 原文链接: medium.com/metamask/scal...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
danfinlay
danfinlay
江湖只有他的大名,没有他的介绍。