sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
,若是这一步失败,一直重试安装打开Chrome网上应用商店,搜索solidity
php
安装后打开,通常solidity语言编写的智能合约代码会自动编译,而后在右边显示,若是没有,说明solidity代码语法错误css
例如,solidity智能合约代码编译经过git
例如,solidity智能合约代码编译失败github
Solidity IDEweb
(1)打开终端(Ctrl+Alt+T)chrome
(2)打开测试网控制台:geth --datadir "~/ethdev" --dev console 2>> geth.log
json
(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个变量:ratingContract
和rating
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)查询打分: