Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add some zh translation and reivew zh translation #554

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/zh/core-concepts/pdas.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/)
2 changes: 1 addition & 1 deletion docs/zh/getting-started/installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
16 changes: 8 additions & 8 deletions docs/zh/guides/account-maps.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,27 +10,27 @@ title: 账户映射

因此,将值存储在单独的账户中,以其地址作为检索值所需的键是有意义的。但这也带来了一些问题,比如:

*上述地址很可能不是理想的键,你可能难以记住并检索所需的值。
* 上述地址很可能不是理想的键,你可能难以记住并检索所需的值。

*上述地址是不同Keypair的公钥,每个公钥(或地址)都有与之关联的私钥。如果需要,这个私钥将用于对不同的指令进行签名,这意味着我们需要在某个地方存储私钥,这绝对不是推荐的做法!
* 上述地址是不同 **Keypair** 的公钥,每个公钥(或地址)都有与之关联的私钥。如果需要,这个私钥将用于对不同的指令进行签名,这意味着我们需要在某个地方存储私钥,这绝对不是推荐的做法!

这给许多Solana开发者带来了一个问题,即如何在他们的程序中实现类似`Map`的逻辑。让我们看看几种解决这个问题的方法。

## 派生PDA

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" 派生出来的,作为类型标识符。

代码如下所示:

Expand Down Expand Up @@ -96,9 +96,9 @@ PDAs的独特之处在于,这些地址不与任何私钥相关联。这是因

这种账户映射的方法并不理想,原因如下:

*首先,你需要初始化存储`BTreeMap`的账户,然后才能向其中插入必要的键值对。然后,你还需要将这个账户的地址存储在某个地方,以便每次更新时进行更新。
* 首先,你需要初始化存储`BTreeMap`的账户,然后才能向其中插入必要的键值对。然后,你还需要将这个账户的地址存储在某个地方,以便每次更新时进行更新。

*账户存在内存限制,每个账户的最大大小为10兆字节,这限制了`BTreeMap`存储大量键值对的能力。
* 账户存在内存限制,每个账户的最大空间大小为10兆字节,这限制了`BTreeMap`存储大量键值对的能力。

因此,在考虑你的用例后,可以按照以下方式实现这种方法:

Expand Down
30 changes: 15 additions & 15 deletions docs/zh/guides/data-migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -43,7 +43,7 @@ footer: MIT Licensed

当你创建一个程序时,与该程序关联的每个数据账户都将具有特定的数据结构。如果你需要升级一个程序派生账户,那么你将得到一堆具有旧结构的剩余程序派生账户。

通过账户版本控制,您可以将旧账户升级到新的结构
通过账户版本控制,你可以将旧账户升级到新的结构

:::tip 注意
这只是在程序拥有的账户(POA)中迁移数据的众多方法之一。
Expand Down Expand Up @@ -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`字段。

Expand Down Expand Up @@ -145,13 +145,13 @@ footer: MIT Licensed
</SolanaCodeGroupItem>
</SolanaCodeGroup>

| 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`封装起来的。

Expand All @@ -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)
* [Solana 数据版本控制实现](https://github.com/FrankC01/versioning-solana)
20 changes: 10 additions & 10 deletions docs/zh/guides/debugging-solana-programs.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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!` 会消耗计算单位,如果达到计算单位的预算限制,最终可能导致程序失败。
:::

Expand All @@ -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
Expand All @@ -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`。当然,任何断点都会被忽略。
Expand All @@ -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...
Expand Down Expand Up @@ -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. 然后,你可以运行客户端程序,并在你启动日志流的终端中观察程序输出

那可真是太棒了!

Expand Down
24 changes: 12 additions & 12 deletions docs/zh/guides/feature-parity-testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -45,7 +45,7 @@ footer: MIT Licensed

::: tip 事实表
- 功能是为 Solana 验证节点引入的能力,需要激活才能使用。
- 某个集群(例如测试网)中可能激活了某些特性,而另一个集群(例如主网测试网)则未激活。
- 某个集群(例如测试网 testnet )中可能激活了某些特性,而另一个集群(例如mainnet-beta网)则未激活。
- 然而,在本地运行默认的`solana-test-validator`时,你的 Solana 版本中的所有可用功能都会自动激活。结果是,在本地测试时,特性和测试结果可能与在不同集群中部署和运行时不同!
:::

Expand All @@ -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`运行:
Expand Down Expand Up @@ -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
Expand All @@ -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)
```
Expand All @@ -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`文件。以下是每个测试使用的基本函数(模板函数):
<SolanaCodeGroup>
<SolanaCodeGroupItem title="Test Boiler Plate" active>

Expand Down
Loading