Skip to content

Commit

Permalink
co-learn-3
Browse files Browse the repository at this point in the history
  • Loading branch information
v1xingyue committed Sep 10, 2024
2 parents 1f537a1 + ed4ff62 commit b1265c0
Show file tree
Hide file tree
Showing 12 changed files with 3,329 additions and 0 deletions.
21 changes: 21 additions & 0 deletions SECURITY.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Security Policy

## Supported Versions

Use this section to tell people about which versions of your project are
currently being supported with security updates.

| Version | Supported |
| ------- | ------------------ |
| 5.1.x | :white_check_mark: |
| 5.0.x | :x: |
| 4.0.x | :white_check_mark: |
| < 4.0 | :x: |

## Reporting a Vulnerability

Use this section to tell people how to report a vulnerability.

Tell them where to go, how often they can expect to get an update on a
reported vulnerability, what to expect if the vulnerability is accepted or
declined, etc.
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
## 欢迎来到 Solana 教程!

这里是开发者学习Web3和区块链的最佳起点!

## 什么是Web 3?

在传统系统中,人们通过第三方平台进行相互交互:

* 用户账户存储在像谷歌、X(前称Twitter)和Meta(Facebook、Instagram)这样的大型平台上。这些账户可能会被公司随意移除,账户中的物品也可能永久丢失。

* 存储价值的账户,如支付卡、银行账户和交易账户,由信用卡公司、货币转账机构和股票交易所这样的大型平台处理。这些公司通常会从平台上的每一笔交易中抽取一部分费用(大约1%到3%)。他们经常为了组织的利益而延缓交易结算。在某些情况下,转移的物品可能根本不属于接收者,而是代表接收者持有。

Web3是互联网的一次演进,允许人们直接进行交易:

* 用户拥有自己的账户,由他们的钱包代表。

* 价值转移可以直接在用户之间发生。

* 代表货币、数字艺术、活动门票、房地产或其他物品的代币,完全由用户掌管。

Web3的常见用途包括:

* 在线销售商品和服务,几乎零费用且即时结算。

* 销售数字或实体物品,确保每件物品都是真品,且原件与副本可区分。

* 即时全球支付,无需耗时耗资的“货币转账”公司。

## 什么是Solana?

Solana是第一个可扩展的Layer 1区块链。

与比特币和以太坊等老平台相比,Solana具有:

* 显著更快的速度 - 大多数交易在一两秒内完成。

* 极低的费用 - 交易费用(在老网络中称为“燃气费”)通常仅为$0.000025(是的,远低于一分钱),无论转移的价值多少。

* 高度去中心化,拥有任何权益证明(PoS)网络中最高的中本聪系数(Nakamoto coefficient,一种去中心化评分)。

由于老区块链的高成本和慢速度,许多在Solana上的常见用例只能在Solana上实现。

## 在这个课程中,您将学到什么?

在本课程中,您将:

* 创建允许人们使用Web3钱包登录的Web应用程序。
* 在人们之间转移代币(如USDC,一种代表美元的代币)。 学习将诸如Solana pay之类的工具集成到您现有的应用程序中。
* 构建一个实时运行在Solana区块链上的电影评论应用程序。
* 您将构建Web前端和后端(链上)程序及数据库。
* 铸造大规模NFT系列。

以及更多,随着新技术加入Solana生态系统,我们将会持续更新此课程,您会在这里找到后续的课程。

## 在开始之前我需要什么?

您不需要之前的区块链经验就可以跟随这个课程!

Linux、Mac或Windows电脑。Windows机器应安装Windows Terminal和WSL。 基础的JavaScript/TypeScript编程经验。我们还会使用一些Rust,但我们会随时解释Rust。 安装了node.js 18 安装了Rust 基本的命令行使用

## 这个课程是如何构建的?

课程分为三个部分:

1. dApp开发 - 构建与流行的链上Solana程序交互的Web和移动应用程序。这些涵盖了代币转移、铸造以及为任意程序创建客户端等内容。如果您想在应用程序中添加区块链支付、NFT、区块链溯源等,这是开始的最佳轨道。

2. 链上程序开发 - 创建在区块链上运行的自定义应用程序。如果您想制作新的金融或会计应用程序、使用来自Solana以外的数据链上,或使用区块链存储任意数据,那么这个轨道适合您。

