启动命令
Submitted by admin on 2016, December 13, 9:22 PM
启动命令
Submitted by admin on 2016, December 13, 9:18 PM
以太坊发布以后,有多个客户端,同时也支持多个平台,初学者往往被各种各样的客户端弄迷糊,本文进行了详细的总结。
Submitted by admin on 2016, December 13, 8:04 PM
在正式开始前,首先推荐过下这篇文章 http://ethfans.org/topics/102
如果你暂时不想了解区块链的技术细节,比如什么工作量证明,公钥加密系统什么的,可以先直接跳过。但还是强烈建议在你对整个开发流程有了点感觉后,把这部分知识补充起来。
http://teahour.fm/2015/12/27/talk-with-jan-about-bitcoin-and-blockchain.html
http://teahour.fm/2016/01/19/talk-with-jan-about-ehtereum.html (文字稿:http://ethfans.org/posts/talk-with-jan-about-ehtereum)
Ethereum提供两种智能合约编程语言Solidity和Serpent,Solidity的语法类似于JavaScript,而Serpent的语法接近于Python。但也仅仅是语法有点类似,事实上有着巨大的差别,学习时不能简单的代入理解。如果你对编程语言没有偏好,请选择Solidity,也是默认的智能合约编程语言。Solidity文档中文版(正在翻译中,欢迎开发者参与翻译):http://ethfans.org/posts/solidity-content 。
如果不想搭建完整的ethereum开发环境,只是想了解下Solidity,可以看下这个项目:Browser-Solidity
以太坊的开发生态正在日益完善,相比刚发布时的裸写,现在已经有很多开发工具供选择了。
通常你都是在写一个面向最终用户的应用,这时你需要一个界面。以太坊的开发者通常使用Web App + Smart Contract的方式来搭建这样的应用,并称之为Đapp(Decentralised Application)。在这里,智能合约部分的代码就相当于BS架构中的服务器代码,而Web部分则相当于前端代码。Web部分可以使用你熟悉的的HTML + JavaScript + CSS 来完成,然后通过JSONRPC的方法使用以太坊客户端提供的API接口,来操作你部署在区块链上的智能合约,这里区块链就相当于你租用的一台云服务器,所以有时候我们可以把以太坊的区块链理解为全球共享的一台World Computer。
Đapp最为关键的就是如何进行JSONRPC调用,以太坊官方提供了一个工具: Web3.js。如果你开发Đapp, 就必然需要使用它。
如何搭建一个测试网络并运行一个简单的 dapp http://ethfans.org/topics/85
Submitted by admin on 2016, December 13, 8:01 PM
ethereum-bootstrap是我建立的一个github项目,目的是帮助刚接触以太坊的同学快速的搭建起自己的本地开发环境,体验智能合约的开发。阅读本文需要有基本的编程知识。项目地址: https://github.com/janx/ethereum-bootstrap
通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私链进行开发测试。
仓库中包含的工具有:
contracts/Token.sol。这是一个使用合约语言Solidity编写的智能合约。Token合约的功能是发行一种token(可以理解为货币,积分等等),只有合约的创建者有发行权,token的拥有者有使用权,并且可以自由转账。测试账户私钥是放在Github上的公开数据,千万不要用于正式环境中或者公有链上。如果在测试环境之外的地方使用这些私钥,你的资金将会被窃取!
geth和solc命令。如果操作系统是ubuntu, 安装官方的ethereum安装包即可。git clone命令下载到本地。sudo apt-get install expectcd ethereum-bootstrap./bin/import_keys.sh./bin/private_blockchain.sh. 启动成功后可以看到类似如下输出: 
注意:工具脚本假设你的geth安装在默认位置, 可以直接通过geth执行。如果geth命令安装在非标准的位置,可以设置GETH环境变量指定geth可执行文件的路径。例如:
GETH=/some/weird/dir/geth ./bin/import_keys.sh
在contracts目录下有一个智能合约样例文件Token.sol, 通过Solidity语言实现了基本的代币功能, 合约持有者可以发行代币, 使用者可以互相转账.
我们可以使用以太坊控制台来编译部署这个合约.以太坊控制台是最基本的工具,使用会比较繁琐.社区也提供了其他更加方便的部署工具,此处不做讨论.
第一步,我们先把合约代码压缩为一行.新建一个ssh session, 切换到geth用户环境su - geth, 然后输入:cat contracts/Token.sol | tr '\n' ' '.
切换到以太坊控制台,把合约代码保存为一个变量:
var tokenSource = 'contract Token { address issuer; mapping (address => uint) balances; event Issue(address account, uint amount); event Transfer(address from, address to, uint amount); function Token() { issuer = msg.sender; } function issue(address account, uint amount) { if (msg.sender != issuer) throw; balances[account] += amount; } function transfer(address to, uint amount) { if (balances[msg.sender] < amount) throw; balances[msg.sender] -= amount; balances[to] += amount; Transfer(msg.sender, to, amount); } function getBalance(address account) constant returns (uint) { return balances[account]; } }';
然后编译合约代码:
var tokenCompiled = web3.eth.compile.solidity(tokenSource);
通过tokenCompiled.Token.code可以看到编译好的二进制代码,通过tokenCompiled.Token.info.abiDefinition可以看到合约的ABI.
接下来我们要把编译好的合约部署到网络上去.
首先我们用ABI来创建一个javascript环境中的合约对象:
var contract = web3.eth.contract(tokenCompiled.Token.info.abiDefinition);
我们通过合约对象来部署合约:
var initializer = {from: web3.eth.accounts[0], data: tokenCompiled.Token.code, gas: 300000}; var callback = function(e, contract){ if(!e) { if(!contract.address) { console.log("Contract transaction send: TransactionHash: " + contract.transactionHash + " waiting to be mined..."); } else { console.log("Contract mined!"); console.log(contract); } } }; var token = contract.new(initializer, callback);
contract.new方法的第一个参数设置了这个新合约的创建者地址from, 这个新合约的代码data, 和用于创建新合约的费用gas.gas是一个估计值,只要比所需要的gas多就可以,合约创建完成后剩下的gas会退还给合约创建者.
contract.new方法的第二个参数设置了一个回调函数,可以告诉我们部署是否成功.
contract.new执行时会提示输入钱包密码.执行成功后,我们的合约Token就已经广播到网络上了.此时只要等待矿工把我们的合约打包保存到以太坊区块链上,部署就完成了.
在公有链上,矿工打包平均需要15秒,在私有链上,我们需要自己来做这件事情.首先开启挖矿:
miner.start(1)
此时需要等待一段时间,以太坊节点会生成挖矿必须的数据,这些数据都会放到内存里面.在数据生成好之后,挖矿就会开始,稍后就能在控制台输出中看到类似:
:hammer:Mined block
的信息,这说明挖到了一个块,合约已经部署到以太坊网络上了!此时我们可以把挖矿关闭:
miner.stop(1)
接下来我们就可以调用合约了.先通过token.address获得合约部署到的地址, 以后新建合约对象时可以使用.这里我们直接使用原来的contract对象:
// 本地钱包的第一个地址所持有的token数量 > token.getBalance(web3.eth.accounts[0]) 0 // 发行100个token给本地钱包的第一个地址 > token.issue.sendTransaction(web3.eth.accounts[0], 100, {from: web3.eth.accounts[0]}); I1221 11:48:30.512296 11155 xeth.go:1055] Tx(0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c "0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef" // 发行token是一个transaction, 因此需要挖矿使之生效 > miner.start(1) :hammer:Mined block > miner.stop(1) // 再次查询本地钱包第一个地址的token数量 > token.getBalance(web3.eth.accounts[0]) 100 // 从第一个地址转30个token给本地钱包的第二个地址 > token.transfer.sendTransaction(web3.eth.accounts[1], 30, {from: web3.eth.accounts[0]}) I1221 11:53:31.852541 11155 xeth.go:1055] Tx(0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c "0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b" > miner.start(1) > miner.stop(2) > token.getBalance(web3.eth.accounts[0]) 70 > token.getBalance(web3.eth.accounts[1]) 30
私有链的所有数据都会放在仓库根目录下的data目录中,删除这个目录可以清除所有数据,重新启动新环境。
做完这些之后你应该对在以太坊私有链上进行开发有了一个大概的了解吧,如果还想学习更多知识,一可以看一看上面执行的脚本代码,到底干了些什么,用了哪些命令行参数,二可以阅读正在ethfans上更新的solidity文档中文版。
Submitted by admin on 2016, December 13, 8:00 PM
对于开发者而言,在一个新平台上开发应用之前,一个可控的测试环境是必不可少的。
对于普通用户而言,在正式的链上开始使用钱包转账,在etherex挂单等等严肃操作之前,先在一个demo程序上熟悉下功能,也能减少出错概率。
以太坊作为一个“去中心化的应用平台”,也确实给搭建测试网络提供了很多便利。以下我们就一步一步的介绍如何搭建一个测试链,并在测试链上运行ethereum.org上的hello world程序。
geth --bootnodes "enode://7cc0c2e8abd944d6bee8966fc21b0597de27ef912614ff1b7b4f2c51b7d72078d05038435686f8821aa7ce6918a6065192368bb05cd50a908ed2f8958dfa7197@115.29.32.87:30303" --datadir "YOURTESTNETDATADIR" --genesis "EXAMPLEGENESIS.json" --networkid 12345 --nodiscover console
当屏幕上出现这样的文字后 modules: admin:1.0 db:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 shh:1.0 txpool:1.0 web3:1.0 你就进入了以太坊的命令行控制界面
在以太坊的命令行界面输入如下命令创建一个新的账户
personal.newAccount('ethfans')
admin.addPeer("enode://7cc0c2e8abd944d6bee8966fc21b0597de27ef912614ff1b7b4f2c51b7d72078d05038435686f8821aa7ce6918a6065192368bb05cd50a908ed2f8958dfa7197@115.29.32.87:30303")
然后输入admin.peers检查是否已添加成功远程节点, 添加失败的话会返回null
miner.start()
待续
Submitted by admin on 2016, December 13, 7:59 PM
etherenum钱包安装
Submitted by admin on 2016, December 13, 7:58 PM
wget -c http://golangtc.com/static/go/1.7.4/go1.7.4.linux-amd64.tar.gz
Submitted by admin on 2016, December 13, 7:23 PM
enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333设置为默认连接节点
检查是否连接成功