以太坊dApp开发教程(如何一步步构造一个全栈式去中心化应用)(二)试运行最简单的智能合约

一、打开ganache客户端

可以看到10个虚拟的以太坊账户,每个账户由100个以太币,这些账户可以用来测试dApp。现在本机上运行着私有的区块链。

二、创建truffle项目

windows用户打开git bash,输入命令以创建本项目的文件夹election,并且下载一个示例项目pet-shop,在这个项目基础上修改。

打开本地的git安装目录,进入项目目录,可以看到下载的文件。

  • contracts directory: 存储智能合约的目录. 默认有一个Migration合约帮助我们完成迁移到区块链的工作。
  • migrations directory: 存储迁移文件. 当我们部署智能合约到区块链时,我们要更新区块链的状态,因此需要迁移文件。
  • node_modules directory: 存储本节点的所有依赖资源.
  • src directory: 客户端资源,包括html,css,javascript等.
  • test directory: 存储测试文件.
  • truffle.js file: Truffle项目的主要配置文件

三、编写智能合约

创建Election.sol智能合约文件,并用sublime text进行编辑,输入最简单的合约代码

pragma solidity 0.4.2;

contract Election {
    // Read/write candidate
    string public candidate;

    // Constructor
    function Election () public {
        candidate = "Candidate 1";
    }
}

由于我的solidity版本比较新,以上代码不能编译通过,需要修改构造函数,更改为:

pragma solidity ^0.4.2;

contract Election {
	//read / write candidate
	string public candidate;
	
	//constructor
	constructor() public {
		candidate = "Candidate 1";
	} 
}

solidity教程网上很多,代码含义就不细说了

四、编写迁移文件

文件内容如下:

var Election = artifacts.require("./Election.sol");

module.exports = function(deployer) {
    deployer.deploy(Election); 
};

我们需要require已经创建好的合约,赋值给变量"Election". 然后加入到the manifest of deployed contracts以保证在迁移时部署这个合约。

然后执行迁移命令,可以看到迁移成功后的合约地址。

观察ganache以太坊客户端,可以看到生成了四个区块。

 Election合约地址为:0x187c81f78faf7ebe68af673ed2ab35b640dc6ba9

点开第3个区块,可以看到与这个地址对应

五、用truffle客户端来测试合约

Truffle console会根据truffle.js中配置的development网络,自动连接到这个网络

进入truffle console之前要先把合约部署到本地节点上,即运行truffle migrate,如果报错,可以把build目录删掉,重新再migrate

在truffle console环境下:

  • 所有编译好的智能合约都可以获取且能使用,就像我们的Election合约
  • Web3库可以获取,并且已经设置好连接到本地的以太坊客户端
  • 函数返回值直接被打印,不用再写then函数

来自: https://truffleframework.com/docs/truffle/getting-started/using-truffle-develop-and-the-console

在windows命令行下进入truffle console, --network是指定连接的网络,如果设置了默认的development可以不加这个参数

在git bash中输入命令进入truffle console,然后输入以下代码

Election.deployed().then(function(instance) { app = instance })

Election是我在migration文件中变量的名字,我们搜索使用deployed方法部署的合约实例,然后把它在回调函数中赋值给app变量。然后就可以利用app这个实例来访问合约中的方法和变量了。

合约中有candidate这个public的变量,默认是有个getter方法的,我们这样调用相当于获取了candidate变量的值。也可以app.candidate.call()同样能获取字符串的值

如果合约中有个 address[3] public vars;   访问时需要提供参数,即数组索引值,例如 app.vars(1)  或者 app.vars.call(1)

如果调用合约中的不花费gas的方法,可以这样调用: app.myFunction.call(args...).then(function(results...){} )

如果是花费gas的方法,可以这样调用,需要增加调用者账户地址和消耗的gas,app.myFunction(args..., { from: callAddress})

到此,我们已经完成了一个简单的智能合约,把它成功部署到区块链上,并且通过它获取一些区块链上的数据。

猜你喜欢

转载自blog.csdn.net/u011680118/article/details/82423150