你的第一笔交易
本教程介绍了 Aptos SDK 以及如何生成、提交和验证提交给 Aptos 区块链的交易。我们将运行 transfer-coin 的示例。
第 1 步:选择一个 SDK
第 2 步:运行示例代码
克隆 aptos-core 仓库:
git clone git@github.com:aptos-labs/aptos-core.git ~/aptos-coreTypescript
进入到 Typescript SDK 示例的路径下
cd ~/aptos-core/ecosystem/typescript/sdk/examples/typescript安装必要的依赖:
yarn install运行
transfer_coin示例代码yarn run transfer_coinPython
进入到 Python SDK 示例的路径下:
cd ~/aptos-core/ecosystem/python/sdk安装必要的依赖:
curl -sSL <https://install.python-poetry.org> | python3 poetry update运行
transfer-coin示例代码poetry run python -m examples.transfer-coinRust
进入到 Rust SDK 示例的路径下:
cd ~/aptos-core/sdk运行
transfer-coin示例代码cargo run --example transfer-coin:
第 3 步:程序输出解析
在你运行上述示例中的命令后,将会出现类似以下的输出:
上面的输出显示,transfer-coin例子执行了以下步骤。
初始化 REST 和 Faucet 客户端。
创建两个账户:Alice 和 Bob。
通过 Faucet 接口创建 Alice 的账户,并向其注资。
通过 Faucet 接口创建 Bob 的账户。
将 1000 个代币从 Alice 的地址转到 Bob 的地址。
爱丽丝支付了 4 个单位 gas 费用,以实现这一转账操作。
再一次从 Alice 的地址转移 1000 个代币到 Bob 的地址。
爱丽丝又支付了 4 个单位的 gas 费用来完成这次转账。
接下来,请看下面用于完成上述步骤的 SDK 接口的详细解释。
第 4 步:深入理解 SDK 原理
transfer-coin 示例代码使用辅助函数与 REST API 互动。本节将对每个调用进行回顾,并对功能进行深入分析。
Typescript
请根据
[transfer-coin]的完整代码,完成下面的步骤操作
Python
请根据
[transfer-coin]的完整代码,完成下面的步骤操作
Rust
请根据
[transfer-coin]的完整代码,完成下面的步骤操作
第 4.1 步:初始化客户端
第一步, transfer-coin 实例中初始化了 REST 和 faucet 的客户端。
REST 客户端与 REST API 进行交互
faucet客户端与 devnet Faucet 服务交互,用于创建账户和向账户中注入代币。
Typescript
使用API客户端,我们可以创建一个
CoinClient,我们用它来进行常见的代币操作,如转移代币和检查余额。common.ts初始化了以下的 URL 值。Python
[common.py]初始化了以下配置值Rust
使用 client API,我们可以创建一个 CoinClient 对象,我们用它来进行常见的硬币操作,如转移硬币和检查余额。
在本例中,我们按照如下方法配置测试网 URL
APTOS_NODE_URLAPTOS_FAUCET_URL</aside>
第 4.2 步:在本地创建地址
下一步,是在本地创建两个账户。 账户同时代表链上和链下状态。链下状态包括一个地址和用于验证所有权的公钥、私钥对。这一步演示了如何生成链下状态。
Typescript
Python
Rust
第 4.3 步:创建链上账户rust
在 Aptos 网络中,每个账户都必须有一个链上表示,以支持接收代币和硬币,以及在其他 DApps 中进行互动。一个账户代表了一个存储资产的媒介,因此它必须明确地被创建。这个例子利用 Faucet 提供的接口来创建和资助 Alice 的账户;对于 Bob 的账户,我们只做创建的操作:
Typescript
Python
Rust
第 4.4 步:读取账户余额
在这一步中,我们将使用 Aptos SDK 提供的能力请求一个资源,并且读取该资源中的成员变量
Typescript
源码逻辑:TypeScript SDK 提供的
CoinClient下的checkBalance函数查询了当前账户地址下所有资源,然后过滤出 Aptos 测试代币(APTOS_COIN)所在的资源,并且读取了当前的值,即用户持有的 Aptos 测试代币的余额。Python
源码逻辑:Python SDK 的 account_balance 函数直接查询了 Aptos 测试代币所在的资源,并且读取了当前的值,即当前地址下 Aptos 测试代币的余额
Rust
源码逻辑:rust SDK 的 get_account_resource 函数直接查询了 Aptos 测试代币所在的资源,并且读取了当前的值,即当前地址下 Aptos 测试代币的余额
第 4.5 步:转账
和 Step 4.4 一样,这是将 Aptos 代币从 Alice 的地址转移到 Bob 的地址另一个辅助步骤。对于正确生成的交易,API 将返回一个交易哈希值,可以在后续步骤中使用,以检查交易状态。Aptos 区块链在提交时执行了一些验证检查,如果其中任何一项失败,用户将得到一个错误的响应。这些验证包括交易签名,未使用的序列号,以及将交易提交给适当的链。
Typescript
源码逻辑:
transfer函数生成了一个交易的 payload 信息,并且让客户端签署,发送,最后等待交易发送的响应结果在
aptosClient中,generateSignSubmitTransaction函数做了以下的事情:我们一步步来看代码的逻辑:
transfer在内部是 Coin Move 模块 中的一个EntryFunction,即 Move 中的一个入口函数,可以直接调用。Move函数被存储在 coin 模块上:
0x1::coin。因为 coin 模块可以被其他 coin 使用,所以转移时必须明确指定要转移的 coin 类型。如果没有指定
coinType,则默认为0x1::aptos_coin::AptosCoin。
Python
源码逻辑:Python SDK 生成交易,签署并发送该交易,最后等待交易发送的响应结果。
我们一步步来看代码的逻辑:
transfer在内部是 Coin Move 模块 中的一个EntryFunction,即 Move 中的一个入口函数,可以直接调用。Move函数被存储在 coin 模块上。0x1::coin。
因为 coin 模块可以被其他 coin 使用,所以转账必须明确地使用
TypeTag来定义要对哪种 coin 进行转账。交易入参必须被放入带有类型指定器(
Serializer.{type})的TransactionArguments中,这将在交易生成时将入参序列化为适当的类型。
Rust
源码逻辑:Rust SDK 生成交易,签署并发送该交易,最后等待交易发送的响应结果。
我们一步步来看代码的逻辑:
首先,我们获取链的 ID,这是建立交易的有效 payload 所必需的。
transfer在内部是 Coin Move 模块 中的一个EntryFunction,即 Move 中的一个入口函数,可以直接调用。Move函数被存储在 coin 模块上。0x1::coin。
因为 coin 模块可以被其他 coin 使用,所以转账必须明确地使用
TypeTag来定义要对哪种 coin 进行转账。交易参数,如
to_account(目标账户地址)和amount(金额),必须被编码为 BCS,以便与TransactionBuilder一起使用。
第 4.6 步:等待交易结果
Typescript
在Typescript中,只要调用
coinClient.transfer就可以等待交易完成。一旦处理完毕(无论成功与否),该函数将返回Transaction对象,如果处理超时,则抛出一个错误。如果你想让它在交易没有成功提交时抛出错误,你可以在调用
transfer时 checkSuccess 设置为 true。Python
交易的哈希值可以用来查询该交易当前的执行状态,Python SDK 提供了等待当前交易哈希值对应交易输出最终执行结果的能力。
Rust
交易的哈希值可以用来查询该交易当前的执行状态,Rust SDK 提供了等待当前交易哈希值对应交易输出最终执行结果的能力。
Last updated