3. 网络基础设施 - 涵盖运行Solana本身,作为RPC或验证者。 模块覆盖特定主题。这些分解为个别课程。

每节课开始时都会列出课程目标 - 即您将在课程中学到的内容。

然后有一个简短的“TL;DR”,这样您可以快速浏览,了解课程内容,并决定这节课是否适合您。

然后每节课分为三个部分:

1. 正文 - 包括解释性文本、示例和代码片段。您无需跟随这里显示的任何示例进行编码。目标只是简单阅读并初步接触课程主题。

2. 实验 - 您绝对应该跟着做的实践项目。这是您第二次接触内容,也是您第一次深入并尝试做事的机会。

3. 挑战 - 另一个项目,只有几个简单的提示,您应该独立完成。

## 我如何有效使用这个课程?

这里的课程非常有效,但每个人的背景和能力不同,无法全部概括。

考虑到这一点,这里有三个建议,帮助您最大限度地利用本课程:

1. 诚实面对自己 - 这听起来可能有点模糊,但诚实面对自己对于掌握某个主题至关重要。阅读一件东西并想“是的,我懂了”很容易,但稍后你可能会意识到你实际上并没有懂。在学习每节课时都要诚实面对自己。如果需要,请不要犹豫重复部分课程,或者在课程措辞不适合您时进行外部研究。

2. 完成每个实验室和挑战 - 这支持第一点。当你让自己尝试做某事时,欺骗自己有多了解某件事是相当困难的。完成每个实验室和每个挑战,以测试你的水平,并根据需要重复它们。我们为所有内容提供解决方案代码,但请确保将其作为有用的资源而不是依赖。

3. 做到卓越 - 这听起来老套,但不要仅仅停留在实验和挑战要求你做的事情上。请你发挥创造力!拿起项目,让它们成为你自己的。超越它们。你练习得越多,就越擅长。

好的,那我们开始吧!
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# 简介

* 密钥对是一对相匹配的公钥和私钥。

- 公钥用作指向Solana网络上账户的“地址”。公钥可以与任何人共享。
- 私钥用于验证对账户的控制权。顾名思义,您应该始终保密私钥。

* `@solana/web3.js` 提供了用于创建全新密钥对的辅助函数,或者使用现有的私钥构建密钥对。

# 正文

### 对称加密和非对称加密

「密码学」字面上是指隐藏信息的研究。我们常常会遇到两种主要类型的密码学:

#### 对称加密

对称加密中,加密和解密使用同一个密钥。它有几百年的历史,从古埃及人到伊丽莎白一世女王都曾使用。

对称加密算法有很多种,目前常见的对称加密算法有AES和Chacha20。

#### 非对称加密

非对称加密,也称为「公钥密码学」,发展于20世纪70年代。在非对称加密中,参与者拥有一对密钥(或密钥对)。每个密钥对包括一个私钥和一个公钥。

非对称加密与对称加密的工作方式不同,用处也不同:

- 加密:如果用公钥加密,只有同一密钥对的私钥才能读取它。
- 签名:如果用私钥加密,可以使用同一密钥对的公钥证明私钥持有者进行了签名。

* 您甚至可以使用非对称密码学来确定用于对称密码学的好密钥!这被称为密钥交换,您可以使用您的公钥和收件人的公钥来想出一个'会话'密钥。

对称加密算法也有很多种,目前最常见的非对称加密算法是ECC或RSA的变种。

非对称加密非常流行:

- 您的银行卡内部有一个私钥,用于签署交易。
- 您的银行可以通过匹配的公钥确认您进行了交易。
- 网站在其证书中包含一个公钥,您的浏览器将使用此公钥加密发送到网页的数据(如个人信息、登录详情和信用卡号)。
- 网站拥有匹配的私钥,因此网站可以读取数据。
- 您的电子护照由发行国签署,以确保护照不被伪造。
- 电子护照闸门可以使用您的发行国的公钥来确认这一点。
- 您手机上的消息应用使用密钥交换来生成会话密钥。

总之,密码学无处不在。Solana以及其他区块链只是密码学的一种用途。

### Solana使用公钥作为地址。

