编程日记:优化项目结构(2022-08-24)

编程学习

做了什么?

  1. 成功在 Stack Overflow 提出了第一个有大佬 (37k reputation) 认真回答的问题,也是这段时间编程以来,第二次在老外的帮助下解决了编程上的难题。

  2. 成功在视频解释 dotenv 包之前,通过自行阅读 npm 文档,成功尝试出了包的安装和使用。

  3. 成功在两个MetaMask账户之间实现切换,保证拥有真钱和NFT的钱包,与开发用的钱包完全分离。

  4. 成功了解了 README.md 的书写格式,并将格式安装自己的想法,重新写在了项目当中作为模板。

有什么收获?

JS BigNumber 与 String

问题:

Title: When JS passes numeric values as arguments to Solidity function, why is it better to wrap them in quotes?

Content:

I defined a function in Solidity:

function store(uint256 _favoriteNumber) public {}

Then call the function with argument 7 in JavaScript:

contract.store(7);

But, according to the Patrick Collins JS video, it's a better form to wrap number 7 with quotes like this:

contract.sotre("7");

I don't understand why it's better to wrap number with quotes and why ehter.js can automatically convert string to number?

以上问题已在 Stack Overflow 当中提问,详见此问题

得到答复后,我的理解是:

The smart contract libraries don't accept integers as numeric values, but native JS string or an instance of BigNumber.

即,由于智能合约所能处理的数值范围在0~2^256之间,而JS所能处理的数值范围在0~2^53-1的范围之间,所以智能合约所能接收的数值大于JS所能传递的数值

因此,为了让JS能够传递超出2^53-1大小的数值,比如“1 Ether”即“10^18 Wei”, 数值将会以字符串或者 BigNumber 的实例这两种方式传递,这样JS将不会因为数值大小溢出而报错 ehter.js。

Transaction Receipt 语法

有两种获得交易收据的方法:

  • 一种是在部署合约的时候,获得initcode transaction的交易收据的方法:await contract.deployTransaction.wait();

  • 另一种是在利用合约发起交易时,获得普通transaction的交易收据的方法:await transaction.wait();

.env file

.env 文件可以用来存储环境变量,它有两个特点:

  1. 只存储在本地,无法被分享;

  2. 构成程序的运行环境,使得任何本地程序都可以读取的变量。

环境变量可以自定义名称,但是所有命名都需要采用大写的形式。每一个环境变量的名称都需要对应其意义,比如:PRIVATE_KEY 就是用来存储私钥的环境变量,PATH 就是用来存储路径的环境变量。

dotenv package

In .env file:

PRIVATE_KEY=0x4e35151e33632cf03d3a4631dc2960f95884a678221cbfbb64ee94ecb3d1d89b

To use the PRIVATE_KEY in JS file, we can use the dotenv package:

require("dotenv").config();
console.log(process.env.PRIVATE_KEY);

README.md 模板

来源:Best-README-Template

README.md 的格式大概分为以下几个部分:

  1. 引入:项目Logo, 名称,描述。

  2. 项目介绍 (About the project): 用一句话描述项目。

    1. 技术使用 (Build With): 自己用到的技术及其Logo, 比如:ethers.js 等

  3. 入门指南 (Getting Started)

    1. 预备工具 (Prerequisite)

    2. 安装 (Installation)

      1. Get a free API at https://example.com

      2. Clone the repo

      3. Install NPM package

      4. Enter your API in config.js

  4. 项目用途 (Usage): 截图说明自己的项目有哪些作用。

经过重构后,在 README.md 中所使用的模板如下

## 引入

介绍项目的Logo, Title, 以及 Description.

## 一、项目介绍 (About the project)

用一句话描述项目。

## 二、项目安装 (Getting Startted)

介绍如何使用该项目。

### 预备工具 (Prerequisite)

- Node.js

### 安装步骤 (Installation)

1. 克隆仓库
2. 安装库,详见 `package.json` 文件。

## 三、项目用途 (Usage)

截图说明该项目有哪些典型的用法。