【区块链学习笔记】以太坊、智能合约
imToken 是一款全球领先的区块链数字资产管理工具[ZB],帮助你安全管理BTC, ETH, ATOM, EOS, TRX, CKB, BCH, LTC, DOT, KSM, FIL, XTZ 资产,同时支持去中心化币币兑换功能 ...
目录
1. 以太坊
以太坊是区块链2.0时代的代表,也是全球第一个ICO项目。
1.定义
以太坊()是一个具备智能合约功能的开源公有区块链平台,通过其专用加密货币以太币(Ether)提供去中心化的以太坊虚拟机( )来处理点对点合约,属于区块链2.0架构。
从上面的定义我们可以看出,以太坊与比特币类似,都是基于区块链技术的分布式计算平台。但它强调的是它是一个智能合约系统。其实它的本质和比特币是一样的。只不过在这个平台上可以任意生成多个不同的比特币系统。
以太坊涉及三个基本概念:
2. 以太坊与比特币的关系
比特币的缺点:
以太坊优化:
建立了图灵完备的底层体系,可以通过简单的程序实现各类数字资产的生产,可编程的、图灵完备的区块链网络可以实现更多的非资产功能性产品。
以太坊技术=区块链技术+智能合约
3. 以太坊共识
以太坊后续三个版本的共识机制均采用PoW,目前正在向混合共识机制过渡,以太坊的混合共识机制为PoW+POS,平衡了矿工和持币者的利益。
二、智能合约 1、智能合约的定义
智能合约:是指通过计算机程序定义、可以自动执行的承诺和协议。
以太坊智能合约:存在于以太坊区块链上的特定地址的代码(即合约函数)和数据(即合约状态)的集合。合约账户之间可以传递信息,并执行图灵完备的操作。合约依靠以太坊虚拟机(EVM)以二进制字节码格式在区块链上运行。
以太坊智能合约可以分为五类:
2. 智能合约的工作原理 3. 智能合约的优势
优势:
4. 编译智能合约并修改智能合约源代码
在部署智能合约之前,您需要两样东西:编译后的代码和应用程序二进制接口,后者是定义如何与合约交互的参考模板。
安装智能合约编译工具
安装智能合约编译工具solc,solc是一个命令行编译器,是编译方式之一。
在系统终端中输入命令行即可安装成功。
在Ubuntu系统
在终端中执行以下命令:
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
which solc
在MAC OSX上,您也可以在终端中输入命令行。
在Mac OSX系统中
在终端中执行以下命令:
brew tap ethereum/ethereum
brew install solidity
which solc
在系统中,需要安装,该工具可以管理其上的软件,然后执行命令行。
在Windosw系统中
需要安装chocolatey (https/chocolsteyorg/),该工具可以在windows上管理软件。
在终端中执行以下命令:
cinst -pre solC-stable
最后,从源代码安装 solc。
在终端中执行以下命令:。
git clone https://github.com/ethereum/cpp-ethereum.git
mkdir cpp-ethereum/build
cd cpp-ethereum/build
cmake -DISONRPC=OFF -DMINER=OFF -DETHKEY=OFF -DSERPENT=OFF-DGUI=OFF -DTESTS=OFF -DJSCONSOLE=OFF
make -j4
make install
which solc
在命令行中输入如下bin命令,编译智能合约代码solc:
solc --bin HelloWorld.sol
除了字节码数据之外,还需要一个abi接口,通过执行abi命令:
solc --bin HelloWorld.sol
获取abi信息,后续测试部署可能会用到。
5.智能合约测试
以下是智能合约的示例
pragma solidity ^0.4.20;
contract Simplestorage {
uint storedData;
function set(uint x){
storedData= x;
}
function get() constant returns(uint){
return storedData;
}
}
测试智能合约的三种方法:
混音+
+
智能合约测试工具的安装和使用
混音+
Remix 是浏览器版的开发 IDE(集成开发环境),可以在线使用,也可以本地安装。它是一个充当轻量级以太坊钱包的浏览器插件,可以配合谷歌或火狐浏览器使用。安装方式是直接在浏览器应用商店搜索,或者在官网下载安装。
以太坊钱包安装完成后,首先使用Remix发布智能合约,发布成功后右侧会展示成功发布的智能合约及合约相关信息,包括合约地址以及对外暴露的接口。 +
如果已经安装好了那么直接打开以太坊钱包官网(首先需要自己安装node环境和cnpm)
(1)安装:
cnpm ig
(2)创建项目:
mkdir && cd
初始化
(3)项目结构:
该目录中存放的是合约代码imToken官网下载,该目录中存放的是js脚本,该目录中存放的是测试用例。
(4)编写代码、部署和调试
新建Hello.sol文件;
注意:
类名Hello需要与文件名Hello.sol保存一致
.sol 文件无法被删除。
在目录下添加对应的js脚本.js
添加代码后,打开终端,切换到项目路径,执行代码。
传统虚拟机
虚拟机:其实并不是物理计算机,而是模拟物理计算机的软件环境,但虚拟机可以像物理计算机一样运行程序。用于承载虚拟机的物理计算机通常可以支持多台虚拟机。另外,虚拟机的概念不仅存在于系统层面,也存在于编程语言中。
虚拟机用来解决什么问题?
为了抽象出底层硬件,从系统层面来看,硬件和操作系统变得越来越多样化。
能够自动兼容所有硬件,综上所述,虚拟机技术的实现基本上就是将硬件层或者系统层抽象出来,使得应用层屏蔽了底层的实现细节,有利于应用程序的快速实现和部署。
1、虚拟机的分类
根据级别可分为三类:
然而,级别越低,实施起来就越困难。
2.区块链虚拟机
传统精简指令集计算机:这种类型的计算机CPU只提供有限的执行指令和内存,但是各类应用程序都可以在这种计算机上运行。
原理:因为系统中有一个“虚拟机”,把高级语言的执行转换成CPU的相关执行指令。高级语言提供语法,人们利用高级语言开发相关的应用程序。
其层次结构从低到高依次为:硬件指令、虚拟机、高级语言、应用层。
如果要在区块链中支持各种应用,也需要这样的分层结构。因此,区块链需要提供一套指令,区块链中的虚拟机可以解释这些指令。另外,高级语言的实现需要编译器将实现编译成虚拟机支持的指令。这样,区块链就完美地支持了语言与业务的分离,从而可以在区块链中开发各种业务应用。
虚拟机架构的组成部分:
有两个重要组成部分:
当所有部分都准备好之后,我们就可以使用高级语言和 API 来编写符合业务逻辑的智能合约,然后使用相关的编译器将智能合约编译成字节码,同时生成相关的 ABI 描述。经过严格的测试之后,智能合约的字节码和 ABI 就可以以交易的形式发布到区块链上。
矿工会验证你的交易的合法性,如果成功打包进区块,会返回智能合约地址。用户会调用这个合约地址获取ABI,然后根据ABI中功能接口的描述,发起交易去调用功能接口,从而实现相关功能或者获取相关结果。矿工也会验证这笔交易的合法性以太坊和比特币区块链钱包,并处理成区块。
将经过严格测试的智能合约代码发布到区块链上,可以理解为一笔特殊的交易——包含可执行代码的交易,随后会被矿工记录到区块中。当需要调用这个智能合约时,只需要向这个智能合约的地址发送一笔交易即可。因为每个节点都需要安装以太坊客户端,而每个客户端都自带一个 EVM(以太坊虚拟机)。当交易触发智能合约后,智能合约的代码就可以在 EVM 上执行。
这种方式相当于把程序部署在很多台计算机上,随时可以通过交易来触发这些智能合约的执行,从而完成去中心化程序的部署与调用。
DAPP是运行在以太坊上的去中心化应用程序,涉及到传统行业的各个环节。
四、以太坊的共识机制及挖矿原理 1.共识机制
以太坊为什么需要共识机制?
在分布式系统中,多台主机通过异步通信组成网络集群。在这样的异步系统中,主机之间需要进行状态复制,以保证各主机达成一致的状态共识。在运行过程中,主机故障可能造成通信失败、主机性能下降、网络拥塞等,从而导致错误信息在系统内传播。因此需要在不可靠的异步网络中定义一个容错协议,以保证各主机达成安全可靠的状态共识。
以太坊共识机制版本
如果单纯根据 token 余额来决定记账人,必然是富人获胜,导致记账权中心化,降低共识的公平性。那么如何解决记账权中心化的问题呢?不同的 PoS 机制采用不同的方式,在权益证明的基础上增加记账权的随机性,避免中心化。
2. 以太坊挖矿原理
采矿过程
共识机制:PoW(工作量证明)
算法:(-算法的改进版本)
对于每个区块,首先计算一个种子,这个种子只和当前区块的信息相关,然后根据这个种子生成一个32M的随机数据集,再根据这个随机数据集生成一个1G的DAG(有向无环图)。
挖矿的过程是从DAG中随机选取元素(类似比特币挖矿找一个合适的Nonce),然后进行hash运算,从缓存中快速计算出DAG指定位置的元素,然后进行hash计算和验证。
挖矿步骤