【区块链学习】以Linux为例,经过控制台部署和运行智能合约

安装环境

安装以太坊环境

(1) sudo apt-get install software-properties-common

这里写图片描述

这里写图片描述

(2)sudo add-apt-repository -y ppa:ethereum/ethereum

这里写图片描述

(3)sudo add-apt-repository -y ppa:ethereum/ethereum-dev

这里写图片描述

(4)sudo apt-get update

这里写图片描述

(5)sudo apt-get install ethereum,若是这一步失败,一直重试安装

这里写图片描述


安装solidity语言编译器

(1)Chrome里面插件安装

打开Chrome网上应用商店,搜索solidityphp

这里写图片描述

安装后打开,通常solidity语言编写的智能合约代码会自动编译,而后在右边显示,若是没有,说明solidity代码语法错误css

例如,solidity智能合约代码编译经过git

这里写图片描述

例如,solidity智能合约代码编译失败github

这里写图片描述

(2)solidity语言在线编译器

Solidity IDEweb


私有链搭建

(1)打开终端(Ctrl+Alt+T)chrome

这里写图片描述

(2)打开测试网控制台:geth --datadir "~/ethdev" --dev console 2>> geth.logjson

这里写图片描述

(3)查看personal的属性:personal数组

这里写图片描述

(4)建立帐户: personal.newAccount('123456'),123456是密码,0xe9f350a2c250fa26b7eb3db6f28d858668b7e45b 是帐户地址bash

这里写图片描述

(5)查看帐户余额:web3.eth.getBalance(personal.listAccounts[0]), personal.listAccounts[0] 就是咱们第一帐户,当前帐户余额为0app

这里写图片描述

(6)启动挖矿:miner.start(), 若是感受占用CPU,能够启动一个CPU挖矿miner.start(1)

这里写图片描述

(7)打开另外一终端,查看挖矿信息(若是一直挖矿,会不断刷屏,正常,这个终端用来观察挖矿信息),查看挖矿信息:tail -f geth.log

这里写图片描述

(8)中止挖矿:miner.stop(),若是以为CPU被占用以为还行,忽略这一步,后面交易确认须要挖矿一直进行

这里写图片描述

(9)查看余额:web3.eth.getBalance(personal.listAccounts[0]) 或者web3.fromWei(eth.getBalance("0xe9f350a2c250fa26b7eb3db6f28d858668b7e45b"), "ether")

这里写图片描述

这里写图片描述

(10)解锁发起智能合约的帐户:personal.unlockAccount("0xe9f350a2c250fa26b7eb3db6f28d858668b7e45b"), 0xe9f350a2c250fa26b7eb3db6f28d858668b7e45b 是咱们发起智能合约帐户的地址

这里写图片描述


部署智能合约

(1)编写智能合约:

contract Rating {
    function setRating(bytes32 _key, uint256 _value) {
        ratings[_key] = _value;
    }
    mapping (bytes32 => uint256) public ratings;
}

(2)复制编译后获得Web3 deploy, 从代码上看,定义了2个变量:ratingContractrating

