最近出于需求,需要学习一下dapp编写,于是找了资料学习一下。
但是发现网上的资料纷繁复杂,而且基本都是2018年的。很多操作已经不适合现在新的语法或者安装步骤了。
所以,现在整理一下,把我自己配置开发环境以及搭建一个简单合约的一个过程记录一下。
参考:
https://blog.csdn.net/zhj_fly/article/details/79458467?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control
首先,先明确一下开发这个dapp需要哪些东西(这里先指本地开发,最终上链的话,只需要改一下最后一步就行)。
一共需要五个东西:nodejs npm truffle ganache web3
nodejs
基础环境,使能js运行。可以到 https://nodejs.org/en/ 下载LTS版本。
win7用户无法安装最新版,只能用v12版本(https://nodejs.org/dist/latest-v12.x/)。
npm
js包的安装工具,在windows下,安装nodejs的安装包时,已经一并安装。
设置一下npm的源,这样子利用npm安装组件时会快一点。
npm config set registry http://registry.npm.taobao.org
npm config list #查看
Truffle
合约的编译环境
启动cmd窗口,运行以下命令。
npm install -g truffle
ganache
本地的eth链,用来本地测试。上真的链的话,要用go-ethereum,以后再说。
这个工具有控制台版本以及有界面版本。
我们直接用有界面版本。
https://github.com/trufflesuite/ganache/releases
web3
用js去与合约交互的桥梁,为了方便,这里先不进行全局安装。在下面的例程工程中再单独安装。
至此,开发环境搭建好了。
接下来,部署一个简单的例程(例程用到的代码基本照抄这个博客,但是按照新版本的特性做了一些修改。感谢大神的资料)。
1.在一个不包含中文的路径(带中文没试过),新建一个文件夹。
我这边选择了桌面,新建了一个ethTest;
然后再在里面新建一个truffleTest文件夹(这个用来存放合约工程的相关文件),和一个web3Test文件夹(这个用来存放js工程相关的东西)。
2.然后打开控制台,cd到truffleTest中,执行
truffle init
执行之后,会得到一些文件。
3.编写智能合约,在contracts文件夹下新建智能合约:Data.sol:(功能:存、取一个字符串)
pragma solidity >=0.4.22 <0.9.0;
contract Data{
string public data;
constructor()public{
data = "init data";
}
function setData(string memory str) public payable{
data = str;
}
function getData() public view returns (string memory) {
return data;
}
}
4.编译
truffle compile
5.部署在测试网络上
(1)打开ganache
(2)修改 truffleTest/migrations 文件夹下的部署配置
//var Migrations = artifacts.require("Migrations");
var Data = artifacts.require("Data");
module.exports = function(deployer) {
//deployer.deploy(Migrations);
deployer.deploy(Data);
};
(3)修改truffle-config.js配置文件,添加连接网络信息:
development: {
host: "localhost",
port: 7545,
network_id: "*"
}
(4)执行
truffle migrate --reset
至此truffle项目已经做好,接下来使用web3和智能合约进行交互(暂时我的理解是Dapp的后台部分数据是与智能合约交互,但是前端的显示、交互、绝大多数的后台处理还是和传统的app一样)
web3与智能合约交互
添加web3到项目中:
1、cd 到前面新建的web3Test文件夹中。
2、初始化
npm init
3、下载web3.js到项目中:
npm install web3 --save
以上命令会将web3.js下载到web3test/node_modules目录下,其中–save参数会web3.js添加到package.json配置文件中。
4、创建web3对象
要使用web3.js与区块链交互,需要先创建web3对象,然后连接到以太坊节点。
在web3test目录下新建index.js文件,在其中输入以下代码:
其中 abi 是truffleTest项目中build目录下Data.json文件中的abi,复制过来即可。
address 是合约部署的地址。在部署时显示了出来,或者可以通过ganache查看。
通过abi和合约地址就可以获取合约的实例data。下面就可以通过data来调用合约里面的内容了。
var Web3 = require("web3");
var web3 = new Web3();
web3.setProvider(new Web3.providers.HttpProvider("http://localhost:7545"));
var abi = 这里拷贝你的abi
var address = '0xE6182993EF7e22F48B32beB1F8CC97ac7E775C55'; //这个是合约地址,在前面truffle migrate --reset 时已经显示;或者直接从ganache界面中看。
var data = new web3.eth.Contract(abi,address);
data.methods.getData().call(null,function(error, result){
console.log("the data:"+result);
});
data.methods.setData("hello blockchain, your dad is here.").send({from: '0xF27d8426C496A88cbBB0929A4D7928862A7Bf78F'}).on('transactionHash', function(hash){
console.log("hash:", hash);
data.methods.getData().call(null,function(error, result){
console.log("the data:"+result);
});
});
call()和send()的作用可以从官方文档中查看。send里面的from是发送交易的地址,这里我写的是ganache中第1个账户的地址。
输出以下信息:
在ganache中也可以看到效果。