发现网络DApp的中文开发教学还是太少,这篇文章除了当作老崔学习的总整理,也当作一个抛砖引玉,看看有没有办法引起中文用户更多的涟漪。
Ethereum, EVM, Solidity, Truffle, Hardhat, Remix, Waffle, Rinkeby ……到底是什么?
Ethereum 以太坊
这个相信应该没有人不明白,执行智能合约的公链平台,编写语言为Solidity。
以太坊将比特币从传统的记帐转成为状态机,以太坊不是分布式帐本,是分布式状态机,以太坊的状态是一个大型的数据结构,不只有帐户余额,还有各种合约里面记载的状态。
有限状态机(FSM, Finite State Machine)
就是要把所有的状态下,会对应怎样的事件并转移到怎样的状态写清楚。
- 进入动作(entry action):在进入状态时进行,例如:状态进入绿灯后会执行什么
- 退出动作(exit action):在退出状态时进行,例如:状态离开绿灯后会执行什么
- 输入动作:依赖于目前状态和输入条件进行,例如:在绿灯时发生其他事会执行什么
- 转移动作:在进行特定转移时进行,例如:黄灯转成红灯时要执行什么
EVM(Ethereum Virtual Machine)
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插件编写并运行了测试,最后部属了合约。
到这里为止环境就架设完毕了,后面会开始做智能合约编写的整理。
原创文章,作者:惊蛰财经,如若转载,请注明出处:http://www.xmlm.net/bi/31753.html