var ratingContract = web3.eth.contract([{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"setRating","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"ratings","outputs":[{"name":"","type":"uint256"}],"type":"function"}]);
var rating = ratingContract.new(
   {
     from: web3.eth.accounts[0], 
     data: '606060405260c88060106000396000f360606040526000357c01000000000000000000000000000000000000000000000000000000009004806350b7b7a21460415780636c71d01d14606057603f565b005b605e6004808035906020019091908035906020019091905050608a565b005b6074600480803590602001909190505060ad565b6040518082815260200191505060405180910390f35b8060006000506000848152602001908152602001600020600050819055505b5050565b6000600050602052806000526040600020600091509050548156', 
     gas: 3000000
   }, function(e, contract){
    console.log(e, contract);
    if (typeof contract.address != 'undefined') {
         console.log('Contract mined! address: ' + contract.address + ' transactionHash: ' + contract.transactionHash);
    }
 })

这里写图片描述

(3)复制上面的代码到控制台上,从内容看,里面是2个变量的定义,因此分开复制更好看一些。

这里写图片描述

(4)这时,咱们能够检查一下交易池,查看当前交易的待处理情况:txpool.status,若是pending=1,说明咱们的合约还没获得确认,由于咱们刚才中止挖矿。

这里写图片描述

(5)从上面,咱们能够看到当前的交易池中有一个交易正在等待确认。而后,咱们查看待确认交易的详细内容:eth.getBlock("pending",true).transactions

这里写图片描述
咱们从显示出来的结果能够看出当前交易的一些内容。例如,from数据项就是咱们发送交易的地址,input就是合约编译完成的字节码,这些内容均与咱们以前的设定相同。并且,咱们能够看到新的交易建立在第2016号区块中。
与此同时,咱们也能够查看一下刚才在新的终端中建立的挖矿日志。咱们在日志中找到这样的一行信息:

这里写图片描述

这说明交易已经发送到区块链中了,正在等待矿工的确认。

(6)启动挖矿:miner.start()

这里写图片描述

控制台提示Contract mined,则合约被建立成功,并返回合约的地址(address)和这次交易的散列值。可经过这两个数值在区块链上寻找合约的信息。

(7)咱们发现交易池已经没有待确认的交易了。咱们使用eth.getBlock(2016)命令查看第2016号区块的信息:eth.getBlock(2016)

这里写图片描述

咱们发现hash值为0xa20f32030e6114002da1e8c8645023ee02ad43a18dde34f43c916bddc886bc5e的交易确实在第2016号区块中。


调用智能合约

(1)在部署合约所使用的控制台窗口下,可直接使用合约名和函数名调用合约。假设一个用户想为1号商品打3分,须要调用rating合约的setRating函数,须要执行如下命令:(我这里是rating,是由于我上面编译合约的代码赋值给rating,这里这里要根据本身编译完合约的代码而定)

rating.setRating.sendTransaction(1, 3, {from: personal.listAccounts[0]})

若是出现下面红色的错误,从新解锁帐户
这里写图片描述

因为用户须要发起一个交易并改变区块链的状态,所以须要用到合约对象的sendTransaction()方法来发起交易。该方法的前几个参数为setRating函数的参数,最后一个参数为发起交易的地址,也就是须要为本次交易支付费用的帐户的地址。这里personal.listAccounts[0]表明钱包内的第1个帐户,即基准帐户MAIN ACCOUNT:

"0x3c194bcba9c3b90028fdd22aaad4f4c8973781835c15c57d3879dc5c1c743760"

(2)通过一段时间的确认,该交易被保存到区块链中,此时可以使用rating合约中的ratings数组来显示1号商品的打分,其命令以下:rating.ratings(1)

这里写图片描述

这时将会显示3,表示1号商品被打了3分。因为此时并不须要改变区块链系统的状态,所以不须要使用sendTransaction方法,也就不须要支付任何费用。

(3) 若是想在其余以太坊节点经过控制台调用合约,则需知道合约的地址和接口。执行如下命令实例化合约对象:var NewRatingContract = eth.contract(interface).at(“address”) 这里,interface的信息可从Solidity在线编辑器上得到,而address在合约部署以后返回获得。以后,使用NewRatingContract.ratings(1)命令就可查找到1号商品的打分。例如个人:

var NewRatingContract = eth.contract([{"constant":false,"inputs":[{"name":"_key","type":"bytes32"},{"name":"_value","type":"uint256"}],"name":"setRating","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"ratings","outputs":[{"name":"","type":"uint256"}],"type":"function"}]).at("0x133e80139ce46615a777ba26f5ee2a39ee709df1")

找到interface信息:
这里写图片描述

找到address信息:
这里写图片描述

(3)查询打分:
这里写图片描述


参考

如何开发编译部署调用智能合约