区块链开发平台(以太坊)

6.1项目介绍
以太坊是一个通用的全球性区块链,属于公有链,可以用来管理金融和非金融类型的应用,同时以太坊也是一个平台和编程语言,包括数字货币以太币以及用来构建和发布分布式应用的以太脚本,也就是智能合约编程语言。国内最大的以太坊中文技术社区http://ethfans.org
6.1.2以太坊组成
以太坊=区块链+智能合约
区块链开发平台(以太坊)
文章图片
以太坊中的智能合约是运行在虚拟机上的,也就是通常说的EVM(Ethereum Virtual Machine,以太坊虚拟机)。这是一个智能合约的沙盒,合约存储在以太坊的区块链上,并被编译为以太坊虚拟机字节码,通过虚拟机来运行智能合约。由于这个中间层的存在,以太坊也实现了多种语言的合约代码编译,网络中的每个以太坊节点运行EVM实现并执行相同的指令。
比特币交易事务的结构中拥有锁定脚本和解锁脚本两段指令程序。从技术上来讲,比特币系统就是通过执行交易事务中的锁定脚本和解锁脚本完成了比特币的发行和转账交易,也就是说比特币中的一切机制都是为了这一固定功能的合约而运行存在的。如果把锁定脚本和解锁脚本的编程能力加强,使智能合约的能力不只是实现一个数字货币的转账交易,那就打开了另一片天地。不管是什么功能的合约,站在技术角度讲,无非就是通过执行一组程序改变了一些值。我们不但可以实现数字货币,还可以实现众筹合约、担保合约、融资租赁合约、期货合约以及各种其他金融与非金融的订单合约,所有这些合约的执行都会被以太坊打包进区块,这样就实现了基于区块链的全功能智能合约。
以太坊的源码GitHub: https://github.com/ethereum
6.1.3关键概念
1.状态
以太坊的目标就是提供一个带有内置的成熟的图灵完备(什么叫图灵完备??)语言的区块链,用这种语言可以创建合约来编码任意状态转换功能。
从技术角度讲,比特币账本可以被认为是一个状态转换系统,该系统包括所有现存的比特币所有权状态和“状态转换函数”。状态转换函数以当前状态和交易为输入,输出新的状态。
对于区块链账本,这里的变化可以是指一笔转账,也可以是合约的某个规则被激活等,总之就是数据动了,以太坊中将变化的过程称为状态转换函数。
区块链开发平台(以太坊)
文章图片
通过这样一种更高层面的抽象,就使以太坊的设计具备了实现任意智能合约的基础,这里的状态数据可以是任何形式的(包括比特币那种UTXO的机制),状态函数也可以是任何过程的,只要符合业务需求即可,没有任何限制。
在以太坊的每一个区块头,都包含了指向三棵树的指针,分别是:状态树、交易树、收据树。交易树指针就类似于比特币区块头中的梅克尔根树,交易树用来代表区块中发生的所有交易历史的;状态树代表访问区块后的整个状态;收据树代表每笔交易对应的收据,所谓的收据是指每一笔交易影响的数据条,或者说是每一笔交易影响的结果。这些都是针对比特币中单一的梅克尔交易树的增强,通过状态树可以很方便地获得类似账户存在与否、账户余额、订单状态这样的结果,而不用只依靠交易事务去追溯。
区块链开发平台(以太坊)
文章图片
2.账户
以太坊中的账户,既然是账户就应有账户结构,通常包含下面4个部分:
1)随机数,用于确定每笔交易只能被处理一次的计数器,实际上就是每个账户的交易计数,用以防止重放攻击,当一个账户发送一笔交易时,根据已经发送的交易数来累加这个数字,比如账户发送了5个交易,则账户随机数是5.
2)账户目前的以太币余额
3)账户的存储(默认为空)
4)账户的合约代码(只有合约账户才有,否则为空)
以太坊源码中的账户的定义描述:
//以太坊中的账户对象结构定义
//这些数据对象会存储在以太坊中的梅克尔树中
type Account struct {
Nonceuint64
Balance*big.Int
Rootcommon.Hash //merkle root of the storage trie
CodeHash []byte
}
以太坊中的账户是区分类型的。
<1> 外部账户
外部所有账户,术语叫EOA,全称是Externally Owned Account,这个就是一般账户的概念。外部所有账户是由一堆密钥定义的,一个私钥一个公钥,公钥的后20位作为地址,这个跟比特币中的公私钥以及钱包地址类似。外部所有账户是没有代码的,但是可以通过创建和签名一笔交易从一个外部账户发送消息到合约账户,通过传递一些参数,比如EOA的地址、合约的地址,以及数据(包括合约里的方法以及传递的参数),使用ABI(application Binary Interface)作为传递参数的编码和解码的标准。
<2> 合约账户
合约账户是一种特殊的可编程账户,合约账户可以执行图灵完备的计算任务,也可以在合约账户之间传递消息,合约存储在以太坊的区块链上,并被编译为以太坊虚拟机字节码,合约账户也是有地址的,不过与外部所有账户不同,不是根据公钥来获得的,而是通过合约创建者的地址和该地址发出过的交易数量计算得到。
我们可以看到,外部所有账户在以太坊中就相当于一把钥匙,合约账户则相当于一个机关,一旦被外部账户确认激活,机关就启动了。
比如EON的空投,如果把EOS存在了imtoken:
EON根据EOS ERC20 token在新加坡时间6月1日12点快照,EOS数量大于100的用户可以通过claim的方法获得空投。claim的方法为
通过准备接收空投的ETH地址,向我们的token合约发送指令0x4e71d92d
合约地址如下:
https://etherscan.io/token/0xeb96f4caaea05e69f41c25ae42b58f3fff7df628d
3 交易
以太坊中交易的概念比较广义,因为以太坊并不仅仅支持转账交易这样的合约功能,它的定义如下:在以太坊中是指签名的数据包,这个数据包中存储了从外部账户发送的消息。所谓的交易就是一个消息,这个消息被发送者签名了。
以太坊交易类型
1> 转账交易
以太坊本身内置了以太币,因此这里的转账就是指一个账户往另一个账号转账发送以太币。
2>合约创建交易
3>合约执行交易
合约一旦部署完成后,就可以调用合约中的方法,也就是执行合约,在以太坊中执行合约也属于一种交易。
4. 收据
收据这个概念也是以太坊中特有的,字面的意思是指每条交易执行所影响的数据条,在以太坊的区块头中存储有数据树的根哈希值。
【区块链开发平台(以太坊)】数据实际上是一个数据的统计记录,记录了交易执行后的特征数据,这个数据保留下来有什么用呢?主要还是方便取得某些统计数据。从技术上来讲,收据确实不是必需的,比起比特币,以太坊支持了3种梅克尔树:交易树、状态树和收据树。其目的无非就是为了方便进行各种数据查询,提高账本数据在各种需求之下的统计查询效率。

    推荐阅读