Skip to content

Commit 43a50c4

Browse files
committed
merge
1 parent 41765ab commit 43a50c4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+29651
-0
lines changed

learn_smartcontract/README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
## Learn SmartContract
2+
3+
本仓库包含SmartContract相关教程以及代码资源。
4+
### 0. ERC-20 Token系列
5+
- [ERC-20 典型合约示例](./nft_series/erc20_example.md)
6+
7+
### 1. NFT系列
8+
9+
- **手把手教程**
10+
- [NFT新手教程(本仓库)](./nft_beginner_series)
11+
12+
13+
- **学习知名的NFT项目**
14+
- [点此查看(本仓库)](./other/learn_famous_project_code.md)
15+
16+
17+
- **NFT编程技巧**
18+
- [如何节省Gas开销(本仓库)](./nft_series/saving_gas_coding.md)
19+
- [如何使用OpenZeppelin编写可升级合约(本仓库-整理)](./other/how_to_upgrade_contract.md)
20+
### 2. DeFi系列
21+
TODO
22+
23+
### 3. DAO系列
24+
TODO
25+
26+
### 4. 合约编程建议
27+
28+
[合约的安全编程(本仓库)](./other/security_coding.md)
29+
[合约的技巧性编程(本仓库)](./other/skilled_coding.md)
30+
31+
[The Solcurity Standard][2] - [译文][3] 如何写出高质量Solidity代码
32+
[SWC Registry][4] 专业的智能合约弱点分类和测试用例
33+
34+
### 5. 未分类
35+
- [如何节省Gas费用_更新中(本仓库)](./other/saving_gas_coding.md)
36+
37+
[1]: https://www.solidnoob.com/blog/good-nft-contract-patterns
38+
[2]: https://github.com/transmissions11/solcurity
39+
[3]: https://mp.weixin.qq.com/s/fcNz4P52Ku0Ey469zqdX2A
40+
[4]: https://swcregistry.io/
41+
42+
### Issue
43+
本仓库下的md文档均由本人亲自整理或编写,其中难免出现笔误或因个人水平问题导致的错误,欢迎读者提出issue帮助完善本仓库,在此表示致谢!
44+
45+
### License
46+
本仓库中除标题含「整理」的文章支持无限制转载外,其余文章均为原创(转载须注明作者及来源),在知识共享协议CC-BY-NC-SA 4.0下发布。
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
## Learn Project Uniswap
2+
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
## 用自定义素材组合生成艺术NFT
2+
3+
本文档记录了笔者按照文章 [Create Generative NFT Art with Rarities][1] 来生成艺术NFT的过程,这是参考文章的[中文版本][0]
4+
5+
### 1. 了解大致原理
6+
一个艺术NFT图像是由多个特征图片叠加合成,特征指的是图像的某个位置,比如这个项目生成的是松鼠头像,它包含8个特征,包括背景、皮肤、面部、帽子等。
7+
我们只需提前为每个特征准备一组不同的图片,然后由程序从这个特征图片池中为每个特征随机抽取一张出来,并将所有特征图进行叠加就得到一个艺术图片。
8+
9+
所以只要丰富特征图片池,生成一万张不同的图片是很容易的。
10+
11+
然后,每个特征部位的名称由我们提前定义,这些特征名最终会作为**NFT元数据**
12+
13+
### 2. 下载代码库
14+
这里直接使用一个免费的(Python)生成艺术品代码库:https://github.com/rounakbanik/generative-art-nft
15+
16+
执行下面的步骤:
17+
18+
```shell
19+
# step1
20+
# 若失效,请更换地址:https://github.com/chaseSpace/generative-art-nft
21+
git clone [email protected]:rounakbanik/generative-art-nft.git
22+
23+
# step2:代码库依赖这几个python库
24+
pip install Pillow pandas progressbar2
25+
```
26+
27+
第二个命令将安装我们的库所依赖的三个重要的 Python 包:
28+
- Pillow:一个图像处理库,将帮助我们堆叠特征图像。
29+
- Pandas: 一个数据分析库,将帮助我们生成和保存图像元数据。
30+
- 进度条: 一个库,将告诉我们图像生成时的进度和 ETA 值。
31+
32+
### 3. 了解config.py
33+
主要是配置每个特征叠加的顺序,以及稀有性权重。请查看直接查看原文或该文件了解细节。
34+
35+
### 4. 生成NFT集合
36+
执行命令:
37+
```shell
38+
lei@WilldeMacBook-Pro 0.generate_art_nft % cd 0.generative-art-nft
39+
lei@WilldeMacBook-Pro generative-art-nft % python3 nft.py
40+
Checking assets...
41+
Assets look great! We are good to go!
42+
43+
You can create a total of 16 distinct avatars
44+
45+
How many avatars would you like to create? Enter a number greater than 0:
46+
20
47+
What would you like to call this edition?:
48+
v1
49+
Starting task...
50+
100% (20 of 20) |################################################################################################################################################################################################################################################################| Elapsed Time: 0:00:01 Time: 0:00:01
51+
Generated 20 images, 13 are distinct
52+
Removing 7 images...
53+
Saving metadata...
54+
Task complete!
55+
```
56+
注意其中会需要你输入想要创建头像的数量以及本次生成操作的版本备注(笔者输入的是v1)。另外,根据日志可以发现仓库中的素材太少,最多生成13张不同的图,其余相同的会被删除。
57+
58+
生成结束后,会将头像和元数据.csv写入`/output`目录中,元数据.csv主要用来做稀有度分析,下一步要做的就是【上传头像到IPFS网络获得URL】,请参考下一个教程。
59+
60+
[0]:https://mp.weixin.qq.com/s?__biz=MzU5NzUwODcyMw==&mid=2247500378&idx=2&sn=1b721bdfc35890e2381df50c6ec0448b&chksm=fe50d546c9275c50e0393b7b5c0ad4da65015373c9ed89d64dce8cb490d362b50f30f75d2fad&scene=178&cur_album_id=1716985081560367106#rd
61+
[1]:https://dev.to/rounakbanik/create-generative-nft-art-with-rarities-1n6f
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Subproject commit 8c01ddd63ad8e67853db21a2396eaa21a3a6699f
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
## 上传NFT图片到IPFS
2+
3+
本文档记录了笔者按照文章 [Working with NFT Metadata, IPFS, and Pinata][0] 来完成以下工作的过程:
4+
- 上传NFT图片到IPFS
5+
- 生成合规的NFT JSON元数据(由于最终会上传到OpenSea,所以使用它的格式)
6+
- 上传NFT元数据到IPFS
7+
8+
### 1. 为什么要上传
9+
这部分内容解释了上述步骤的意义以及理由,由于是科普性内容,请阅读原文理解这部分。
10+
11+
### 2. 上传NFT图片到IPFS
12+
由于在传统中心化云存储服务存放资源具有可替换、可丢失的风险,这在NFT行业是绝对不允许的,所以要使用去中心化且使用内容寻址的IPFS来作为云存储。
13+
14+
就像比特币和以太坊这些公链一样,如果要进行交互,只需要找到一个可靠网关就行了。所以现在有很多所谓提供Web3基础设置服务的公司,它们就是做这个的。
15+
这里我们使用 [Pinata][1] 来作为IPFS网关。现在执行以下步骤:
16+
17+
- 进入Pinata网站注册一个账号,账户拥有免费1G的上传容量
18+
- 进入**Files**页面点击**Upload+**,选择**Folder**,上传上一个[生成艺术NFT教程中得到的图片目录](./0.generate_art_nft/generative-art-nft/output/edition test/images)
19+
20+
上传时为目录输入新的名称,等上传成功后可以看到上传目录对应的CID了。
21+
>这个CID是基于目录内所有内容生成的,所以只要目录内存在对任何图片的增删改,CID就会改变。
22+
23+
根据这个CID就可以得到两个URL:
24+
```shell
25+
# IPFS URL
26+
ipfs://Qmdrw1RD6dQwsUvX4Xj4E3DtBNCorLqDstRWmQugTcQt1f
27+
# 可通过浏览器访问的IPFS内容的HTTPS URL
28+
https://ipfs.io/ipfs/Qmdrw1RD6dQwsUvX4Xj4E3DtBNCorLqDstRWmQugTcQt1f
29+
```
30+
但请注意,第二个HTTP URL是不能直接访问的(返回504),因为它对应的资源是整个目录,而IPFS访问协议不支持返回一个目录,但允许在指向目录的URL后面添加具体文件名来访问单个文件,
31+
像这样:https://ipfs.io/ipfs/Qmdrw1RD6dQwsUvX4Xj4E3DtBNCorLqDstRWmQugTcQt1f/00.png ,还有一点需要注意,这个URL无法在上传Pinata后立即可访问,其中有一个同步的过程,笔者大概等了5min才能访问。
32+
33+
### 3. 生成合规的NFT JSON元数据
34+
这一步我们需要先为每个NFT图片创建一个JSON文件,然后使用符合NFT交易市场(本例中是OpenSea)的数据格式进行填充。上一个教程中的**generative-art-nft**库中包含了一些脚本来帮助我们完成这些工作,
35+
下面来看看所执行的步骤。
36+
37+
#### 3.1 修改metadata.py
38+
**generative-art-nft**库的根目录下存在`metadata.py`,我们编辑这个文件的第17行\~23行的内容,如下:
39+
```python
40+
BASE_IMAGE_URL = "ipfs://Qmdrw1RD6dQwsUvX4Xj4E3DtBNCorLqDstRWmQugTcQt1f" # 刚才上传图片的目录的IPFS URL
41+
BASE_NAME = "Scrappy Squirrel #" # 这个NFT集合的名称
42+
43+
BASE_JSON = {
44+
"name": BASE_NAME,
45+
"description": "A Collection of 10,000 Scrappy Squirrel on the Ethereum blockchain", # NFT集合的描述
46+
"image": BASE_IMAGE_URL,
47+
"attributes": [],
48+
}
49+
```
50+
只需修改三个变量`BASE_NAME`, `BASE_URL`, `BASE_JSON`,这几个变量都会进入到NFT元数据中。
51+
52+
#### 3.2 执行脚本
53+
进入**generative-art-nft**库的根目录,执行命令(会询问你操作哪个edition,输入上个教程中笔者填的`v1`):
54+
```shell
55+
lei@WilldeMacBook-Pro generative-art-nft % python3 metadata.py
56+
Enter edition you want to generate metadata for:
57+
v1
58+
Edition exists! Generating JSON metadata...
59+
| |
60+
```
61+
生成的JSON文件位于**generative-art-nft**库的`output/edition v1/json/`
62+
63+
### 4. 上传JSON元数据到IPFS
64+
就像前面上传图片目录一样,将JSON数据目录上传到Pinata获取CID即可。
65+
66+
现在,我们已经获得了这个NFT集合的所有图片和元数据的IPFS URL,下一步就是编写合约来引用这些数据了,请参考下一个教程。
67+
68+
69+
70+
[0]: https://dev.to/rounakbanik/working-with-nft-metadata-ipfs-and-pinata-3ieh
71+
[1]: https://www.pinata.cloud/

0 commit comments

Comments
 (0)