工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

区块链开发(二)以太坊客户端操作命令

 启动命令

重复上篇文章步骤,先将区块链客户端启动,命令如下:
geth --identity "secbro etherum" --rpc --rpccorsdomain "*" --datadir "/home/zhuzs/eth/chain" --port "30303" --rpcapi "db,eth,net,web3" -- networkid 95518 console --dev
看到启动页面之后,新开启一个终端,并执行一下命令,并把日志输出到文本文件当中:
geth --dev console 2>> file_to_log_output
这些需要注意的是,在启动客户端时添加了参数–dev,开发模式,这里直接使用dev参数来调用使用启动的服务,显示结果如下:
在这里可以执行具体的操作命令。
 
查看账户
eth.accounts
 
创建用户:
personal.newAccount("111111")
其中参数为此账户的密码。
也可以先创建账户,然后输入密码:
personal.newAccount()
 
查看区块数据
eth.blockNumber
 
启动挖矿
miner.start()
返回结果为true则启动成功,具体执行情况可查看日志。
 
停止挖矿
miner.stop()
当在执行挖矿时日志会不停刷屏,不用管,只要命令输入全,执行即可停止挖矿。
 
查看账户余额
其中参数为区块链地址
eth.getBalance("0x7d1f7be4112ce63b9de04a0bf95c1e87e430bd1b")
 
转账
从账户0x7d1f7be4112ce63b9de04a0bf95c1e87e430bd1b转账3个以太币到0x587e57a516730381958f86703b1f8e970ff445d9
eth.sendTransaction({from:"0x7d1f7be4112ce63b9de04a0bf95c1e87e430bd1b", to:"0x587e57a516730381958f86703b1f8e970ff445d9",value:web3.toWei(3,"ether")})
当直接执行此方法时会抛出异常:
account is locked
at web3.js:3119:20
at web3.js:6023:15
at web3.js:4995:36
at <anonymous>:1:1
很明显,账户被锁。
 
解锁转出账户
其中第一个参数为转出账户,第二个参数为密码。也可以直填写第一个参数,然后通过命令行提示再输入密码。
personal.unlockAccount("0x7d1f7be4112ce63b9de04a0bf95c1e87e430bd1b","111111")
解锁完成之后,即可执行转账操作。但此时查看时会发现接收账户依旧为原来数值。此时需要执行挖矿命令,才会把转账真正完成。

以太坊不同客户端的定义和用途

 以太坊发布以后,有多个客户端,同时也支持多个平台,初学者往往被各种各样的客户端弄迷糊,本文进行了详细的总结。

 
以太坊客户端以语言进行分类,在github上分成了不同项目,源代码地址:https://github.com/ethereum/,虽然以太坊客户端众多,但是有两个共同特点:
 
1、同一语言的客户端在不同平台上的使用是完全相同的
 
2、不同语言的客户端(mist、geth、eth等等)之间在同一个平台(linux、windows或OSX)上共用一样的应用配置,同时其命令行可使用的参数也是一致。
 
下面就以github上的项目为分类说明各个客户端的用途和特点:
 
一、go-ethereum项目
 
开发语言:go语言
客户端文件:Geth
界面:命令行
适用平台:windows、linux和OSX
功能和特点:该项目是使用最广泛的以太坊客户端,大部分节点都是运行的该客户端,教程和例子也最多,推荐使用,可用于挖矿,组建私有链,管理账号,部署智能合约等常用功能,不可以编译智能合约。
 
二、webthree-umbrella项目
 
此项目包含3个客户端
开发语言:c++
客户端文件:AlethZero、Mix和Eth
使用平台:windows、linux和OSX
界面:图形化界面
功能和特点:该项目严格来说是cpp-ethereum 项目的一个shell,是以太坊基金会的前CTO,Gavin Wood主持编写的,所以人气也很高,易用性也很好。AlethZero是图形化的钱包客户端,对应的是Geth的功能,不过是全图形化的。但是随着后续以太坊基金会主推的图形化钱包Mist的推出,渐渐没落。Mix 是智能合约(以太坊称为DAPP)的开发IDE,可以支持智能合约(DAPP)的编写、调试,部署,全图形化界面,目前最主流的以太坊智能合约开发平台,非常方便,强烈推荐。Eth是C++编写的命令行客户端功能和Geth一样。
 
三、Mist项目
 
开发语言:JavaScript
客户端文件:Mist(目前使用Ethereum-Wallet的名称)
使用平台:windows、linux和OSX
界面:图形化界面
功能和特点:该项目是以太坊基金会主推的项目,Mist定位不只是一个钱包,而是将来DAPP(智能合约的应用APP)市场,类似于苹果市场,在这里可以有你的账号,可以浏览、发布和买卖以太坊的DAPP应用。目前因为开发还不够全面,名称暂时显示为Ethereum-Wallet,作用也很简单,就是一个钱包的功能。强烈推荐,未来的主流客户端。
 
