发现网络DApp的中文开发教学还是太少,这篇文章除了当作老崔学习的总整理,也当作一个抛砖引玉,看看有没有办法引起中文用户更多的涟漪。

Ethereum, EVM, Solidity, Truffle, Hardhat, Remix, Waffle, Rinkeby ……到底是什么

Ethereum 以太坊

这个相信应该没有人不明白,执行智能合约的公链平台,编写语言为Solidity。

以太坊将比特币从传统的记帐转成为状态机,以太坊不是分布式帐本,是分布式状态机,以太坊的状态是一个大型的数据结构,不只有帐户余额,还有各种合约里面记载的状态。

有限状态机(FSM, Finite State Machine)

就是要把所有的状态下,会对应怎样的事件并转移到怎样的状态写清楚。

有限状态机wiki解释 进入动作(entry action):在进入状态时进行,例如:状态进入绿灯后会执行什么 退出动作(exit action):在退出状态时进行,例如:状态离开绿灯后会执行什么 输入动作:依赖于目前状态和输入条件进行,例如:在绿灯时发生其他事会执行什么 转移动作:在进行特定转移时进行,例如:黄灯转成红灯时要执行什么

EVM(Ethereum Virtual Machine)

以太坊EVM图示

EVM存在在每一个以太节点中,用来计算state的变化。

Solidity

用来编写智能合约的语法,TRON也是使用Solidity开发。

Truffle

Truffle是一个开发环境,让大家可以在终端进行合约各种阶段要做的事,包含了以下 :

内置的智能合约编译,链接,部署和二进制文件的管理。 快速开发下的自动合约测试。 脚本化的,可扩展的部署与发布框架。 部署到不管多少的公网或私网的网络环境管理功能 使用EthPM&NPM提供的包管理,使用ERC190标准。 与合约直接通信的直接交互控制台(写完合约就可以命令行里验证了)。 可配的构建流程,支持紧密集成。 在Truffle环境里支持执行外部的脚本。

老K自己找了一下Truffle的网络分享比较多,Hardhat的网络文章比较少(中文用户),但还是会先尝试看看Hardhat,因为听说Testnet会比较快。

Hardhat

跟Truffle一样是开发环境,Hardhat的开发环境包括了Waffle、Hardhat、ethers。

中文文章真的很少,这里有一些关于Truffle跟Hardhat的比较,目前网络对于Hardhat的中文支持还很少,不过还是会先朝着这方向试试看。

Remix

以太坊线上官方开发环境,Tron也有类似的工具tronide,老K觉得这个IDE介面还算简单,而且是照着步骤是看得懂的,不过使用Remix串接web3.js这块就还没有很了解。

Waffle

智能合约测试工具。

Rinkeby

以太坊的Testnet,透过Rinkeby faucet(水龙头)获得testnet token来测试smart contract。

Hardhat 安装准备环境

先安装node.js 找一个空资料夹安装hardhat

$npm init $npm install --save-dev hardhat

Create Project

$npx hardhat //选择Create a sample project

该示例会要求安装hardhat-waffle和hardhat-ethers,这使得Hardhat与使用Waffle构建的测试兼容

$npm install --save-dev @nomiclabs/hardhat-waffle ethereum-waffle chai @nomiclabs/hardhat-ethers ethers

此时的资料夹结构

artifacts :执行npx hardhat compile编译后的资料会放在artifacts/contracts/xxx.sol/xxx.json,以json格式存放。

contracts :用来存放准备编译的合约。

node_modules :用来存放相关的library,似乎会按照package.json安装(这边不是很确定)。

scripts :进行deploy的资料夹。

test :测试程式放的地方。

Smart Contract 的Hello World!!

使用了上面的create project,应该会看到contracts里面有一个Greeter.sol,打开以后内容是

//SPDX-License-Identifier: Unlicense pragma solidity ^0.7.0; import "hardhat/console.sol"; contract Greeter { string greeting; constructor(string memory _greeting) { console.log("Deploying a Greeter with greeting:" , _greeting); greeting = _greeting; } function greet() public view returns (string memory) { return greeting; } function setGreeting(string memory _greeting) public { console.log("Changing greeting from '%s' to '%s '", greeting, _greeting); greeting = _greeting; } }

pragma solidity :指定solidity的版本

import :选择要import的contract,这边import了hardhat的console的contract,方便后面debug用,要使用import contract的function就如同上面使用console.log。

contract :类似其他语言中的class,contract里面则是定义智能合约需要的功能,虽然一个.sol档案可以定义多个Contract,不过建议只定义一个Contract并且与档名同名。

function :就是定义函数,有传入的参数或回传值,需要指定参数的型别。

这边要注意Solidity v0.5.0有更新强制所有struct array, mapping, argument要明确地存放位置

//solidity v0.4.x uint[] x = m_x function f (uint[][] x)//solidity v0.5.x uint[] storage x = m_x function f (uint[][] memory x

Solidity v0.5.0之前的版本若函数名称跟合约名称一样就可以当作建构子,在Solidity v0.5.0之后统一使用constructor() 作为建构子

//solidity v0.4.x contract MyContract { function MyContract() public { } } //solidity v0.5.0 contract MyContract { constructor() public { owner = msg.sender; } address payable owner; }

view是一个坠词,后面会再解释。

进行测试

先对合约进行compile

$npx hardhat compile

对合约进行test。

$npx hardhat test

连接钱包或Dapp到Hardhat Network

$npx hardhat node Started HTTP and WebSocket JSON-RPC server at http://127.0.0.1:8545/

这将向Hardhat Network公开JSON-RPC接口,这边举例使用Metamask连接到Hardhat Network,打开Metamask钱包,并调整网络至Localhost 8545这一项。

进行deploy

在scripts资料夹可以看到里面有一个sample-script.js,运行他就可以进行deploy。

$npx hardhat run scripts/sample-script.js

如果想deploy在local端测试,deploy如下

npx hardhat run scripts/sample-script.js --network localhost

到这里为止就已经创建了一个项目,并且运行了Hardhat任务,也编译了智能合约,安装了Waffle集成插件,使用Waffle和ethers.js插件编写并运行了测试,最后部属了合约。

到这里为止环境就架设完毕了,后面会开始做智能合约编写的整理。