产品展示

  • 首页 i(name 如何使用亚马逊托管区块链构建加密钱包应用程序 数据库博客

如何使用亚马逊托管区块链构建加密钱包应用程序 数据库博客

2026-01-27 13:51:07

使用 Amazon Managed Blockchain 建立加密钱包应用程序

关键要点

在本文中,我们将介绍如何利用 Amazon Managed Blockchain (AMB) 及其提供的主要功能快速构建加密钱包应用程序。AMB Access 和 AMB Query 简化了与区块链的交互,从而使得开发者能够专注于钱包特定的功能,如安全管理私钥、执行交易以及查询区块链数据等。

构建加密货币钱包需要操作许多特定于区块链的组件,以实现钱包的关键功能。这包括但不限于区块链节点的配置和管理、安全的私钥管理解决方案、性能优越的交易管理模块,以及处理复杂的区块链数据管道。这些组件需要复杂的安全性和基础设施管理任务,鉴于加密货币的安全关键性,钱包应用程序必须谨慎构建。

Amazon Managed BlockchainAMB为一些核心区块链组件提供了强大的抽象,使开发人员能够将繁琐的工作卸载,从而专注于与应用程序特定任务相关的内容,例如为他们的加密钱包应用程序构建强大的密钥管理。 AMB Access 和 AMB Query 为开发者提供了对比特币和以太坊等多个公共区块链的访问,使您能够构建交易工作流程、检索当前和历史区块链数据等。结合其他 AWS 服务,Managed Blockchain 为加密钱包解决方案提供了基础。

在本文中,我们将分享一个示例实现的钱包应用程序,充分利用 AWS 服务和 Managed Blockchain 的独特功能。

AMB Access 和 Query

Managed Blockchain 显著简化了区块链应用程序的操作方面,为比特币和以太坊等主要网络提供了基本的基础设施支持。 AMB Access 提供了一个完全托管的区块链节点网关,简化了连接和交互不同区块链网络的过程。此外,AMB Query 提升了区块链数据处理的效率。它提供了索引的区块链数据,使得当前和历史区块链数据的复杂查询可以简单地转换为 API 调用。这种跨不同协议的统一方法减少了区块链数据管理的复杂性和时间,提高了整体效率,降低了成本、风险和运营工作量。

构建加密货币钱包应用程序

在实施钱包时,有两个关键的考虑因素。

第一个是密钥管理。 AWS CloudHSM 和 AWS Key Management ServiceAWS KMS是用于安全存储和访问区块链钱包中的私钥的安全密钥管理服务。 CloudHSM 提供了基于云的硬件安全模块,符合 FIPS 1402 Level 3 标准,只有用户可以访问密钥。用户可以生成自己的私钥并安全存储在 CloudHSM 中,而且在多个可用区域中得到保护以防系统故障。AWS KMS 在云环境中安全地管理密钥,并支持安全存储和访问私钥。

下一个考虑因素是交易管理。钱包使用用户的私钥为交易添加加密签名,以安全地创建新交易并将其发送到区块链网络。这个签名确保了交易的有效性和未被篡改,并允许交易在区块链网络上处理。用户安全地保护私钥并签署交易,以便可以安全地记录在区块链上。此外,用户的交易记录和其状态必须能够从区块链网络中查询。为此,钱包与区块链节点进行通信,以准确地提供交易进度、确认次数以及是否包括在区块中。用户可以实时监控他们的交易并采取必要的措施。

有关密钥管理和交易创建过程的更多信息,请参见 AWS Nitro Enclaves 用于安全的区块链密钥管理:第一部分。

使用 AMB Access 和 AMB Query 简化钱包应用程序开发

如果您在没有使用 AMB Access 和 AMB Query 的情况下实现自己的交易管理器,您必须创建一个事件侦听器,以便在基于 Amazon Elastic Compute CloudAmazon EC2和 AWS Fargate 提交交易后进行回调。这个手动的交易管理模块使用 AWS 的各种服务,如 Amazon Kinesis、Amazon Simple Storage ServiceAmazon S3、Amazon DynamoDB 和 Amazon Aurora,来跟踪交易何时提交、完成等。以下图展示了一个示例架构。

然而,您可以通过使用 AMB Access 和 AMB Query 中的方便 API 查询功能来简化此能力的实现,这允许开发者向所选择的网络广播交易AMB Access,然后查询与该交易状态相关的数据AMB Query。

以下图展示了通过 AMB Access 从钱包发送交易并使用 AMB Query 查询交易的架构。

该架构遵循以下一般步骤以执行交易监控:

当您调用后端 API 时,Amazon API Gateway 和 AWS Lambda 进行身份验证和授权。身份验证后,Lambda 使用 AMB Query 调用 API 请求所需的区块链数据。AMB Query 检索区块链数据并返回结果,Lambda 函数将 AMB Query 的结果处理成所需的数据形式,然后回应用户。如果您在发送其他用户拥有的加密货币或代币,可以使用 AMB Access 创建和发送交易。有关更多信息,请参见 如何使用 AWS KMS 签名以太坊 EIP1559 交易。

钱包服务流程概述

下图展示了一个示例应用程序界面,概述了加密货币钱包的常见功能。

它提共以下功能:

quickq机场余额 检查总钱包资产交易列表 查看交易历史交易详情 探索具体交易信息代币列表 访问所拥有的代币,特别是 NFT

借助 AMB Query,开发者可以通过一系列简单的 API 调用填充这些钱包用户界面元素。

如何使用亚马逊托管区块链构建加密钱包应用程序 数据库博客

余额

AMB Query 可以通过两种方式检查余额: GetTokenBalance 和 BatchGetTokenBalance。它还支持以多种编程语言查询多个加密货币的余额。不同之处在于,getTokenBalance 检查由外部拥有账户EOA或合约地址CA持有的余额,而 batchGetTokenBalance 可以检查多个地址和合约地址的余额。如果用户使用多个主网络,可以同时使用 batchGetTokenBalance 检查余额。

让我们使用 Python 代码通过 GetTokenBalance 检查余额。在这个示例中,我们使用了一个著名的比特币地址。您当然可以使用您自己的地址进行测试。

python python

import boto3query = boto3client(managedblockchainquery)querygettokenbalance(tokenIdentifier={networkBITCOINMAINNET tokenIdbtc} ownerIdentifier={address1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa}){ ResponseMetadata { HTTPStatusCode 200 HTTPHeaders } ownerIdentifier { address 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa } tokenIdentifier { network BITCOINMAINNET tokenId btc } balance 7266900535 atBlockchainInstant { time datetimedatetime(2023 8 2 22 15 12 tzinfo=tzlocal()) } lastUpdatedTime { time datetimedatetime(2023 8 1 19 1 26 tzinfo=tzlocal()) }}

交易列表

从对 ListTokenBalance 的初步搜索结果中,我们可以推测到向此特定地址发送了许多交易,因此我们只搜索前两个交易,使用的是 ListTransactions。要检索其他数据页,您可以使用响应中包含的 nextToken 进行后续调用以获取下一页数据。请注意,在响应中没有 nextToken 表示您已经达到了给定查询的可用数据的结尾,没有更多页面可检索。

python

querylisttransactions(address=1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa network=BITCOINMAINNET maxResults=2){ ResponseMetadata{ HTTPStatusCode200 HTTPHeaders{ } transactions[ { transactionHash4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b networkBITCOINMAINNET transactionTimestampdatetimedatetime(2009 1 4 3 15 5 tzinfo=tzlocal()) } { transactionHash3387418aaddb4927209c5032f515aa442a6587d6e54677f08a03b8fa7789e688 networkBITCOINMAINNET transactionTimestampdatetimedatetime(2011 5 14 4 42 15 tzinfo=tzlocal()) } ] nextToken XXXXX }}

交易详情

要查看比特币首次交易的详细信息,您可以使用 GetTransaction:

python

querygettransaction(network=BITCOINMAINNET transactionHash=4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b){ ResponseMetadata { HTTPStatusCode 200 } transaction { network BITCOINMAINNET blockHash 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f transactionHash 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b blockNumber 0 transactionTimestamp datetimedatetime(2009 1 4 3 15 5 tzinfo=tzlocal()) transactionIndex 0 numberOfTransactions 1 status FINAL transactionFee 0 transactionId 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b }}

交易 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b 位于区块编号 0创世区块,状态为 FINAL。该区块所包含的交易数量为 1。如果您想查看更多详细的交易信息,可以使用 ListTransactionEvents:

python

querylisttransactionevents(network=BITCOINMAINNET transactionHash=4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b){ ResponseMetadata { HTTPStatusCode 200 events [ { network BITCOINMAINNET transactionHash 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b eventType BITCOINVOUT to 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa value 50 tokenId btc transactionId 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b voutIndex 0 } ] }}

首次交易的事件为 BITCOINVOUT 类型,支付 50 BTC 到该地址。实际上,这笔交易是区块中的首笔交易,正对应于比特币的区块挖矿奖励交易。当在普通地址之间发送和接收 BTC 时,还可以观察到 BITCOINVIN 和 BITCOINVOUT 类型的事件。在以太坊中,这些事件类型的响应与 AMB Query 中的示例有所不同,如下例所示。

代币列表

使用 ListTokenBalances 查询拥有者的以太坊代币ERC20、ERC721、ERC1155及其余额:

python

arguments = { tokenFilter {network ETHEREUMMAINNET} ownerFilter {address 0xab5801a7d398351b8be11c439e05c5b3259aec9b} maxResults 3 }querylisttokenbalances(arguments){ ResponseMetadata { HTTPStatusCode 200 tokenBalances [ { ownerIdentifier {address 0xab5801a7d398351b8be11c439e05c5b3259aec9b} tokenIdentifier {network ETHEREUMMAINNET tokenId eth} balance 24185900769032875808 atBlockchainInstant {time datetimedatetime()} lastUpdatedTime {time datetimedatetime()} } { ownerIdentifier {address 0xab5801a7d398351b8be11c439e05c5b3259aec9b} tokenIdentifier { network ETHEREUMMAINNET contractAddress 0x00000000051b48047be6dc0ada6de5c3de86a588} balance 99000000000000000000 atBlockchainInstant {time datetimedatetime()} lastUpdatedTime {time datetimedatetime()} } { ownerIdentifier {address 0xab5801a7d398351b8be11c439e05c5b3259aec9b} tokenIdentifier { network ETHEREUMMAINNET contractAddress 0x0000000035f26e72b70552b92bf7e02f67a90549} balance 20000000000000000000000000 atBlockchainInstant {time datetimedatetime()} lastUpdatedTime {time datetimedatetime()} } ] nextToken XXXXX}

响应中的 contractAddress 字段为请求者所拥有的智能合约地址,同时也包括了智能合约的余额。对于分页,API 还支持 maxResult 功能,因此请求者可以使用 nextToken 获取下一组结果。

您可以在 GitHub 仓库 中找到此钱包