四、solidity项目
 
开发语言:C++
客户端文件:solc
使用平台:windows、linux和OSX
界面:命令行界面
功能和特点:该项目是以太坊智能合约(DAPP)的编程语言,使用solc作为编译程序,该项目主要用于编译,严格来说是一个基本的编译平台,一般开发可用MIX替代。
 
五、browser-solidity项目
 
开发语言:C++
客户端文件:浏览器中显示
使用平台:windows、linux和OSX
界面:浏览器界面
功能和特点:该项目是智能合约浏览器版本的开发环境,可以支持在浏览器中直接开发、调试和编译,对于初学者来说,可以快速上手,不需要安装,非常方便,直接访问地址使用:https://ethereum.github.io/browser-solidity/
 
六、pyethereum项目和ethereumj项目
 
pyethereum项目是用python语言编写的以太坊客户端,ethereumj项目是用JAVA语言编写的以太坊客户端,只是语言不同,和前面GO语言编写的客户端Geth的功能完全相同。
 
七、etheminer项目
 
开发语言:C++
客户端文件:ethminer
使用平台:windows、linux和OSX
界面:命令行
功能和特点:该项目是cpp-ethereum项目的一部分,用于和Geth配合进行GPU挖矿,比CPU挖矿效率高100多倍,也可以用于矿池挖矿。

以太坊开发快速上手指南 + 开发相关文章

 

以太坊快速上手指南

在正式开始前,首先推荐过下这篇文章 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提供两种智能合约编程语言SoliditySerpentSolidity的语法类似于JavaScript,而Serpent的语法接近于Python。但也仅仅是语法有点类似,事实上有着巨大的差别,学习时不能简单的代入理解。如果你对编程语言没有偏好,请选择Solidity,也是默认的智能合约编程语言。Solidity文档中文版(正在翻译中,欢迎开发者参与翻译):http://ethfans.org/posts/solidity-content 。

如果不想搭建完整的ethereum开发环境,只是想了解下Solidity,可以看下这个项目:Browser-Solidity

常用辅助工具和开发环境

以太坊的开发生态正在日益完善,相比刚发布时的裸写,现在已经有很多开发工具供选择了。

以太坊本地私有链开发环境搭建教程(中文) : http://ethfans.org/posts/ethereum-private-network-bootstrap

Đapp

通常你都是在写一个面向最终用户的应用,这时你需要一个界面。以太坊的开发者通常使用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

以太坊本地私有链开发环境搭建

 ethereum-bootstrap是我建立的一个github项目,目的是帮助刚接触以太坊的同学快速的搭建起自己的本地开发环境,体验智能合约的开发。阅读本文需要有基本的编程知识。项目地址: https://github.com/janx/ethereum-bootstrap

Ethereum Bootstrap

通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私链进行开发测试。

仓库中包含的工具有:

  • 一个测试账户导入脚本,在首次部署时将五个测试账户私钥导入以太坊节点。
  • 一个genesis.json配置文件,为对应的五个测试账户提供初始资金(以太币),方便开发测试。
  • 一个快速启动私有链节点并进入交互模式的脚本。
  • 一个合约样例:contracts/Token.sol。这是一个使用合约语言Solidity编写的智能合约。Token合约的功能是发行一种token(可以理解为货币,积分等等),只有合约的创建者有发行权,token的拥有者有使用权,并且可以自由转账。

测试账户私钥是放在Github上的公开数据,千万不要用于正式环境中或者公有链上。如果在测试环境之外的地方使用这些私钥,你的资金将会被窃取!

准备

  1. 在本地安装好go-ethereumsolc, 可以执行gethsolc命令。如果操作系统是ubuntu, 安装官方的ethereum安装包即可。
  2. 将本仓库通过git clone命令下载到本地。
  3. 安装expect,工具脚本用它来自动化一些过程。例如在ubuntu上: sudo apt-get install expect

启动geth

  1. 进入本仓库目录: cd ethereum-bootstrap
  2. 导入测试账户私钥: ./bin/import_keys.sh
  3. 启动私有链节点: ./bin/private_blockchain.sh. 启动成功后可以看到类似如下输出: 
  4. 此时以太坊交互式控制台已经启动,我们可以开始测试和开发了。

注意:工具脚本假设你的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, 和用于创建新合约的费用gasgas是一个估计值,只要比所需要的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文档中文版

 

http://ethfans.org/posts/ethereum-private-network-bootstrap

如何搭建一个测试网络并运行一个简单的 dapp

对于开发者而言,在一个新平台上开发应用之前,一个可控的测试环境是必不可少的。
对于普通用户而言,在正式的链上开始使用钱包转账,在etherex挂单等等严肃操作之前,先在一个demo程序上熟悉下功能,也能减少出错概率。

