解密区块链:从基础概念到技术实现的进阶攻略2

于姜萍
于姜萍 热门 2017-10-11 01:26
15 34079



三、以太坊开发  搭建本地测试网络  
 
为了搭建本地测试网络,需要完成三件工作:
  • 构建geth客户端
  • 构建solidity编译器
  • 运行geth客户端

 
以下就分别开始介绍。
 
Ethereum客户端类似于Java虚拟机,按照黄皮书执行;项目早期,在不同的操作系统中就有多个可以彼此协作的客户端实现:go-ethereum、cpp-ethereum、pyethapp、ruby-ethereum等等。
 
进入Homestead阶段后,Go客户端(geth)占据了主导地位,因此我们也采用go-ethereum完成测试网络的搭建。
 
1. 首先在选择的目录下clone客户端代码go-ethereum
 

 
2. 构建geth前需要安装额外库:
 
mac系统:
  • 建议使用gvm管理go的版本:参见-https://github.com/moovweb/gvm

 
ubuntu系统:
  • 参见-https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Ubuntu

 
3. 最后,就可以使用以下命令编译geth了:
 

 
编译成功生成build/bin/geth
 
现在进入构建solidity编译器(源码安装)的流程:
 
1. 首先在选择的目录下clone solidity的编译器代码
 

 
2. 安装依赖
 

 
3. 最后,就可以使用以下命令编译solc了
 

 
geth和solc编译完成后,重新回到go-ethereum代码根目录
 

 
1. 创建初始区块:
 
初始区块是区块链的起始:第一个区块,区块0,唯一没有指向前面区块的一个区块。除非与其他节点具有相同的初始区块,协议确保了这些节点不会和该区块链一致。这样就可以创建任意的私有测试网络区块链。


 

 
2. 启动geth:
 

 
下面介绍上述命令中的主要参数:
 
1. --nodiscover:使用这个命令可以确保你的节点不会被非手动添加你的人发现。否则,你的节点可能被陌生人的区块链无意添加,如果他和你有相同的初始文件和网络ID。
 
2. --rpc:可以激活你节点上的RPC接口。它在geth中通常被默认激活。
 
3. --rpcapi:这个命令可以决定允许什么API通过RPC进入。在默认情况下,geth可以在RPC激活web3界面。
 
4. --rpcport:改变RPC上的开放端口。
 
5. --rpccorsdomain “*”:可以指示什么URL能连接到你的节点来执行RPC定制端任务。
 
6. --datadir “test/chain”:私有链数据所储存在的数据目录
 
7. --identity:为节点设置一个身份,使之更容易在端点列表中被辨认出来。
 
8. --solc:制定solc编译器
 
智能合约  
 
编写智能合约的高级语言有:solidity、serpent、LLL、Mutan。
 
  • Solidity类似于Javascript,也是目前最流行的。
  • Serpent类似于Python。
  • LLL是类似于汇编的底层语言。
  • Mutan是C-like的编程语言,不过已经被废弃了。
15条回应 最新 最早
于姜萍
沙发# 于姜萍 九级码农 2017-10-11 01:28
我们以multiply为例开始第一个Solidity的智能合约。

  • 第一步:创建一个EOA用户并设置密码



  • 第二步:查看新用户的余额,并且开始挖矿



  • 第三步:新建一个命令窗口,并连接到正在挖矿的窗口



  • 第四步:确认用户余额有所增加



  • 第五步:编译

合约代码如下:

contract test {
 function multiply(uint a) returns(uint d) {
   return a * 7;
 }
}



首先将合约test赋值变量source,然后使用solidity编译器进行编译,将返回结果赋值给contract。

下面简要描述一下contract的字段:

  • code: 编译的以太坊虚拟机字节代码
  • info: 从编译器输出的额外元数据
  • source:源代码
  • language: 合约语言(Solidity、Serpent、LLL)
  • languageVersion:合约语言版本
  • compilerVersion:编译器版本号
  • abiDefinition:应用的二进制接口定义

  • 第六步:部署合约