![Solana wallet addresses](https://www.soldev.app/assets/wallet-addresses.svg)

### 在Solana网络中的参与者

参与Solana网络的人至少拥有一个密钥对。在Solana中:

- 公钥用作指向Solana网络上账户的“地址”。即使是人们易读的文件名 - 如`example.sol` - 也指向像`dDCQNnDmNbFVi8cQhKAgXhyhXeJ625tvwsunRyRc7c8`这样的地址。
- 私钥用于验证对该密钥对的控制权。如果您拥有某个地址的私钥,您就控制该地址内的代币。因此,正如「私钥」这个名字所提示的,您应该始终将私钥保密。

### 使用@solana/web3.js创建密钥对

您可以通过npm模块 `@solana/web3.js` 在浏览器或node.js中使用Solana区块链。按照您通常的方式设置项目,然后使用npm安装 `@solana/web3.js`

```
npm i @solana/web3.js
```

我们将在本课程中逐步介绍 `web3.js` 的很多内容,但您也可以查看官方的[web3.js文档](https://docs.solana.com/developing/clients/javascript-reference)

要发送代币、发送NFT或在Solana上读写数据,您需要自己的密钥对。要创建一个新的密钥对,请使用 `@solana/web3.js` 中的 `Keypair.generate()` 函数:

```
import { Keypair } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`公钥是: `, keypair.publicKey.toBase58());
console.log(`私钥是: `, keypair.secretKey);
```

### ⚠️ 不要在源代码中包含私钥

由于可以从私钥重新生成密钥对,我们通常只存储私钥,并从私钥恢复密钥对。

此外,由于私钥对地址有控制权,我们不会在源代码中存储私钥。相反,我们:

- 将私钥放在 `.env` 文件中
-`.env` 添加到` .gitignore` 中,以便上传代码的时候可以不上传` .env` 文件。

### 加载现有的密钥对

如果您已经有一个想要使用的密钥对,您可以从文件系统或 ` .env` 文件中加载现有的私钥来创建Keypair。在node.js中,npm包 ` @solana-developers/node-helpers` 包括一些额外的函数:

- 要使用 `.env` 文件,请使用 `getKeypairFromEnvironment()`
- 要使用Solana CLI文件,请使用 `getKeypairFromFile()`

```
import "dotenv/config";
import { getKeypairFromEnvironment } from "@solana-developers/node-helpers";
const keypair = getKeypairFromEnvironment("SECRET_KEY");
```

您现在知道如何制作和加载密钥对了!让我们做一些练习,实践一下我们刚才所学到的。

# 实验

### 安装

创建一个新目录,安装TypeScript, Solana web3.js 和 esrun:

```
mkdir generate-keypair
cd generate-keypair
npm init -y
npm install typescript @solana/web3.js esrun @solana-developers/node-helpers
```

创建一个名为 `generate-keypair.ts` 的新文件:

```
import { Keypair } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`✅ Generated keypair!`)
```

运行 `npx esrun generate-keypair.ts`。你应该会看到文本:

```
✅ Generated keypair!
```

每个Keypair都有一个publicKey和secretKey属性。更新文件:

```
import { Keypair } from "@solana/web3.js";
const keypair = Keypair.generate();
console.log(`The public key is: `, keypair.publicKey.toBase58());
console.log(`The secret key is: `, keypair.secretKey);
console.log(`✅ Finished!`);
```

运行 `npx esrun generate-keypair.ts`。你应该会看到文本:

```
The public key is: 764CksEAZvm7C1mg2uFmpeFvifxwgjqxj2bH6Ps7La4F
The secret key is: Uint8Array(64) [
(a long series of numbers)
]
✅ Finished!
```

### 从 .env 文件加载现有的密钥对

为了确保你的秘密密钥安全,我们推荐使用 .env 文件来注入秘密密钥:

创建一个名为 `.env` 的新文件,内容为你之前制作的密钥:

```
SECRET_KEY="[(a series of numbers)]"
```

我们可以从环境中加载密钥对。更新 `generate-keypair.ts` 文件:

```
import "dotenv/config"
import { getKeypairFromEnvironment } from "@solana-developers/node-helpers";
const keypair = getKeypairFromEnvironment("SECRET_KEY");
console.log(
`✅ Finished! We've loaded our secret key securely, using an env file!`
);
```

运行 `npx esrun generate-keypair.ts`。你应该会看到以下结果:

```
✅ Finished! We've loaded our secret key securely, using an env file!
```

我们已经学习了关于密钥对的知识,以及如何在Solana上安全地存储秘密密钥。在下一章节,我们将使用它们!
Loading

0 comments on commit b1265c0

Please sign in to comment.