以太坊作为一个“去中心化的应用平台”,也确实给搭建测试网络提供了很多便利。以下我们就一步一步的介绍如何搭建一个测试链,并在测试链上运行ethereum.org上的hello world程序。

准备工作

  1. 安装geth
  2. 如果你准备连接到我在阿里云上的testnet, 下载这个创世块
  3. 如果你要搭建自己的testnet,可以参照这里的格式创建创世块

开始

  • 首先打开你的终端输入如下命令启动geth
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')
  • 加入阿里云上我搭建的testnet node(如果你搭建一个人的testnet,不需要这一步)
admin.addPeer("enode://7cc0c2e8abd944d6bee8966fc21b0597de27ef912614ff1b7b4f2c51b7d72078d05038435686f8821aa7ce6918a6065192368bb05cd50a908ed2f8958dfa7197@115.29.32.87:30303")

然后输入admin.peers检查是否已添加成功远程节点, 添加失败的话会返回null

  • 开始挖矿(第一次挖矿需要生成一个2G的DAG文件,耗时10分钟左右,具体时长取决于电脑性能)
miner.start()

待续

etherenum钱包安装

 etherenum钱包安装

https://github.com/ethereum/go-ethereum/archive/v1.5.4.tar.gz
 
 geth
geth -datadir "D:ethereum"
geth account new
geth account list
geth wallet import
geth console
 
get attach
net.listening
net.peerCount
admin.peers
admin.nodeInfo
eth.blockNumber
eth.accounts
 
创建用户:
personal.newAccount("111111")
其中参数为此账户的密码。
也可以先创建账户,然后输入密码:
personal.newAccount()
 
查看账户余额
其中参数为区块链地址
eth.getBalance("0x7d1f7be4112ce63b9de04a0bf95c1e87e430bd1b")
eth.getBalance(eth.accounts[0])
 
personal.unlockAccount(eth.accounts[0], '123456')
 
启动挖矿
miner.start()
miner.stop()
 
首先,输入geth console,回车。
方法一:
然后,解锁账户。输入personal.unlockAccount(addr, passwd, duration),addr是你的地址,passwd是账户密码,duration是账户处于解锁状态的时间,例如300表示在300秒内无需再次解锁。建议在记事本中写完此命令,复制到geth中。成功解锁账户,界面会返回 true。
 
 
testrpc. 用geth可以创建一个测试网络,另一种更快的创建测试网络的方法是使用testrpc. Testrpc可以在启动时帮你创建一堆存有资金的测试账户。它的运行速度也更快因此更适合开发和测试。你可以从testrpc起步,然后随着合约慢慢成型,转移到geth创建的测试网络上 - 启动方法很简单,只需要指定一个networkid:geth --networkid "12345"。这里是testrpc的代码仓库,下文我们还会再讲到它。
 

go linux 安装

 wget -c http://golangtc.com/static/go/1.7.4/go1.7.4.linux-amd64.tar.gz

tar zxvf go1.7.4.linux-amd64.tar.gz
 
vi .bashrc
export GOROOT=/root/go
export PATH=$GOROOT/bin:$PATH
export GOPATH=/root/go/src
 
 
yum install -y mercurial
yum install -y git

快速同步以太坊区块链:Geth长期节点连接方法

为了帮助国内的同学们以最快的速度同步以太坊的区块链,EthFans社区建立了一个长期节点,地址为:

enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333设置为默认连接节点

如果你是geth用户,可以做如下设置,默认连接这个节点:
  • 找到你的data目录,例如linux上默认是~/.ethereum
  • 在data目录里面新建一个static-nodes.json文件,输入以下内容并保存:
    ["enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333"]
  • 如常启动geth即可

检查是否连接成功

  • 通过geth console进入控制台,或者通过geth --ipcpath ~/.ethereum/geth.ipc attach开控制台挂上当前进程
  • 控制台中输入:admin.peers.forEach(function(p) {console.log(p.network.remoteAddress);})
  • 如果打印出的地址里面包括120.27.164.92, 说明已经连上
更多连接设置可以参考文档: [color=rgb(0, 105, 214) !important]https://github.com/ethereum/go-ethereum/wiki/Connecting-to-the-network
链接该节点的第二个方法:
首先,用geth命令打开命令行钱包,然后新建一个终端窗口,输入命令 geth attach。
然后,在新窗口中输入命令行admin.addPeer("enode://91922b12115c067005c574844c6bbdb114eb262f90b6355cec89e13b483c3e4669c6d63ec66b6e3ca7a3a462d28edb3c659e9fa05ed4c7234524e582a8816743@120.27.164.92:13333"),enter键。
最后,检查是否连接成功。输入命令行 admin.peers,enter键。查看列出的节点中有没有上面的节点。
参考文档:[color=rgb(0, 105, 214) !important]https://ethereum.gitbooks.io/frontier-guide/content/connecting.html

 

http://ethfans.org/topics/150