我们正在开发CBDC(央行数字货币)。我们有两个要求:
问题是如何在不将用户私钥发送到银行应用程序的情况下处理交易(链码)或智能合约。用户必须用他的私钥签署一些消息。之后,银行的应用程序必须使用此签名消息并在超级账本结构中创建交易。
有一个如何执行此操作的示例: https://hyperledger.github.io/fabric-sdk-node/release-2.2/tutorial-sign-transaction-offline.html
但是该示例使用了已弃用的“fabric-common”和“fabric-ca-client”库: https://www.npmjs.com/package/fabric-ca-client 并替换为“@hyperledger/fabric-gateway”。
问题是是否仍然可以通过私钥离线签署交易,将其发送到银行,银行应用程序将使用fabric-gateway在超级账本结构中处理它。
是的,离线签名可以与 Fabric Gateway 客户端 API 一起使用。这通常用于让最终用户在通过中间应用程序与 Fabric 交互时使用其本地私有凭据签署消息。文档将此模式描述为“离线签名”。合约的 API 文档包含流程的简要描述和所需的 API 调用:
请注意,用户需要提供在构建消息时使用的(公共)证书,但可以使用其私钥在本地对这些消息进行离线签名。使用的哈希实现也由签名实现的行为决定。默认情况下,使用 SHA-256 哈希值,这意味着消息摘要将是实际消息内容的 SHA-256 哈希值。这可以由可以从消息摘要生成签名的签名实现使用。如果签名实现需要完整的消息字节(换句话说,它生成摘要作为签名过程的一部分),则应使用仅返回提供的消息的无哈希实现。这意味着您获得的消息(提案、事务或提交)的摘要值实际上是完整的消息字节,而不是消息的哈希值。
作为背景信息,客户端应用程序和 Fabric 网络之间的事务流概述可能有助于可视化需要作为事务流一部分进行签名的消息: