【问题标题】:Can I send transactions async using polkadot-js我可以使用 polkadot-js 异步发送事务吗
【发布时间】:2021-11-16 14:57:54
【问题描述】:

我浏览了官方文档,找到了一个关于如何使用polkadot-js进行转账的页面https://polkadot.js.org/docs/api/examples/promise/make-transfer

const transfer = api.tx.balances.transfer(BOB, 12345);
const hash = await transfer.signAndSend(alice);

我想知道是否可以将signAndSend 方法一分为二并在不同的机器上执行。就像在客户端机器中一样,在浏览器中计算签名。

const transfer = api.tx.balances.transfer(BOB, 12345);
const signature = await transfer.signAsync(alice);

然后在服务器端发送转账交易。

const mockSigner = createMockSigner(signature); // signature is computed from the client side and send to server over HTTP
const transfer = api.tx.balances.transfer(BOB, 12345);
const res = transfer.send({signer: mockSigner});

上面的例子行不通,我只是想表达我是否可以在不同的机器上签名和发送。

【问题讨论】:

    标签: javascript substrate polkadot polkadot-js


    【解决方案1】:

    在一台计算机上签署交易并从另一台计算机发送它绝对是可能的。

    PolkadotJS Tools 包含一种用于离线构建和签署交易的方法。您可以找到来源here。请注意,在浏览器中构建交易仍然需要访问 polkadot 节点(代码中的endpoint)。

    签名者 sendOffline 命令具有完全相同的 API,但不会 广播交易。 submit 和 sendOffline 必须连接到 一个节点来获取当前元数据并构造一个有效的 交易。他们的 API 格式如下:

    因此,您需要在浏览器中运行light client 才能访问当前块信息或附加到浏览器之外的某个其他节点端点。

    【讨论】:

    • 谢谢,我读了一些关于离线签名的东西,仍然不太明白为什么离线签名如此困难且基板不同。这是否意味着在在线模式下,当调用api.tx.balance.transfer 时,传输对象是唯一的,因此它的签名不能发送到其他机器?而在离线模式下,我们手动构造传输对象,以便共享签名?
    • 从根本上说,离线签名和在线签名在签名方面都是一样的。 cmdSendOffline.ts 创建事务有效负载并对其进行签名,然后将其转储到 JSON。 cmdSign.ts 仅对有效负载进行签名。您还可以在 CLI 上传递submit 命令,在这种情况下,来自cmdSign 的签名有效负载被提交
    【解决方案2】:

    离线签到版: https://gist.github.com/xcaptain/4d190232411dcf27441d9fadd7ff6988

    在线签到版:

    const transfer = api.tx.balances.transfer(BOB, 12345);
    const signedExtrinsic = await transfer.signAsync(alice).toJSON();
    await api.rpc.author.submitExtrinsic(signedExtrinsic);
    

    不知道有什么区别,但它们都有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      相关资源
      最近更新 更多