diff --git a/docs/zh/core-concepts/pdas.md b/docs/zh/core-concepts/pdas.md
index 40a202655..bbf669b62 100644
--- a/docs/zh/core-concepts/pdas.md
+++ b/docs/zh/core-concepts/pdas.md
@@ -83,6 +83,6 @@ PDA是Solana程序开发的重要构成要素。有了PDA,程序可以为账
在使用PDA编写程序时,经常会将这个bump[存储在这个账户本身的数据当中](https://github.com/solana-labs/solana-program-library/blob/78e29e9238e555967b9125799d7d420d7d12b959/token-swap/program/src/state.rs#L100)。
这种机制可以让开发者轻易的对PDA进行验证,而不用重新在指令参数当中传入这个值。
-## Other Resources
+## 其他材料
- [官方文档](https://docs.solana.com/developing/programming-model/calling-between-programs#program-derived-addresses)
-- [Understanding Program Derived Addresses](https://www.brianfriel.xyz/understanding-program-derived-addresses/)
+- [理解程序派生账户](https://www.brianfriel.xyz/understanding-program-derived-addresses/)
diff --git a/docs/zh/getting-started/installation.md b/docs/zh/getting-started/installation.md
index 095cf12ed..df17c9d6b 100644
--- a/docs/zh/getting-started/installation.md
+++ b/docs/zh/getting-started/installation.md
@@ -194,7 +194,7 @@ Active release directory: /home/solana/.local/share/solana/install/active_releas
Update successful
```
-根据不同的系统,安装包可能提示您
+根据不同的系统,安装包可能提示你
```bash
Please update your PATH environment variable to include the solana programs:
diff --git a/docs/zh/guides/account-maps.md b/docs/zh/guides/account-maps.md
index 302bd7d2b..4e76fe5b5 100644
--- a/docs/zh/guides/account-maps.md
+++ b/docs/zh/guides/account-maps.md
@@ -10,9 +10,9 @@ title: 账户映射
因此,将值存储在单独的账户中,以其地址作为检索值所需的键是有意义的。但这也带来了一些问题,比如:
-*上述地址很可能不是理想的键,你可能难以记住并检索所需的值。
+* 上述地址很可能不是理想的键,你可能难以记住并检索所需的值。
-*上述地址是不同Keypair的公钥,每个公钥(或地址)都有与之关联的私钥。如果需要,这个私钥将用于对不同的指令进行签名,这意味着我们需要在某个地方存储私钥,这绝对不是推荐的做法!
+* 上述地址是不同 **Keypair** 的公钥,每个公钥(或地址)都有与之关联的私钥。如果需要,这个私钥将用于对不同的指令进行签名,这意味着我们需要在某个地方存储私钥,这绝对不是推荐的做法!
这给许多Solana开发者带来了一个问题,即如何在他们的程序中实现类似`Map`的逻辑。让我们看看几种解决这个问题的方法。
@@ -20,17 +20,17 @@ title: 账户映射
PDA的全称是“程序派生地址” - [Program Derived Address][PDA],简而言之,它们是从一组种子和程序ID(或地址)派生出来的地址。
-PDAs的独特之处在于,这些地址不与任何私钥相关联。这是因为这些地址不位于ED25519曲线上。因此,只有派生此地址的程序可以使用提供的密钥和种子对指令进行签名。在这里了解更多信息。
+PDA的独特之处在于,这些地址不与任何私钥相关联。这是因为这些地址不位于ED25519曲线上。因此,只有派生此地址的程序可以使用提供的密钥和种子对指令进行签名。在[这里](CPI)了解更多信息。
-现在我们对PDAs有了一个概念,让我们使用它们来映射一些账户!我们以一个博客程序作为示例,演示如何实现这一点。
+现在我们对 PDA 有了一个概念,让我们使用它们来映射一些账户!我们以一个博客程序作为示例,演示如何实现这一点。
在这个博客程序中,我们希望每个`User`都拥有一个`Blog`。这个博客可以有任意数量的`Posts`。这意味着我们将每个用户映射到一个博客,每个帖子映射到某个博客。
简而言之,用户和他/她的博客之间是`1:1`的映射,而博客和其帖子之间是`1:N`的映射。
-对于`1:1`的映射,我们希望一个博客的地址仅从其用户派生,这样我们可以通过其权限(或用户)来检索博客。因此,博客的种子将包括其权限的密钥,可能还有一个前缀博客,作为类型标识符。
+对于`1:1`的映射,我们希望一个博客的地址仅从其用户派生,这样我们可以通过其权限(或用户)来检索博客。因此,博客的种子将包括其权限的密钥,可能还有一个前缀"blog",作为类型标识符。
-对于`1:N`的映射,我们希望每个帖子的地址不仅从它所关联的博客派生,还从另一个标识符派生,以区分博客中的多个帖子。在下面的示例中,每个帖子的地址是从博客的密钥、一个用于标识每个帖子的slug和一个前缀帖子派生出来的,作为类型标识符。
+对于`1:N`的映射,我们希望每个帖子的地址不仅从它所关联的博客派生,还从另一个标识符派生,以区分博客中的多个帖子。在下面的示例中,每个帖子的地址是从博客的密钥、一个用于标识每个帖子的slug和一个前缀 "post" 派生出来的,作为类型标识符。
代码如下所示:
@@ -96,9 +96,9 @@ PDAs的独特之处在于,这些地址不与任何私钥相关联。这是因
这种账户映射的方法并不理想,原因如下:
-*首先,你需要初始化存储`BTreeMap`的账户,然后才能向其中插入必要的键值对。然后,你还需要将这个账户的地址存储在某个地方,以便每次更新时进行更新。
+* 首先,你需要初始化存储`BTreeMap`的账户,然后才能向其中插入必要的键值对。然后,你还需要将这个账户的地址存储在某个地方,以便每次更新时进行更新。
-*账户存在内存限制,每个账户的最大大小为10兆字节,这限制了`BTreeMap`存储大量键值对的能力。
+* 账户存在内存限制,每个账户的最大空间大小为10兆字节,这限制了`BTreeMap`存储大量键值对的能力。
因此,在考虑你的用例后,可以按照以下方式实现这种方法:
diff --git a/docs/zh/guides/data-migration.md b/docs/zh/guides/data-migration.md
index 0514ac729..006f03a11 100644
--- a/docs/zh/guides/data-migration.md
+++ b/docs/zh/guides/data-migration.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 迁移程序的数据账户
- - meta
- name: description
- content: Fundamentally to version data in support of migration means to create a unique reference for a collection of data. This reference can take the form of a query, an ID, or also commonly a datetime identifier. Learn about Serialization and more Ingredients for your dish at The Solana cookbook.
+ content: 从根本上说,为支持迁移而对数据进行版本控制,就是为数据集合创建一个唯一的引用。这种参考可以采用查询、ID 或通常的日期时间标识符等形式。了解序列化和更多要素,请参阅 Solana 秘籍。
- - meta
- name: og:description
- content: Fundamentally to version data in support of migration means to create a unique reference for a collection of data. This reference can take the form of a query, an ID, or also commonly a datetime identifier. Learn about Serialization and more Ingredients for your dish at The Solana cookbook.
+ content: 从根本上说,为支持迁移而对数据进行版本控制,就是为数据集合创建一个唯一的引用。这种参考可以采用查询、ID 或通常的日期时间标识符等形式。了解序列化和更多要素,请参阅 Solana 秘籍。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -43,7 +43,7 @@ footer: MIT Licensed
当你创建一个程序时,与该程序关联的每个数据账户都将具有特定的数据结构。如果你需要升级一个程序派生账户,那么你将得到一堆具有旧结构的剩余程序派生账户。
-通过账户版本控制,您可以将旧账户升级到新的结构。
+通过账户版本控制,你可以将旧账户升级到新的结构。
:::tip 注意
这只是在程序拥有的账户(POA)中迁移数据的众多方法之一。
@@ -112,10 +112,10 @@ footer: MIT Licensed
| ID | Action |
| - | - |
-|1| Include a 'data version' field in your data. It can be a simple incrementing ordinal (e.g. u8) or something more sophisticated
-|2| Allocating enough space for data growth
-|3| Initializing a number of constants to be used across program versions
-|4| Add an update account function under `fn conversion_logic` for future upgrades
+|1| 在你的数据中包含 'data version' 字段. 它可以是一个简单的递增序号(如 u8),也可以是更复杂的东西
+|2| 为数据增长分配足够的空间
+|3| 初始化多个要跨程序版本使用的常量
+|4| 在 `fn conversion_logic` 下添加一个升级账户函数用于将来升级
假设我们现在希望升级程序的账户,包括一个新的必需字段:`somestring`字段。
@@ -145,13 +145,13 @@ footer: MIT Licensed
-| Line(s) | Note |
+| 行 | 备注 |
| ------- | - |
-| 6 | We've added Solana's `solana_program::borsh::try_from_slice_unchecked` to simplify reading subsets of data from the larger data block
-| 13-26| Here we've preserved the old content structure, `AccountContentOld` line 24, before extending the `AccountContentCurrent` starting in line 17.
-| 60 | We bump the `DATA_VERSION` constant
-| 71 | We now have a 'previous' version and we want to know it's size
-| 86 | The Coup de grâce is adding the plumbing to upgrade the previous content state to the new (current) content state
+| 6 | 我们添加了 Solana 的`solana_program::borsh::try_from_slice_unchecked`,以简化从较大数据块中读取数据子集的过程。
+| 13-26| 在这里,我们保留了旧的内容结构,即第 24 行中的 `AccountContentOld `,然后从第 17 行开始扩展了 `AccountContentCurrent `。
+| 60 | 使用 `DATA_VERSION` 常量
+| 71 | 我们现在有一个 '以前' 的版本,我们想知道它的大小
+| 86 | 重头戏是添加管道,将以前的内容状态升级为新(当前)内容状态
然后,我们更新指令,添加一个新的指令来更新`somestring`,并更新处理器来处理新的指令。请注意,"升级"数据结构是通过`pack/unpack`封装起来的。
@@ -175,6 +175,6 @@ footer: MIT Licensed
## 资料
-* [Borsh Specification](https://borsh.io/)
+* [Borsh 规范](https://borsh.io/)
* [Solana `try_from_slice_unchecked`](https://github.com/solana-labs/solana/blob/master/sdk/program/src/borsh.rs#L67)
-* [Reference Implementation](https://github.com/FrankC01/versioning-solana)
\ No newline at end of file
+* [Solana 数据版本控制实现](https://github.com/FrankC01/versioning-solana)
\ No newline at end of file
diff --git a/docs/zh/guides/debugging-solana-programs.md b/docs/zh/guides/debugging-solana-programs.md
index e14d98b39..922e95107 100644
--- a/docs/zh/guides/debugging-solana-programs.md
+++ b/docs/zh/guides/debugging-solana-programs.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 调试 Solana 程序
- - meta
- name: description
- content: There are a number of options and supporting tools for testing and debugging a Solana BPF program.
+ content: 有许多测试和调试 Solana BPF 程序的选项和辅助工具。
- - meta
- name: og:description
- content: There are a number of options and supporting tools for testing and debugging a Solana BPF program.
+ content: 有许多测试和调试 Solana BPF 程序的选项和辅助工具。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -44,9 +44,9 @@ footer: MIT Licensed
## 综述
::: tip 事实表
-- `solana-program-test` 包可以使用基本的本地运行时,在其中可以交互式地测试和调试程序(例如在 vscode 中)。
+- `solana-program-test` 包可以使用基本的本地运行时,在本地运行时中可以交互式地测试和调试程序(例如在 vscode 中)。
- `solana-validator` 包可以使用`solana-test-validator`实现进行更可靠的测试,该测试发生在本地验证器节点上。你可以从编辑器中运行,但是程序中的断点将被忽略。
-- CLI工具`solana-test-validator` 可以从命令行运行和加载你的程序,并处理来自命令行 Rust 应用程序或使用 web3 的 JavaScript/TypeScript 应用程序的事务执行。
+- CLI工具 `solana-test-validator` 可以从命令行运行和加载你的程序,并处理来自命令行 Rust 应用程序或使用 web3 的 JavaScript/TypeScript 应用程序的事务执行。
- 对于上述所有情况,建议在开始时大量使用`msg!`宏进行输出,然后在测试和确保行为稳定后将其移除。请记住,`msg!` 会消耗计算单位,如果达到计算单位的预算限制,最终可能导致程序失败。
:::
@@ -60,9 +60,9 @@ code .
打开文件 `src/lib.rs`
-你会看到该程序非常简单,基本上只是记录程序入口函数`process_instruction`接收到的内容。
+你会看到该程序非常简单,基本上只是记录程序入口函数 `process_instruction` 接收到的内容。
-1.转到 `#[cfg(test)]` 部分,并点击`Run Tests`。这将构建程序,然后执行 `async fn test_transaction()` 测试。你将在 `vscode` 终端中看到简化的日志消息。
+1. 转到 `#[cfg(test)]` 部分,并点击`Run Tests`。这将构建程序,然后执行 `async fn test_transaction()` 测试。你将在 `vscode` 终端中看到简化的日志消息。
```bash
running 1 test
"bpf_program_template" program loaded as native code
@@ -72,7 +72,7 @@ Program 4uQeVj5tqViQh7yWWGStvkEG1Zmhx6uasJtWCJziofM success
test test::test_transaction ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 33.41s
```
-2.在程序的第11行(`msg!`行)上设置一个断点。
+2. 在程序的第11行(`msg!`行)上设置一个断点。
3. 返回测试模块,点击`Debug`,几秒钟后调试器会在断点处停下,现在你可以检查数据、逐步执行函数等等。
这些测试也可以通过命令行运行:`cargo test` 或 `cargo test-bpf`。当然,任何断点都会被忽略。
@@ -98,9 +98,9 @@ test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; fini
6. 点击在 `test_validator_transaction()` 函数上方的 `Run Test`
-这将加载验证节点,然后允许您构建一个交易(按照 Rust 的方式),并使用`RpcClient`提交给节点。
+这将加载验证节点,然后允许你构建一个交易(按照 Rust 的方式),并使用`RpcClient`提交给节点。
-程序的输出也将打印在编辑器的终端中。例如(简化):
+程序的输出也将打印在编辑器的终端中。例如(简化过):
```bash
running 1 test
Waiting for fees to stabilize 1...
@@ -129,7 +129,7 @@ test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; fini
2. 运行`solana config set -ul`命令,将配置设置为指向本地
3. 运行`solana-test-validator --bpf-program target/deploy/bpf_program_template-keypair.json target/deploy/bpf_program_template.so`
4. 打开另一个终端并运行`solana logs`以启动日志流
-5. 然后,你可以运行客户端程序,并在您启动日志流的终端中观察程序输出
+5. 然后,你可以运行客户端程序,并在你启动日志流的终端中观察程序输出
那可真是太棒了!
diff --git a/docs/zh/guides/feature-parity-testing.md b/docs/zh/guides/feature-parity-testing.md
index ac39530bf..849e5e9b6 100644
--- a/docs/zh/guides/feature-parity-testing.md
+++ b/docs/zh/guides/feature-parity-testing.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 功能相等测试
- - meta
- name: description
- content: Features vary by Solana cluster. Feature testing ensures predictable results.
+ content: 功能因 Solana 集群而异。功能测试可确保可预测的结果。
- - meta
- name: og:description
- content: Features vary by Solana cluster. Feature testing ensures predictable results.
+ content: 功能因 Solana 集群而异。功能测试可确保可预测的结果。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -45,7 +45,7 @@ footer: MIT Licensed
::: tip 事实表
- 功能是为 Solana 验证节点引入的能力,需要激活才能使用。
-- 某个集群(例如测试网)中可能激活了某些特性,而另一个集群(例如主网测试网)则未激活。
+- 某个集群(例如测试网 testnet )中可能激活了某些特性,而另一个集群(例如mainnet-beta网)则未激活。
- 然而,在本地运行默认的`solana-test-validator`时,你的 Solana 版本中的所有可用功能都会自动激活。结果是,在本地测试时,特性和测试结果可能与在不同集群中部署和运行时不同!
:::
@@ -69,15 +69,15 @@ footer: MIT Licensed
天哪!如果你不知道这一点,你可能会感到沮丧,因为你的指令行为没有任何变化会导致这种情况。在开发网络上它正常工作,但在本地却失败了?!?
-你可以增加整体交易预算,比如将其增加到 300,000 计算单元(CU),来保持你的理智,但这也展示了为什么以功能相等的方式进行测试是避免任何混淆的积极方式。
+你可以增加整体交易预算,比如将其增加到 300,000 计算单元(CU),来保证正常运行,但这也展示了为什么以功能相等的方式进行测试是避免任何困惑的积极方式。
## 功能状态
使用`solana feature status`命令可以很容易地检查特定集群启用了哪些功能。
```console
-solana feature status -ud // Displays by feature status for devnet
-solana feature status -ut // Displays for testnet
-solana feature status -um // Displays for mainnet-beta
-solana feature status -ul // Displays for local, requires running solana-test-validator
+solana feature status -ud // 显示 devnet网 功能状态
+solana feature status -ut // 显示 testnet网 功能状态
+solana feature status -um // 显示 mainnet-beta网 功能状态
+solana feature status -ul // 显示本地验证节点 功能状态,需要运行 solana-test-validator
```
或者,你可以使用类似的工具,像 [scfsd](#resources),观察所有集群上的功能状态。该工具会显示如下的部分屏幕内容,并且不需要`solana-test-validator`运行:
@@ -119,9 +119,9 @@ Program log: process_instruction: PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc: 0
Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc consumed 12843 of 187157 compute units
Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success[
```
-因为我们的功能“事务整体计算容量”默认情况下是自动激活的,我们观察到每个指令从起始事务预算的 200,000 CU 中消耗 CU。
+因为功能“事务整体计算容量”默认情况下是自动激活的,我们观察到每个指令从起始事务预算的 200,000 CU 中消耗 CU。
-### 选择性功能已停用
+### 选择性停用功能
1. 在这次运行中,我们希望使 CU 预算的行为与 devnet 中运行的行为保持一致。使用 Feature Status 中描述的工具,我们可以找到`transaction wide compute cap`的公钥,并在测试验证器启动时使用 `--deactivate-feature` 参数。
```console
@@ -145,7 +145,7 @@ Program PWDnx8LkjJUn9bAVzG6Fp6BuvB41x7DkBZdo9YLMGcc success
solana-test-validator --deactivate-feature PUBKEY_1 --deactivate-feature PUBKEY_2 ...
```
-或者,scfsd](#resources) 提供了一个命令开关,用于输出集群的完整停用功能集,可以直接用于`solana-test-validator`的启动参数:
+或者,[scfsd](#resources) 提供了一个命令开关,用于输出集群的完整停用功能集,可以直接用于`solana-test-validator`的启动参数:
```console
solana-test-validator -l ./.ledger $(scfsd -c devnet -k -t)
```
@@ -155,7 +155,7 @@ solana-test-validator -l ./.ledger $(scfsd -c devnet -k -t)
## 以编程方式进行全面相等性测试
对于那些在测试代码中控制运行测试验证器的人来说,可以使用`TestValidatorGenesis`来修改测试验证器的激活/停用功能。在 Solana 1.9.6 中,验证器构建器添加了一个函数来支持这个功能。
-在您的程序文件夹的根目录下,创建一个名为`tests`的新文件夹,并添加一个`parity_test.rs`文件。以下是每个测试使用的基本函数(模板函数):
+在你的程序文件夹的根目录下,创建一个名为`tests`的新文件夹,并添加一个`parity_test.rs`文件。以下是每个测试使用的基本函数(模板函数):
diff --git a/docs/zh/guides/get-program-accounts.md b/docs/zh/guides/get-program-accounts.md
index 2411821cc..9094cde15 100644
--- a/docs/zh/guides/get-program-accounts.md
+++ b/docs/zh/guides/get-program-accounts.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 获取程序帐户
- - meta
- name: description
- content: Learn how to query data on Solana using getProgramAccounts and accountsDB
+ content: 学习在 Solana 上如何使用 getProgramAccounts 和 accountsDB 查询数据。
- - meta
- name: og:description
- content: Learn how to query data on Solana using getProgramAccounts and accountsDB
+ content: 学习在 Solana 上如何使用 getProgramAccounts 和 accountsDB 查询数据。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -42,6 +42,7 @@ head:
## 综述
+### 参数
::: tip 参数
- `programId`: `string` - 要查询的程序的公钥,以base58编码的字符串形式提供。
@@ -58,7 +59,7 @@ head:
- `dataSize`: `number` - 将账户数据的长度与提供的数据大小进行比较
- (可选) `withContext`: `boolean` - 将结果包装在一个 [RpcResponse JSON object](https://docs.solana.com/developing/clients/jsonrpc-api#rpcresponse-structure)
-##### 响应
+### 响应
默认情况下,`getProgramAccounts`将返回一个具有以下结构的 JSON 对象数组:
@@ -76,20 +77,20 @@ head:
`getProgramAccounts` 是一个多功能的RPC方法,用于返回由程序拥有的所有账户。我们可以利用`getProgramAccounts`进行许多有用的查询,例如查找:
- 特定钱包的所有代币账户
-- 特定代币发行的所有代币账户(即所有[SRM](https://www.projectserum.com/)持有人)
-- 特定程序的所有自定义账户(即所有[Mango](https://mango.markets/)用户)
+- 特定代币发行的所有代币账户(如所有[SRM](https://www.projectserum.com/)持有人)
+- 特定程序的所有自定义账户(如所有[Mango](https://mango.markets/)用户)
尽管`getProgramAccounts`非常有用,但由于目前的限制,它经常被误解。许多由`getProgramAccounts`支持的查询需要RPC节点扫描大量数据。这些扫描需要大量的内存和资源。因此,调用过于频繁或范围过大可能导致连接超时。此外,在撰写本文时,`getProgramAccounts`端点不支持分页。如果查询结果太大,响应将被截断。
为了解决当前的限制,`getProgramAccounts`提供了一些有用的参数,包括`dataSlice`和`filters`选项的`memcmp`和`dataSize`。通过提供这些参数的组合,我们可以将查询范围缩小到可管理和可预测的大小。
-`getProgramAccounts`的一个常见示例涉及与[SPL-Token Program](https://spl.solana.com/token) 程序交互。仅使用基本调用请求由Token程序拥有的所有账户将涉及大量的数据。然而,通过提供参数,我们可以高效地请求我们要使用的数据。
+`getProgramAccounts`的一个常见示例是与[SPL-Token Program](https://spl.solana.com/token) 程序交互。仅使用基本调用请求查询由Token程序拥有的所有账户将涉及大量的数据。然而,通过提供参数,我们可以高效地请求到要使用的数据。
-### `filters`
-与`getProgramAccounts`一起使用的最常见参数是`filters`数组。该数组接受两种类型的过滤器,即`dataSize`和`memcmp`。在使用这些过滤器之前,我们应该熟悉我们请求的数据的布局和序列化方式。
+### 参数 `filters`
+与`getProgramAccounts`一起使用的最常见参数是`filters`数组。该数组接受两种类型的过滤器,即`dataSize`和`memcmp`。在使用这些过滤器之前,我们应该熟悉请求的数据的布局和序列化方式。
-#### `dataSize`
-在Token程序的情况下,我们可以看到[代币账户的长度为165个字节](https://github.com/solana-labs/solana-program-library/blob/08d9999f997a8bf38719679be9d572f119d0d960/token/program/src/state.rs#L86-L106)。 具体而言,一个代币账户有八个不同的字段,每个字段需要一定数量的字节。我们可以使用下面的示例图来可视化这些数据的布局。
+#### `dataSize`
+如果是 Token Program ,我们可以看到[代币账户的长度为165个字节](https://github.com/solana-labs/solana-program-library/blob/08d9999f997a8bf38719679be9d572f119d0d960/token/program/src/state.rs#L86-L106)。 具体而言,一个代币账户有八个不同的字段,每个字段需要一定数量的字节。我们可以使用下面的示例图来可视化这些数据的布局。

@@ -164,6 +165,6 @@ head:
## 其他资料
-- [RPC API Documentation](https://docs.solana.com/developing/clients/jsonrpc-api#getprogramaccounts)
-- [Web3js Documentation](https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getProgramAccounts)
-- [JSON-parsed Web3js Documentation](https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getParsedProgramAccounts)
+- [RPC API 文档](https://docs.solana.com/developing/clients/jsonrpc-api#getprogramaccounts)
+- [Web3js 文档](https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getProgramAccounts)
+- [JSON-parsed Web3js 文档](https://solana-labs.github.io/solana-web3.js/classes/Connection.html#getParsedProgramAccounts)
diff --git a/docs/zh/guides/retrying-transactions.md b/docs/zh/guides/retrying-transactions.md
index e70819b92..4f2f89950 100644
--- a/docs/zh/guides/retrying-transactions.md
+++ b/docs/zh/guides/retrying-transactions.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 重试交易
- - meta
- name: description
- content: On some occasions, a seemingly valid transaction may be dropped before it is included in a block. To combat this, application developers are able to develop their own custom rebroadcasting logic. Learn about retrying transactions and more at The Solana cookbook.
+ content: 在某些情况下,一个看似有效的交易可能会在被纳入区块之前就被丢弃。为了应对这种情况,应用程序开发人员可以开发自己的自定义重试交易逻辑。有关重试事务和更多信息,请参阅Solana秘籍。
- - meta
- name: og:description
- content: On some occasions, a seemingly valid transaction may be dropped before it is included in a block. To combat this, application developers are able to develop their own custom rebroadcasting logic. Learn about retrying transactions and more at The Solana cookbook.
+ content: 在某些情况下,一个看似有效的交易可能会在被纳入区块之前就被丢弃。为了应对这种情况,应用程序开发人员可以开发自己的自定义重试交易逻辑。有关重试事务和更多信息,请参阅Solana秘籍。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -46,7 +46,7 @@ footer: MIT Licensed
::: tip 事实表
- RPC节点将尝试使用通用算法重新广播交易
- 应用程序开发人员可以实现自定义的重新广播逻辑
-- 开发人员应该利用`sendTransaction` JSON-RPC方法中的`maxRetries`参数
+- 开发人员应该利用 `sendTransaction` JSON-RPC方法中的`maxRetries`参数
- 开发人员应该启用预检查,以便在提交交易之前引发错误
- 在重新签署任何交易之前,**非常重要**的是确保初始交易的块哈希已过期
:::
@@ -67,14 +67,14 @@ footer: MIT Licensed
当RPC节点通过`sendTransaction`接收到一个交易后,它会将交易转换为[UDP](https://en.wikipedia.org/wiki/User_Datagram_Protocol) 数据包,然后将其转发给相关的领导。UDP允许验证节点之间快速通信,但不提供关于交易传递的任何保证。
-因为Solana的领导节点调度在每个[纪元](https://docs.solana.com/terminology#epoch) (大约2天)之前就已知,所以RPC节点会直接将其交易广播给当前和下一个领导节点。这与其他流言协议(如以太坊)随机广播和广泛传播整个网络的交易的方式形成对比。默认情况下,RPC节点会每两秒尝试将交易转发给领导节点,直到交易被确认或交易的块哈希过期(在本文撰写时为150个区块或约1分钟19秒)。如果待重新广播的队列大小超过[10,000 transactions](https://github.com/solana-labs/solana/blob/bfbbc53dac93b3a5c6be9b4b65f679fdb13e41d9/send-transaction-service/src/send_transaction_service.rs#L20) 个交易,则新提交的交易将被丢弃。RPC运营商可以调整命令行[参数](https://github.com/solana-labs/solana/blob/bfbbc53dac93b3a5c6be9b4b65f679fdb13e41d9/validator/src/main.rs#L1172) 以更改此重试逻辑的默认行为。
+因为Solana的领导节点调度在每个[纪元](https://docs.solana.com/terminology#epoch) (大约2天)之前就已知,所以RPC节点会直接将其交易广播给当前和下一个领导节点。这与其他流言协议(如以太坊)随机广播和广泛传播整个网络的交易的方式形成对比。默认情况下,RPC节点会每两秒尝试将交易转发给领导节点,直到交易被确认或交易的块哈希过期(在本文撰写时为150个区块或约1分钟19秒)。如果待重新广播的队列大小超过[10,000 交易](https://github.com/solana-labs/solana/blob/bfbbc53dac93b3a5c6be9b4b65f679fdb13e41d9/send-transaction-service/src/send_transaction_service.rs#L20) 个交易,则新提交的交易将被丢弃。RPC运营商可以调整命令行[参数](https://github.com/solana-labs/solana/blob/bfbbc53dac93b3a5c6be9b4b65f679fdb13e41d9/validator/src/main.rs#L1172) 以更改此重试逻辑的默认行为。
当RPC节点广播一个交易时,它会尝试将交易转发给领导节点的交易处理单元(TPU)。TPU将交易处理分为五个不同的阶段:
-- [Fetch Stage](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/fetch_stage.rs#L21)
-- [SigVerify Stage](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/tpu.rs#L91)
-- [Banking Stage](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/banking_stage.rs#L249)
+- [Fetch 阶段](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/fetch_stage.rs#L21)
+- [SigVerify 阶段](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/tpu.rs#L91)
+- [Banking 阶段](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/banking_stage.rs#L249)
- [Proof of History Service](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/poh/src/poh_service.rs)
-- [Broadcast Stage](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/tpu.rs#L136)
+- [Broadcast 阶段](https://github.com/solana-labs/solana/blob/cd6f931223181d5a1d47cba64e857785a175a760/core/src/tpu.rs#L136)

Image Courtesy of Jito Labs
@@ -92,13 +92,13 @@ footer: MIT Licensed
### 在交易被处理之前
-如果网络丢弃一个交易,通常是在交易被领导处理之前发生。UDP [数据包丢失](https://en.wikipedia.org/wiki/Packet_loss) 是可能发生这种情况的最简单原因。在网络负载高峰期,验证节点可能会被大量需要处理的交易压倒。虽然验证节点可以通过 `tpu_forwards`,端口转发多余的交易,但[转发](https://github.com/solana-labs/solana/blob/master/core/src/banking_stage.rs#L389). 的数据量是有限的。此外,每个转发仅限于验证节点之间的单一跳跃。也就是说,通过`tpu_forwards`端口接收的交易不会被转发给其他验证节点。
+如果网络丢弃一个交易,通常是在交易被领导处理之前发生。UDP [数据包丢失](https://en.wikipedia.org/wiki/Packet_loss) 是可能发生这种情况的最简单原因。在网络负载高峰期,验证节点可能会被大量需要处理的交易压倒。虽然验证节点可以通过 `tpu_forwards`,端口转发多余的交易,但[转发](https://github.com/solana-labs/solana/blob/master/core/src/banking_stage.rs#L389). 的数据量是有限的。此外,每个转发仅限于验证节点之间的单跳。也就是说,通过`tpu_forwards`端口接收的交易不会被转发给其他验证节点。
-还有两个较少为人知的原因,可能导致交易在被处理之前被丢弃。第一种情况涉及通过RPC池提交的交易。偶尔,RPC池的一部分可能会领先于其他部分。当池中的节点需要共同工作时,这可能会导致问题。在这个例子中,交易的[recentBlockhash](https://docs.solana.com/developing/programming-model/transactions#recent-blockhash) 从池中的先进部分(后端A)查询。当交易提交到滞后的池中(后端B)时,节点将无法识别先进的块哈希并丢弃交易。如果开发人员在`sendTransaction`中启用了[preflight checks](https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction), 可以在提交交易时检测到此问题。
+还有两个较少为人知的原因,可能导致交易在被处理之前被丢弃。第一种情况涉及通过RPC池提交的交易。偶尔,RPC池的一部分可能会领先于其他部分。当池中的节点需要共同工作时,这可能会导致问题。在这个例子中,交易的[recentBlockhash](https://docs.solana.com/developing/programming-model/transactions#recent-blockhash) 从池中的先进部分(后端A)查询。当交易提交到滞后的池中(后端B)时,节点将无法识别先进的块哈希并丢弃交易。如果开发人员在`sendTransaction`中启用了[preflight checks](https://docs.solana.com/developing/clients/jsonrpc-api#sendtransaction),可以在提交交易时检测到此问题。

-网络分叉也可能暂时的导致交易丢失。如果验证在银行阶段重新播放其块的速度较慢,可能会创建一个少数派分叉。当客户端构建一个交易时,交易可能引用仅存在于少数派分叉上的`recentBlockhash`。在提交交易后,集群可能在交易被处理之前切换到其他分叉。在这种情况下,由于找不到块哈希,交易被丢弃。
+网络分叉也可能暂时的导致交易丢失。如果验证在Banking阶段重新播放其块的速度较慢,可能会创建一个少数派分叉。当客户端构建一个交易时,交易可能引用仅存在于少数派分叉上的`recentBlockhash`。在提交交易后,集群可能在交易被处理之前切换到其他分叉。在这种情况下,由于找不到块哈希,交易被丢弃。

@@ -121,7 +121,7 @@ footer: MIT Licensed
- `transaction`: `string` - 完全签名的交易,以编码字符串形式表示
- (可选) `configuration object`: `object`
- `skipPreflight`: `boolean` - 如果为 true,则跳过预检事务检查(默认为 false)
- - (可选) `preflightCommitment`: `string` - 用于针对银行插槽进行预检模拟的[承诺](https://docs.solana.com/developing/clients/jsonrpc-api#configuring-state-commitment) 级别(默认为"finalized")
+ - (可选) `preflightCommitment`: `string` - 用于针对库存(bank)插槽进行预检模拟的[承诺](https://docs.solana.com/developing/clients/jsonrpc-api#configuring-state-commitment) 级别(默认为"finalized")
- (可选) `encoding`: `string` - 用于交易数据的编码方式。可以选择 "base58"(较慢)或 "base64"(默认为 "base58")
- (可选) `maxRetries`: `usize` - RPC节点重试将交易发送给领导者的最大次数。如果未提供此参数,RPC节点将重试交易,直到交易最终确定或块哈希过期为止
@@ -164,7 +164,7 @@ footer: MIT Licensed
- 验证所有签名是否有效
- 检查引用的块哈希是否在最近的150个块内
-- 针对预检查的`preFlightCommitment`,模拟交易与银行槽位之间的交互
+- 针对预检查的`preFlightCommitment`,模拟交易与库存槽位之间的交互
如果其中任何一个预检查失败,`sendTransaction`将在提交交易之前引发错误。预检查常常能够防止交易丢失,并使客户端能够优雅地处理错误。为了确保这些常见错误得到考虑,建议开发人员将skipPreflight设置为false。
diff --git a/docs/zh/guides/serialization.md b/docs/zh/guides/serialization.md
index 033e2b8f4..8d8a44efb 100644
--- a/docs/zh/guides/serialization.md
+++ b/docs/zh/guides/serialization.md
@@ -1,18 +1,18 @@
---
-title: 序列数据
+title: 序列化数据
head:
- - meta
- name: title
- content: Solana秘籍 | 序列数据
+ content: Solana秘籍 | 序列化数据
- - meta
- name: og:title
- content: Solana秘籍 | 序列数据
+ content: Solana秘籍 | 序列化数据
- - meta
- name: description
- content: Learn how to serialize and deserialize data on Solana
+ content: 学习 Solana 如何进行序列化与反序列化
- - meta
- name: og:description
- content: Learn how to serialize and deserialize data on Solana
+ content: 学习 Solana 如何进行序列化与反序列化
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -37,7 +37,7 @@ head:
footer: MIT Licensed
---
-# 序列数据
+# 序列化数据
当我们谈论序列化时,我们指的是数据的序列化和反序列化。
@@ -83,11 +83,11 @@ footer: MIT Licensed
-## 如何序列化客户端上的指令数据
+## 如何在客户端上序列化指令数据
-如果你要将出站指令数据序列化并发送给程序,它必须与程序反序列化入站指令数据的方式保持一致。
+如果你要将出站指令(outbound instruction)数据序列化并发送给程序,它必须与程序反序列化入站指令(inbound instruction)数据的方式保持一致。
在此模板中,指令数据块是一个包含序列化数组的数据块,例如:
@@ -98,7 +98,7 @@ footer: MIT Licensed
| Transfer (2) | "foo" | not applicable for instruction |
| Burn (2) | "foo" | not applicable for instruction |
-在下面的示例中,我们假设程序拥有的账户已经初始化完成。
+在下面的示例中,我们假设程序拥有账户已经初始化完成。
@@ -145,11 +145,11 @@ footer: MIT Licensed
关于 [Pack][1] trait
-可以更容易地隐藏账户数据序列化/反序列化的细节,使你的核心程序指令处理代码更简洁。因此,不需要将所有的序列化/反序列化逻辑放在程序处理代码中,而是将这些细节封装在以下三个函数中:
+Pack trait 可以更容易地隐藏账户数据序列化/反序列化的细节,使你的核心程序指令处理代码更简洁。因此,不需要将所有的序列化/反序列化逻辑放在程序处理代码中,而是将这些细节封装在以下三个函数中:
1. `unpack_unchecked` - 允许你对账户进行反序列化,而无需检查它是否已被初始化。当实际处理初始化函数(变体索引为0)时,这非常有用。
2. `unpack` - 调用你的Pack实现的`unpack_from_slice`函数,并检查账户是否已被初始化。
-3. `pack` - 调用您的Pack实现的`pack_into_slice`函数。
+3. `pack` - 调用你的Pack实现的`pack_into_slice`函数。
下面是我们示例程序的Pack trait实现。随后是使用Borsh进行账户数据处理的示例。
@@ -168,7 +168,7 @@ footer: MIT Licensed
1. `sol_template_shared::pack_into_slice` - 进行序列化的地方
2. `sol_template_shared::unpack_from_slice` - 进行反序列化的地方
-**请关注** 在下面的示例中,我们在`BTREE_LENGTH`的数据布局中的`BTREE_STORAGE`之前有一个`u32`(4字节)的分区。这是因为在反序列化过程中,borsh会检查您正在反序列化的切片的长度是否与它实际读取的数据量一致,然后才进行对象的重组。下面演示的方法首先读取`BTREE_LENGTH`,以获取要从`BTREE_STORAGE`指针中`slice`的大小。
+**请关注** 在下面的示例中,我们在`BTREE_LENGTH`的数据布局中的`BTREE_STORAGE`之前有一个`u32`(4字节)的分区。这是因为在反序列化过程中,borsh会检查你正在反序列化的切片的长度是否与它实际读取的数据量一致,然后才进行对象的重组。下面演示的方法首先读取`BTREE_LENGTH`,以获取要从`BTREE_STORAGE`指针中`slice` 的大小。
@@ -232,7 +232,7 @@ footer: MIT Licensed
## Solana TS/JS 常用映射
-[Borsh Specification](#resources)中包含了大多数基本和复合数据类型的映射关系。
+[Borsh 规范](#resources)中包含了大多数基本和复合数据类型的映射关系。
在TS/JS和Python中,关键是创建一个具有适当定义的Borsh模式,以便序列化和反序列化可以生成或遍历相应的输入。
@@ -280,10 +280,10 @@ footer: MIT Licensed
## 资料
-- [Borsh Specification](https://borsh.io/)
+- [Borsh 规范](https://borsh.io/)
- [Rust Borsh](https://github.com/near/borsh-rs)
- [TS/JS Borsh](https://github.com/near/borsh-js)
- [Python Borsh](https://github.com/near/borsh-construct-py)
-- [Python Borsh Documentation](https://near.github.io/borsh-construct-py/)
+- [Python Borsh 文档](https://near.github.io/borsh-construct-py/)
- [Solana CLI Program Template2](https://github.com/hashblock/solana-cli-program-template)
diff --git a/docs/zh/guides/versioned-transactions.md b/docs/zh/guides/versioned-transactions.md
index 1f1afe031..c56b09652 100644
--- a/docs/zh/guides/versioned-transactions.md
+++ b/docs/zh/guides/versioned-transactions.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍| Versioned Transactions
- - meta
- name: description
- content: New and improved transaction format on Solana.
+ content: Solana 新的和改进过的交易格式。
- - meta
- name: og:description
- content: New and improved transaction format on Solana.
+ content: Solana 新的和改进过的交易格式。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -48,7 +48,7 @@ Solana最近发布了版本化交易。提议的更改如下:
## 综述
::: tip 事实表
--传统交易存在一个主要问题:最大允许的大小为1232字节,因此原子交易中可以容纳的账户数量为35个地址。
+- 传统交易存在一个主要问题:最大允许的大小为1232字节,因此原子交易中可以容纳的账户数量为35个地址。
- 地址查找表(LUTs):一旦账户存储在该表中,可以使用1字节的u8索引,在交易消息中引用该表的地址。
- 可以使用`solana/web3.js`的`createLookupTable()`构建一个新的查找表,并确定其地址。
- 一旦创建了LUT,可以进行扩展,即可以将账户追加到表中。
@@ -69,12 +69,12 @@ Solana网络使用最大事务单元(MTU)大小为1280字节,遵循[IPv6 M

-::: tip Compact-Array format
+::: tip 紧凑数组格式
-A compact array is an array serialised to have the following components:
+紧凑数组是一个序列化过的数组,它具有以下组件:
-1. An array length in a multi-byte encoding called [Compact-u16](https://beta.docs.solana.com/developing/programming-model/transactions#compact-u16-format)
-2. Followed by each array item
+1. 称为 [Compact-u16](https://beta.docs.solana.com/developing/programming-model/transactions#compact-u16-format) 的多字节编码的数组长度
+2. 接着是每个数组元素

:::
@@ -173,7 +173,7 @@ pub enum VersionedMessage {
新的MessageV0的结构基本上是相同的,只是有两个小但重要的变化:
1. **消息头部**:与传统版本相同,没有变化。
-2. **紧凑账户密钥数组**:与传统版本相同,没有变化。我们将指向该数组元素的索引数组表示为*索引数组A*(您很快将看到为什么我们这样表示)。
+2. **紧凑账户密钥数组**:与传统版本相同,没有变化。我们将指向该数组元素的索引数组表示为*索引数组A*(你很快将看到为什么我们这样表示)。
3. **最近的区块哈希**:与传统版本相同,没有变化。
4. **紧凑指令数组**:与传统版本不同,发生了变化。
5. **地址表查找的紧凑数组**:在版本0中引入。
diff --git a/docs/zh/references/accounts.md b/docs/zh/references/accounts.md
index 0c66bf374..8a73c4bec 100644
--- a/docs/zh/references/accounts.md
+++ b/docs/zh/references/accounts.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 账户资料
- - meta
- name: description
- content: Learn more about accounts on Solana and how to use them in your programs.
+ content: 了解 Solan 账户概念,以及在程序中如何使用账户。
- - meta
- name: og:description
- content: Learn more about accounts on Solana and how to use them in your programs.
+ content: 了解 Solan 账户概念,以及在程序中如何使用账户。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -102,7 +102,7 @@ footer: MIT Licensed
## 如何使用种子创建账户
-你可以使用 `createAccountWithSeed` 方法来管理您的账户,而无需创建大量不同的密钥对。
+你可以使用 `createAccountWithSeed` 方法来管理你的账户,而无需创建大量不同的密钥对。
### 生成
@@ -214,7 +214,7 @@ footer: MIT Licensed
### 生成一个PDA
-`findProgramAddress`会在你的种子末尾添加一个额外的字节。它从255递减到0,并返回第一个不在ed25519曲线上的公钥。如果您传入相同的程序ID和种子,您将始终获得相同的结果。
+`findProgramAddress`会在你的种子末尾添加一个额外的字节。它从255递减到0,并返回第一个不在ed25519曲线上的公钥。如果你传入相同的程序ID和种子,你将始终获得相同的结果。
@@ -280,7 +280,7 @@ footer: MIT Licensed
PDAs只能在程序内部进行签名。以下是使用PDA进行签名的程序示例,并使用客户端调用该程序的示例。
-### 程序
+### 程序(program)
以下示例展示了一个单个指令,用于从由种子`escrow`派生的 PDA 转账 SOL 到指定的账户。使用 `invoke_signed` 函数来使用 PDA 签名。
diff --git a/docs/zh/references/basic-transactions.md b/docs/zh/references/basic-transactions.md
index 2ae791264..85a320bea 100644
--- a/docs/zh/references/basic-transactions.md
+++ b/docs/zh/references/basic-transactions.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 发送交易
- - meta
- name: description
- content: Learn Basic Transactions like Sending SOL, SPL-Tokens, Calculating Transaction Cost, and more references for Building on Solana at The Solana cookbook.
+ content: 了解基本交易,如发送 SOL、SPL-Tokens、计算交易成本,以及更多如何在在 Solana 上构建,请参阅 Solana 秘籍。
- - meta
- name: og:description
- content: Learn Basic Transactions like Sending SOL, SPL-Tokens, Calculating Transaction Cost, and more references for Building on Solana at The Solana cookbook.
+ content: 了解基本交易,如发送 SOL、SPL-Tokens、计算交易成本,以及更多如何在在 Solana 上构建,请参阅 Solana 秘籍。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -115,7 +115,7 @@ head:
[1]: https://docs.solana.com/developing/runtime-facilities/programs#system-program
-## 如何发送SPL-代币
+## 如何发送 SPL-Token(SPL代币)
使用 [Token Program][1] 来转移SPL代币。为了发送SPL代币,你需要知道它的SPL代币账户地址。你可以使用以下示例来获取地址并发送代币。
@@ -170,7 +170,7 @@ head:
交易所需的签名数量用于计算交易成本。只要你不是创建账户,这将是最终的交易成本。如果想了解创建账户的成本,请参考 [计算租金豁免](accounts.md#calculating-rent-exemption)
-下面的两个示例展示了目前可用于计算估计交易成本的两种方法。
+下面的两个示例展示了目前可用于估算交易成本的两种方法。
第一个示例使用了`Transaction`类上的新方法`getEstimatedFee`,而第二个示例使用了`Connection`类上的`getFeeForMessage`来替代`getFeeCalculatorForBlockhash`。
@@ -263,11 +263,11 @@ head:
## 如何更改交易的计算预算、费用和优先级
-交易(TX)的优先级是通过支付优先级费用(Prioritization Fee)来实现的,此外还需要支付基本费用(Base Fee)。默认情况下,计算预算是200,000个计算单元(Compute Units,CU)与指令数的乘积,最大为1.4M CU。基本费用是5,000个Lamport。一个微型Lamport等于0.000001个Lamport。
+交易(TX)的优先级是通过支付优先级费用(Prioritization Fee)来实现的,此外还需要支付基本费用(Base Fee)。默认情况下,计算预算是200,000个计算单元(Compute Units,CU)与指令数的乘积,最大为1.4M CU。基本费用是5,000个Lamport。一个microLamport 等于 0.000001 个Lamport。
要更改单个交易的总计算预算或优先级费用,可以通过添加ComputeBudgetProgram的指令来实现。
-使用`ComputeBudgetProgram.setComputeUnitPrice({ microLamports: number })`可以在基本费用(5,000个Lamport)之上添加优先级费用。microLamports参数提供的值将与计算预算的CU数相乘,以确定优先级费用(以Lamport为单位)。例如,如果您的计算预算为1M CU,然后添加1个microLamport/CU,优先级费用将为1个Lamport(1M * 0.000001)。总费用将为5001个Lamport。
+使用`ComputeBudgetProgram.setComputeUnitPrice({ microLamports: number })`可以在基本费用(5,000 个Lamport)之上添加优先级费用。microLamports参数提供的值将与计算预算的CU数相乘,以确定优先级费用(以Lamport为单位)。例如,如果你的计算预算为1M CU,然后添加1个microLamport/CU,优先级费用将为1个Lamport(1M * 0.000001)。总费用将为5001个Lamport。
使用`ComputeBudgetProgram.setComputeUnitLimit({ units: number })`来设置新的计算预算。提供的值将替换默认值。交易应该请求执行所需的最小数量的CU,以最大化吞吐量或最小化费用。
diff --git a/docs/zh/references/keypairs-and-wallets.md b/docs/zh/references/keypairs-and-wallets.md
index ffbf837b7..a12bc47fc 100644
--- a/docs/zh/references/keypairs-and-wallets.md
+++ b/docs/zh/references/keypairs-and-wallets.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 密钥对和钱包
- - meta
- name: description
- content: Learn about Keypairs and Wallets, Signing and Verifying Messages and more references for Building on Solana at The Solana cookbook.
+ content: 了解密钥对和钱包,签名和验证消息,更多如何在Solana上构建,参考 Solana 秘籍
- - meta
- name: og:description
- content: Learn about Keypairs and Wallets, Signing and Verifying Messages and more references for Building on Solana at The Solana cookbook.
+ content: 了解密钥对和钱包,签名和验证消息,更多如何在Solana上构建,参考 Solana 秘籍
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -39,7 +39,7 @@ footer: MIT Licensed
# 密钥对和钱包
-## 如何生成新的密钥对
+## 如何生成新的密钥对(Keypair)
对于使用Solana库执行各种操作,许多操作都需要一个密钥对或钱包。如果你正在连接到一个钱包,那么你不必担心。然而,如果你需要一个密钥对,你会需要生成一个。
@@ -130,7 +130,7 @@ footer: MIT Licensed
如果你已经有了密钥,你可以通过这个密钥获取密钥对,以测试你的dApp。
-1. 从字节中:
+1. 通过字节(Bytes)获取:
@@ -215,7 +215,7 @@ footer: MIT Licensed
-2. 从Base58字符串:
+2. 通过 Base58 字符串:
@@ -569,7 +569,7 @@ footer: MIT Licensed
注意: 自定义地址中字符的数量越多,生成时间将会更长。
::: 警告
-在此任务中,您应该使用命令行界面(CLI)。Python和TypeScript的示例仅用于说明,速度比CLI慢得多。
+在此任务中,你应该使用命令行界面(CLI)。Python和TypeScript的示例仅用于说明,速度比CLI慢得多。
:::
@@ -684,9 +684,9 @@ footer: MIT Licensed
## 如何连接到钱包
-Solana的[钱包适配器](https://github.com/solana-labs/wallet-adapter) 库使客户端管理钱包连接变得简单。
+Solana 的[钱包适配器](https://github.com/solana-labs/wallet-adapter) 库使客户端管理钱包连接变得简单。
-### 反应
+### React
运行以下命令来安装所需的依赖项:
@@ -694,7 +694,7 @@ Solana的[钱包适配器](https://github.com/solana-labs/wallet-adapter) 库使
yarn add @solana/wallet-adapter-react @solana/wallet-adapter-react-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets
```
-React的钱包适配器库允许我们通过钩子和上下文提供程序来持久化和访问钱包连接状态,主要包括`useWallet、WalletProvider`、`useConnection和ConnectionProvider`。`WalletProvider`和`ConnectionProvider`必须包装React应用程。
+React的钱包适配器库允许我们通过钩子(Hook)和上下文提供者(providers)来持久化和访问钱包连接状态,主要包括`useWallet、WalletProvider`、`useConnection` 和`ConnectionProvider`。React App 必须要用 `WalletProvider`和`ConnectionProvider` 包装。
此外,我们可以使用`useWalletModal`来提示用户进行连接,通过切换连接模态框的可见性,并将应用程序包装在`@solana/wallet-adapter-react-ui`中的`WalletModalProvider`中。连接模态框将处理连接流程,因此我们只需监听钱包连接的状态。当`useWallet`的响应具有非空的`wallet`属性时,我们知道钱包已连接。反之,如果该属性为空,我们知道钱包已断开连接。
@@ -754,7 +754,7 @@ npm install solana-wallets-vue @solana/wallet-adapter-wallets
npm install @svelte-on-solana/wallet-adapter-core @svelte-on-solana/wallet-adapter-ui @solana/wallet-adapter-base @solana/wallet-adapter-wallets @solana/web3.js
```
-[Svelte Wallet Adapter](https://github.com/svelte-on-solana/wallet-adapter) 包允许我们在使用Svelte模板或SvelteKit创建的项目中,在所有JS、TS或/和Svelte文件之间添加一个可访问的Svelte Store(`$walletStore`)。使用 [此处](https://github.com/svelte-on-solana/wallet-adapter/blob/master/packages/core/README.md/) 的存储库引用,您可以在SSR或SPA中使用适配器。UI包含一个``组件,允许用户选择一个钱包并连接到它。
+[Svelte Wallet Adapter](https://github.com/svelte-on-solana/wallet-adapter) 包允许我们在使用Svelte模板或SvelteKit创建的项目中,在所有JS、TS或/和Svelte文件之间添加一个可访问的Svelte Store(`$walletStore`)。使用 [此处](https://github.com/svelte-on-solana/wallet-adapter/blob/master/packages/core/README.md/) 的代码库引用,你可以在SSR或SPA中使用适配器。UI包含一个``组件,允许用户选择一个钱包并连接到它。
diff --git a/docs/zh/references/local-development.md b/docs/zh/references/local-development.md
index c2e01f940..9887e41c5 100644
--- a/docs/zh/references/local-development.md
+++ b/docs/zh/references/local-development.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 本地开发
- - meta
- name: description
- content: Setup Local Validator for local developer environment and Airdrop SOL. Learn about Local Development and more references for Building on Solana at The Solana cookbook.
+ content: 为本地开发环境和空投 SOL 设置本地验证器。有关本地开发和在 Solana 上构建的更多参考信息,请参阅Solana 秘籍
- - meta
- name: og:description
- content: Setup Local Validator and Airdrop SOL for building on Solana Locally. Learn about Local Development and more references for Building on Solana at The Solana cookbook.
+ content: 为本地开发环境和空投 SOL 设置本地验证器。有关本地开发和在 Solana 上构建的更多参考信息,请参阅Solana 秘籍
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -53,7 +53,7 @@ solana-test-validator
使用本地测试验证器的好处包括:
- 无RPC速率限制
-- 无空投限制
+- 无空投数量限制
- 直接在链上部署程序(`--bpf-program ...`)
- 从公共集群克隆账户,包括程序(`--clone ...`)
- 可配置的事务历史保留(`--limit-ledger-size ...`)
@@ -234,9 +234,9 @@ solana-test-validator
Websockets提供了一种发布/订阅接口,你可以在其中监听特定的事件。与在固定时间间隔内对典型的HTTP端点进行轮询以获取频繁的更新不同,你可以仅在事件发生时才接收这些更新。
-Solana的web3[`连接`](https://solana-labs.github.io/solana-web3.js/classes/Connection.html) 在底层生成一个websocket端点,并在创建新的`Connection`实例时注册一个websocket客户端(请参阅 [此处](https://github.com/solana-labs/solana-web3.js/blob/45923ca00e4cc1ed079d8e55ecbee83e5b4dc174/src/connection.ts#L2100)) 的源代码)。
+Solana 的 web3 [`Connection`](https://solana-labs.github.io/solana-web3.js/classes/Connection.html) 在底层生成一个websocket端点,并在创建新的`Connection`实例时注册一个websocket客户端(请参阅 [此处](https://github.com/solana-labs/solana-web3.js/blob/45923ca00e4cc1ed079d8e55ecbee83e5b4dc174/src/connection.ts#L2100)) 的源代码)。
-`Connection`类提供了发布/订阅方法,它们都以`on`开头,类似于事件发射器。当您调用这些监听器方法时,它会在该`Connection`实例的websocket客户端中注册一个新的订阅。下面我们使用的示例发布/订阅方法是[`onAccountChange`](https://solana-labs.github.io/solana-web3.js/classes/Connection.html#onAccountChange)。 回调函数将通过参数提供更新的状态数据(例如,查看A[`AccountChangeCallback`](https://solana-labs.github.io/solana-web3.js/modules.html#AccountChangeCallback) 作为示例)。
+`Connection`类提供了发布/订阅方法,它们都以`on`开头,类似于事件发射器。当你调用这些监听器方法时,它会在该`Connection`实例的websocket客户端中注册一个新的订阅。下面我们使用的示例发布/订阅方法是[`onAccountChange`](https://solana-labs.github.io/solana-web3.js/classes/Connection.html#onAccountChange)。 回调函数将通过参数提供更新的状态数据(例如,查看A[`AccountChangeCallback`](https://solana-labs.github.io/solana-web3.js/modules.html#AccountChangeCallback) 作为示例)。
@@ -386,12 +386,12 @@ Solana的web3[`连接`](https://solana-labs.github.io/solana-web3.js/classes/Con
-## 使用主网 (Mainnet) 账户和程序
+## 使用主网(Mainnet) 账户和程序
-本地测试通常依赖于仅在主网上可用的程序和账户。Solana CLI 提供了以下两个功能:
+有时,本地测试会依赖于仅在主网上可用的程序和账户。Solana CLI 提供了以下两个功能:
-*下载程序和账户
-*将程序和账户加载到本地验证器中
+* 下载程序和账户
+* 将程序和账户加载到本地验证器中
### 如何从主网加载账户
diff --git a/docs/zh/references/name-service.md b/docs/zh/references/name-service.md
index e5cbf8827..93fc05fc8 100644
--- a/docs/zh/references/name-service.md
+++ b/docs/zh/references/name-service.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 命名服务
- - meta
- name: description
- content: The name registry stores information about the domain name. Learn about Resolving SOL domains, Reverse/Subdomain look up, more about Name Service and references at The Solana cookbook.
+ content: 名称注册表存储有关域名的信息。有关 SOL 域名解析、反向/子域查询、名称服务的更多信息和参考资料,请参阅Solana秘籍。
- - meta
- name: og:description
- content: The name registry stores information about the domain name. Learn about Resolving SOL domains, Reverse, Subdomain look up, more about Name Service and references at The Solana cookbook.
+ content: 名称注册表存储有关域名的信息。有关 SOL 域名解析、反向/子域查询、名称服务的更多信息和参考资料,请参阅Solana秘籍。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -117,8 +117,8 @@ footer: MIT Licensed
为了解析一个子域名,你需要:
-1. 域名的密钥
-2. 域名的密钥
+1. 知道父域名的Key
+2. 知道子域名的Key
3. 检索账户信息
@@ -140,7 +140,7 @@ footer: MIT Licensed
-## 查找由公钥拥有的所有域名
+## 查找公钥拥有的所有域名
你可以通过使用带有`memcmp`过滤器的`getProgramAccounts`请求来检索钱包的所有域名。
diff --git a/docs/zh/references/nfts.md b/docs/zh/references/nfts.md
index df9ab6fdb..315bd7c28 100644
--- a/docs/zh/references/nfts.md
+++ b/docs/zh/references/nfts.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 非同质化代币 (NFTs)
- - meta
- name: description
- content: Learn how to get NFT metadata, get NFT owners, mint NFTs on Solana, and more
+ content: 了解如何获取 NFT 元数据、获取 NFT 所有者、在 Solana 上铸造 NFT 等
- - meta
- name: og:description
- content: Learn how to get NFT metadata, get NFT owners, mint NFTs on Solana, and more
+ content: 了解如何获取 NFT 元数据、获取 NFT 所有者、在 Solana 上铸造 NFT 等
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -43,9 +43,9 @@ footer: MIT Licensed
要创建一个 NFT,你需要:
-1. 将图像上传到像 Arweave 这样的 IPFS 网络上。
-2. 将 JSON 元数据上传到像 Arweave 这样的 IPFS 网络上。
-3. 调用 Metaplex 创建一个用于该 NFT 的账户。
+1. 将图像上传到像 Arweave 或 IPFS 这样的去中心化存储网络上。
+2. 将 JSON 元数据上传到像 Arweave 或 IPFS 网络上。
+3. 调用 Metaplex 去创建一个用于该 NFT 的账户。
### 上传到 Arweave
@@ -80,9 +80,9 @@ footer: MIT Licensed
-### 铸造(Mint)该 NFT
+### 铸造(Mint)NFT
-如果你已经上传了图像和元数据,您可以使用以下代码铸造(Mint)该 NFT。
+如果你已经上传了图像和元数据,你可以使用以下代码铸造(Mint)该 NFT。
@@ -103,12 +103,12 @@ footer: MIT Licensed
::: tip 注意
-你不能使用与你钱包不同的创作者信息来铸造(Mint) NFT。如果遇到创作者的问题,请确保你的元数据中将你列为创作者。
+你不能使用与创作者信息不同的钱包来铸造(Mint) NFT。如果遇到创作者的问题,请确保你的元数据中将你列为创作者。
:::
## 如何获取 NFT 元数据
-Metaplex 的 NFT 元数据存储在 Arweave 上。为了获取 Arweave 的元数据,您需要获取 Metaplex PDA(程序派生账户)并对账户数据进行解码。
+Metaplex 的 NFT 元数据存储在 Arweave 上。为了获取 Arweave 的元数据,你需要获取 Metaplex PDA(程序派生账户)并对账户数据进行解码。
@@ -229,9 +229,9 @@ Metaplex 的 NFT 元数据存储在 Arweave 上。为了获取 Arweave 的元数
## Candy Machine v2
-Metaplex JS SDK 现在支持通过代码创建和更新Candy Machine v2。它使开发者能够与糖果机v2 程序进行交互,创建、更新和删除Candy Machine,并从中铸造(Mint) NFT。
+Metaplex JS SDK 现在支持通过代码创建和更新Candy Machine v2。它使开发者能够与 Candy Machine v2 程序进行交互,创建、更新和删除Candy Machine,并从中铸造(Mint) NFT。
-### 如何创建Candy Machine
+### 如何创建 Candy Machine
@@ -363,7 +363,7 @@ Metaplex JS SDK 现在支持通过代码创建和更新Candy Machine v2。它使
-### 如何将物品插入到Candy Machine
+### 如何将项目插入到Candy Machine
diff --git a/docs/zh/references/offline-transactions.md b/docs/zh/references/offline-transactions.md
index 505cd3e0e..4740b8b77 100644
--- a/docs/zh/references/offline-transactions.md
+++ b/docs/zh/references/offline-transactions.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 发送离线交易
- - meta
- name: description
- content: After signing the Offline Transaction, anyone can broadcast it on the network. Learn more about Sending Offline Transactions and references at The Solana cookbook.
+ content: 签署离线交易后,任何人都可以在网络上广播该交易。有关发送离线交易的更多信息和参考资料,请参阅Solana秘籍。
- - meta
- name: og:description
- content: After signing the Offline Transaction, anyone can broadcast it on the network. Learn more about Sending Offline Transactions and references at The Solana cookbook.
+ content: 签署离线交易后,任何人都可以在网络上广播该交易。有关发送离线交易的更多信息和参考资料,请参阅Solana秘籍。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -63,15 +63,15 @@ footer: MIT Licensed
## 部分签署交易
-当一个交易需要多个签名时,你可以部分签署它。其他签署者随后可以签署并在网络上广播该交易。
+当一个交易需要多个签名时,你可以分别签署它。其他签署者随后可以签署并在网络上广播该交易。
-以下是一些有用的情况示例:
+以下是一些有用的示例:
-- 用支付作为交换发送 SPL 代币
+- 发送 SPL 代币用来进行支付
- 签署交易以便以后验证其真实性
- 在需要你签名的自定义程序中调用交易
-在这个例子中,Bob给Alice发送了一个 SPL 代币,回报Alice的付款:
+在这个例子中,Bob 给 Alice 发送了一个 SPL 代币,回报Alice的付款:
diff --git a/docs/zh/references/programs.md b/docs/zh/references/programs.md
index a24c49a9f..daf68d65e 100644
--- a/docs/zh/references/programs.md
+++ b/docs/zh/references/programs.md
@@ -9,10 +9,10 @@ head:
content: Solana密集 | Solana程序资料
- - meta
- name: description
- content: Learn how to write programs on Solana, with references on cross program invocation, reading accounts, and more
+ content: 了解如何在 Solana 上编写程序,及跨程序调用、读取账户等内容
- - meta
- name: og:description
- content: Learn how to write programs on Solana, with references on cross program invocation, reading accounts, and more
+ content: 了解如何在 Solana 上编写程序,及跨程序调用、读取账户等内容
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -59,7 +59,7 @@ head:
1. 将`SYSVAR_CLOCK_PUBKEY`作为指令的参数传入。
2. 在指令内部直接访问时钟。
-了解这两种方法会对你有好处,因为一些传统的程序仍然将SYSVAR_CLOCK_PUBKEY作为一个账户来使用。
+了解这两种方法会对你有好处,因为一些传统的程序仍然将 `SYSVAR_CLOCK_PUBKEY` 作为一个账户来使用。
### 在指令中将时钟作为一个账户传递
@@ -167,9 +167,9 @@ head:
-## 跨程序调用的方法
+## 如何跨程序调用
-跨程序调用,简单来说,就是在我们的程序中调用另一个程序的指令。一个很好的例子是`Uniswap`的`swap`功能。`UniswapV2Router`合约调用必要的逻辑进行交换,并调用`ERC20`合约的transfer函数将代币从一个人转移到另一个人。同样的方式,我们可以调用程序的指令来实现多种目的。
+跨程序调用,简单来说,就是在我们的程序中调用另一个程序的指令。一个很好的例子是`Uniswap`的`swap`功能。`UniswapV2Router`合约调用必要的逻辑进行兑换,并调用`ERC20`合约的transfer函数将代币从一个人转移到另一个人。同样的方式,我们可以调用程序的指令来实现多种目的。
让我们来看看我们的第一个例子,即`SPL Token Program`的`transfer`指令。进行转账所需的账户包括:
@@ -216,9 +216,9 @@ head:
-现在让我们来看另一个例子,即`System Program`的`create_account`指令。这里与上面提到的指令有一点不同。在上述例子中,我们不需要在`invoke`函数中将`token_program`作为账户之一传递。然而,在某些情况下,您需要传递调用指令的`program_id`。在我们的例子中,它将是`System Program`的`program_id`("11111111111111111111111111111111")。所以现在所需的账户包括:
+现在让我们来看另一个例子,即`System Program`的`create_account`指令。这里与上面提到的指令有一点不同。在上述例子中,我们不需要在`invoke`函数中将`token_program`作为账户之一传递。然而,在某些情况下,你需要传递调用指令的`program_id`。在我们的例子中,它将是`System Program`的`program_id`("11111111111111111111111111111111")。所以现在所需的账户包括:
-1. 负责支付租金的支付账户
+1. 负责支付租金的支付账户
2. 将要创建的账户
3. 系统程序(System Program)账户
@@ -262,7 +262,7 @@ head:
## 如何创建PDA
-程序派生地址(Program Derived Address,PDA)是程序拥有的账户,但没有私钥。相反,它的签名是通过一组种子和一个阻碍值(一个确保其不在曲线上的随机数)获取的。"生成"程序地址与"创建"它是不同的。可以使用`Pubkey::find_program_address`来生成PDA。创建PDA实质上意味着初始化该地址的空间并将其状态设置为初始状态。普通的密钥对账户可以在我们的程序之外创建,然后将其用于初始化PDA的状态。不幸的是,对于PDA来说,它必须在链上创建,因为它本身无法代表自己进行签名。因此,我们使用`invoke_signed`来传递PDA的种子,以及资金账户的签名,从而实现了PDA的账户创建。
+程序派生地址(Program Derived Address,PDA)是程序拥有的账户,但没有私钥。相反,它的签名是通过一组种子和一个跳跃值(一个确保其不在曲线上的随机数)获取的。"生成(Generating)"程序地址与"创建(creating)"它是不同的。可以使用`Pubkey::find_program_address`来生成 PDA。创建 PDA 实质上意味着初始化该地址的空间并将其状态设置为初始状态。普通的密钥对账户可以在我们的程序之外创建,然后将其用于初始化PDA的状态。不幸的是,对于PDA来说,它必须在链上创建,因为它本身无法代表自己进行签名。因此,我们使用`invoke_signed`来传递PDA的种子,以及资金账户的签名,从而实现了PDA的账户创建。
diff --git a/docs/zh/references/staking.md b/docs/zh/references/staking.md
index 44ca0220f..93b686199 100644
--- a/docs/zh/references/staking.md
+++ b/docs/zh/references/staking.md
@@ -9,10 +9,10 @@ head:
content: Solana秘籍 | 质押
- - meta
- name: description
- content: stake SOL and earn rewards for helping secure the network.
+ content: 质押 SOL,帮助保护网络安全并获得奖励。
- - meta
- name: og:description
- content: Stake SOL and earn rewards for helping secure the network. Learn more about Creating Stake Accounts, Delegate Stake, Withdraw Stake and more references for Building on Solana at The Solana cookbook.
+ content: 质押 SOL,帮助保护网络安全并获得奖励。了解更多有关创建质押账户、委托质押、提取质押以及在 Solana 上构建,更多参考Solana秘籍。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -146,7 +146,7 @@ footer: MIT Licensed
-## 提取质押
+## 赎回质押
一旦停用了,`Withdrawal Authority`可以将 SOL 提取回系统账户。一旦质押账户不再委托并且余额为 0 SOL,它将被销毁了。
diff --git a/docs/zh/references/token.md b/docs/zh/references/token.md
index 726e94221..47172c678 100644
--- a/docs/zh/references/token.md
+++ b/docs/zh/references/token.md
@@ -1,18 +1,18 @@
---
-title: 与代币互动
+title: 与代币交互
head:
- - meta
- name: title
- content: Solana秘籍 | 与代币互动
+ content: Solana秘籍 | 与代币交互
- - meta
- name: og:title
- content: Solana秘籍 | 与代币互动
+ content: Solana秘籍 | 与代币交互
- - meta
- name: description
- content: Learn how to use, transfer, and more with tokens on Solana
+ content: 了解如何在 Solana 上使用、转移代币及更多。
- - meta
- name: og:description
- content: Learn how to use, transfer, and more with tokens on Solana
+ content: 了解如何在 Solana 上使用、转移代币及更多。
- - meta
- name: og:image
content: https://solanacookbook.com/cookbook-sharing-card.png
@@ -37,11 +37,11 @@ head:
footer: MIT Licensed
---
-# 代币
+# 代币(Token)
## 我需要什么才能开始使用SPL代币?
-每当你在Solana上与代币进行交互时,实际上你正在与Solana程序库代币(SPL-Token)或SPL代币标准交互。SPL代币标准需要使用特定的库,你可以根据你使用的编程语言在下面找到相应的库。
+每当你在Solana上与代币进行交互时,实际上你正在与Solana程序库代币(Solana Program Library Token)或SPL代币标准交互。SPL代币标准需要使用特定的库,你可以根据你使用的编程语言在下面找到相应的库。
@@ -55,7 +55,7 @@ footer: MIT Licensed
## 如何创建一个新的代币
-创建代币是通过创建所谓的“铸币账户”来完成的。这个铸币账户随后用于向用户的代币账户铸造代币。
+创建代币是通过创建所谓的“铸币账户(mint account)”来完成的。这个铸币账户随后用于向用户的代币账户(token account)铸造代币。
@@ -147,7 +147,7 @@ footer: MIT Licensed
## 如何获得一个代币账户的余额
-每个代币账户都包含有关代币的信息,例如所有者、铸币账户、数量(余额)和小数位数。
+每个代币账户有代币的余额,可以通过单词调用获取
@@ -184,8 +184,8 @@ footer: MIT Licensed
-::: 贴士
-一个代币账户只能持有一种铸币。当您指定一个代币账户时,您也需要指定一个铸币。
+::: tip
+一个代币账户只能持有一种铸币(mint)。当你指定一个代币账户时,你也需要指定一个铸币(mint)。
:::
## 如何铸造(mint)代币
@@ -232,7 +232,7 @@ footer: MIT Licensed
-## 如何销代币
+## 如何销毁代币
如果你是代币的所有者,你可以销毁代币。
@@ -309,9 +309,9 @@ footer: MIT Licensed
-## 如何批准代币委托
+## 如何授权代币委托
-你可以设置一个委托代理,并指定一个允许的代币数量。设置后,委托代理就像代币账户的另一个所有者。一个代币账户在同一时间只能委托给一个账户。
+你可以授权一个委托代理,并指定委托的代币数量。授权后,委托代理就像代币账户的另一个所有者。一个代币账户在同一时间只能委托给一个账户。