确保有解锁的账户和资金,部署完成后,在区块链上就会创建一个合约。这一步骤是需要支付执行的。一旦transaction成功进入区块,账户余额会根据以太坊虚拟机的gas规则被扣减。



  • 第七步:与合约交互

与合约交互典型做法是使用eth.contract()功能的抽象层,它会返回javascript对象。描述合约可用功能的标准方法是ABI定义。



当sendTransaction被调用时,功能调用通过发送transaction来执行。需要花费以太币发送,记录会永久记录在区块链上。这种方式返回的是transaction散列。

当call被调用时,功能在以太坊虚拟机本地执行。用这种方式进行的调用不会记录在区块链上,因此不会改变合约内部状态。这种调用方式被称为恒定功能调用,不花费以太币。

最后,有兴趣的朋友,也可以尝试testrpc和truffle,更加方便。

声明:文中关于“Ethereum Homestead 0.1 documentation”来自ethereum社区。如想了解更多,可通过ethereum社区官网进一步学习。

Q&A  

Q1:一次交易都要在以太坊的所有节点的EVM上执行一遍吗?
A1:是的。区块链其实是比较昂贵的,它的目的不是为了提升效率。在Ethereum Homestead里是这样描述的:Each and every full node in the network does the same calculations and stores the same values. Clearly Ethereum is not about optimising efficiency of computation. Its parallel processing is redundantly parallel.

Q2:哪些公司用以太坊做开发基础?
A2:国内的金丘股份,万向区块链实验室,众安保险,蚂蚁金服。

Q3:智能合约的代码量最大是1M吗?也就是一个区块的大小?
A3:1M是比特币的区块限制。

Q4:以太坊同步一次要多久?
A4: 比特币区块链的大小约为84.9GB,现在以太坊的区块链还比较小,第一次同步的时候,持续的十个小时左右,于网络速率有关。

Q5:如果由于网络中断,导致出现两条链,当网络恢复后,如何合并这两条链?
A5:不会合并的。最终还是拼的算力。
(接上一问)
Q6:这样不是会导致很多分叉吗?
A6:短时间是可能存在分叉的,但最终不会有分叉存在,例如比特币”为了防止该区块因为子链太短而被其它节点抛弃,那么还得等产生6个新的后续区块,才能最终确认该transaction已经被可靠地写入区块链中。即,确保可靠写入,需要约60分钟。 ”版本升级时,是有可能存在分叉问题的,因为有些矿工不愿意升级。

Q7:如果智能合约太大,无法在一个区块中写入,以太坊如何操作?
A7:因为合约之间可以通过消息调用,所以可以把代码拆开,分别deploy。当然前提是真得有这么大的合约。
刘超
板凳# 刘超 2017-10-14 13:23
建新
地板# 建新 2017-10-21 22:01
使用这个命令可以确保你的节点不会被非手动添加你的人发现
legundo
4楼# legundo 2017-10-25 20:31
你的节点可能被陌生人的区块链无意添加
吴小文
5楼# 吴小文 2017-10-28 02:42
搭建本地测试网络
邹家挺
6楼# 邹家挺 2017-10-31 22:10
段启刚
7楼# 段启刚 2017-11-12 23:57
如果他和你有相同的初始文件和网络
楚梦颖
8楼# 楚梦颖 2017-11-13 21:17
私有链数据所储存在的数据目录
拟似
9楼# 拟似 2017-11-14 05:50
完成测试网络的搭建
谢大人
10楼# 谢大人 2017-11-14 12:07
编写智能合约的高级语言有
风继续吹~
11楼# 风继续吹~ 2017-11-21 10:04
初始区块是区块链的起始
情深缘浅
12楼# 情深缘浅 2017-12-04 12:33
协议确保了这些节点不会和该区块链一致
杨梅
13楼# 杨梅 2017-12-07 13:22
杉
14楼# 2017-12-12 16:13
这样就可以创建任意的私有测试网络区块链
1
游客
登录后才可以回帖,登录 或者 注册