在中文网络中,关于DApp(去中心化应用)的开发教学资源相对匮乏。本文不仅是对老崔学习经验的汇总,更希望借此激发更多中文用户的思考,探索如何激发中文社区对于DApp开发的兴趣。
Ethereum、EVM、Solidity、Truffle、Hardhat、Remix、Waffle、Rinkeby……这些名词究竟是什么意思?让我们一探究竟。 Ethereum(以太坊)相信大家对以太坊并不陌生,这是一个用于执行智能合约的公共区块链平台,其编程语言为Solidity。
以太坊将比特币从传统的记账方式转变为状态机,它并非分布式账本,而是分布式状态机。以太坊的状态是一个庞大的数据结构,不仅包含账户余额,还有各种合约中记录的状态。 有限状态机(FSM,Finite State Machine)是指将所有状态以及对应的事件、转移写清楚。
- 进入动作(entry action):在进入状态时执行,例如,状态变为绿灯后执行什么。 - 退出动作(exit action):在退出状态时执行,例如,状态离开绿灯后执行什么。 - 输入动作:依赖于当前状态和输入条件进行,例如,在绿灯时发生其他事会执行什么。 - 转移动作:在进行特定转移时执行,例如,黄灯变为红灯时要执行什么。 EVM(Ethereum Virtual Machine)以太坊EVM图示EVM存在于每一个以太坊节点中,用于计算状态的变化。
Solidity是编写智能合约的语法,TRON也使用Solidity进行开发。
Truffle是一个开发环境,允许用户在终端进行合约的各个阶段的操作,包括以下功能:
- 内置智能合约编译、链接、部署和二进制文件管理。 - 快速开发下的自动合约测试。 - 脚本化的、可扩展的部署与发布框架。 - 支持部署到任何公网或私网网络环境。 - 使用EthPM和NPM提供的包管理。 - 支持与合约直接通信的交互控制台。 - 可配置的构建流程,支持紧密集成。 - 在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是以太坊的测试网,可以通过Rinkeby faucet(水龙头)获得testnet token来测试智能合约。
安装Hardhat准备环境 1. 首先安装node.js。 2. 找一个空文件夹安装hardhat: ```bash $ npm init $ npm install --save-dev hardhat ``` 3. 创建项目: ```bash npx hardhat // 选择Create a sample project ``` 示例项目将要求安装hardhat-waffle和hardhat-ethers,以便Hardhat与使用Waffle构建的测试兼容。 ```bash $ 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:用于存放相关的库,似乎会按照package.json安装(这里不太确定)。 - scripts:用于部署的文件夹。 - test:测试程序放置的地方。 智能合约的Hello World!! 使用上述create project后,应该在contracts文件夹中看到一个Greeter.sol文件,打开后内容如下: ```solidity // 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,方便后面调试,要使用import contract的function就如同上面使用console.log。 contract:类似于其他语言中的class,contract中定义智能合约所需的功能,虽然一个.sol文件可以定义多个Contract,但建议只定义一个Contract并与文件名同名。 function:定义函数,有传入的参数或返回值,需要指定参数的类型。 注意:Solidity v0.5.0更新后,强制所有struct、array、mapping、argument必须明确地存放位置。 进行测试 1. 首先对合约进行编译: ```bash $ npx hardhat compile ``` 2. 对合约进行测试: ```bash $ npx hardhat test ``` 3. 连接钱包或DApp到Hardhat Network: ```bash npx hardhat node ``` 这将向Hardhat Network公开JSON-RPC接口。这里举例使用Metamask连接到Hardhat Network,打开Metamask钱包,并将网络调整为Localhost 8545。 进行部署 在scripts文件夹中可以看到有一个sample-script.js文件,运行它就可以进行部署。 如果想在本地上测试部署,可以使用以下命令: ```bash npx hardhat run scripts/sample-script.js --network localhost ``` 至此,我们已经创建了一个项目,并运行了Hardhat任务,编译了智能合约,安装了Waffle集成插件,使用Waffle和ethers.js插件编写并运行了测试,最后部署了合约。 至此,环境搭建完成,接下来将开始整理智能合约编写的内容。标签: 数字货币
文章来源: 酷玩网
版权声明: 本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任