风险提示:理性看待区块链,提高风险意识!
EOS代码架构及分析(四)
首页 > 币界资讯 > 区块链新闻 2019-01-26 09:15:01
摘要
什么是智能合约在解释智能合约前,我们先来看看传统合约的形态。合约的本质是由一系列条款组成,每个条款由若干条规则组成,通过向条款中输入固定的参数,会输出固定的结果。传统合约需要由双方共同参与签署确认,同时需要第三方见证人公证后,才具有法律效应,确保合约按照既定的规则执行。这里的第三方通常是具有法律效力 。
币界网报道:

什么是智能合约

在解释智能合约前,我们先来看看传统合约的形态。合约的本质是由一系列条款组成,每个条款由若干条规则组成,通过向条款中输入固定的参数,会输出固定的结果。传统合约需要由双方共同参与签署确认,同时需要第三方见证人公证后,才具有法律效应,确保合约按照既定的规则执行。这里的第三方通常是具有法律效力的公证方,同时必须是能够精准理解合约条款的专业机构,可以避免双方产生纠纷。比如,在租赁合同中,需要由房东和租客双方共同签署,而中介则扮演了第三方见证人。

随着信息技术的发展,纸质的合约逐渐被电子合约替代。电子合约是用程序代码来实现合约条款,当外部条件满足后,自动执行相应的规则,避免人工参与,提高合约执行效率。比如,信用卡自动还款、股票委托交易等,都采用了电子合约方式。

虽然电子合约实现了合约的自动化执行,但是仍然需要一个第三方仲裁机构参与,比如银行、股票交易所。这些机构相互独立,而且需要协作处理大量的清算、交割任务。这导致了中心化的仲裁模式产生了瓶颈。

智能合约 = 电子合约 + 去中心化仲裁 + 合约间交互

智能合约是对电子合约的进一步优化,去除了中心化的第三方仲裁机构,由区块链上所有节点产生的共识,作为合约执行依据。大大减少人工参与工作,进一步提升了合约的执行效率。智能合约本质就是部署在区块链上的一段可执行代码,可以被查询或者调用。智能合约可以与人进行交互,也可以和其它智能合约交互,合约的执行过程完全不需要额外的人工参与。

智能合约概念图

EOS智能合约分析

EOS智能合约是由一系列action组成,每个action代表一条合约条款,实现了条款中的具体规则。智能合约的执行基于C/S通信架构,分为制作智能合约、部署智能合约和调用智能合约三部分。

1.制作智能合约

智能合约的代码放在eos/contracts/目录下,每个智能合约对应一个独立目录,主要包含cpp文件、hpp文件、abi文件,例如,token合约目录结构如下:

token合约

其中,hpp头文件主要包含类定义、全局变量、宏定义等等;cpp源文件主要包含合约函数的实现细节;abi文件全名叫做“Application Binary Interface”(应用程序二进制接口),通过abi接口转换层,用户可以通过JSON格式直接调用智能合约里面的action函数。

2.部署智能合约

用户需要将智能合约C++代码编译成WASM格式(一种面向web的二进制格式,也是区块链唯一能够识别的格式),例如,编写一个用来打印hello world的智能合约:

hello/hello.cpp:

hello

其中,每个智能合约必须实现一个apply()函数,用来将action请求映射到具体的处理函数,具体的实现细节封装在EOSIO_ABI宏里面。这样,开发者只需要专注合约业务逻辑的开发,而不必关注底层技术细节,简化了智能合约开发的工作。

EOSIO_ABI

将合约代码变成WASM格式,用于存储在区块链上:

# eosiocpp -o hello.wast hello.cpp

生成abi文件,为其它用户提供一个友好的action调用接口:

# eosiocpp -g hello.abi hello.cpp
Generated hello.abi

abi文件内容:

hello_abi

通过客户端工具cleos,将智能合约发送给服务器,由服务器持久化部署在区块链上,随后可以被其它用户调用执行该合约:

3.调用智能合约

由客户端通过cleos命令发送action请求给服务器。服务器会根据action请求信息,去区块链上找到对应的智能合约代码,并将代码加载到内存中执行,最后将执行结果返回给客户端,下面的命令调用了hello.code智能合约的hi函数,并将“user”作为参数传入:
# cleos push action hello.code hi '["user"]' -p user
  hello.code <= hello.code::hi               {"user":"user"}
>> Hello, user

智能合约处理流程

Action处理流程

cleos会将一组action封装成一个transaction数据包发送给服务器。这里借用了数据库事务的概念,一个transaction代表一个事务,在事务内的action要么全部执行,要么都不执行,必须保证事务的原子性。Transaction可以包含一个action,也可以包含多个action,用json格式表示,例如:

transaction

服务器接收到大量的action请求,然后将action派发到对应的智能合约。每个智能合约都会实现一个apply()函数,用来处理各个action请求。apply()函数包含3个参数,receiver表示处理请求的账号,code表示合约名称,action表示action名称,例如:

EOSIO_ABI

action在运行之前,EOSIO会为action创建一个运行环境,也叫做Action “Apply” Context,提供程序运行所需的CPU和内存资源,具体的资源申请量取决与账户持有的股权比例,也就是EOS代币。

apply_context

每个服务器都有一个action处理函数集合副本,当客户端发起action请求后,所有服务器会在本地运行action处理函数,并相互校验结果,最后将确认结果返回给客户端,具体流程如下:

合约执行流程

智能合约的通信模型

智能合约中所谓的智能概念,就是智能合约不但可以和人交互通信,而且可以和其它智能合约进行交互通信。例如,当本次智能合约的transaction中可以调用其它智能合约的action来完成一些工作,或者在未来某个时刻触发其它智能合约的transaction。

EOSIO支持两种基本的通信模型,inline和deferred。其中,inline模型是指在当前的transaction中完成对其它智能合约action的调用,可以简单的认为是transaction的嵌套调用,内部的action失败会导致transaction整体做回退。Deferred模型是指延迟一段时间,或者满足一定条件后才执行,也就是说不能保证一定被执行到。

EOS代码架构及分析(一)

EOS代码架构及分析(二)

EOS代码架构及分析(三)

本文由作者“极简主义”首发于资讯,未经允许不得转载。

上一篇: 刷量不是长久之道,Fcoin今后是脚踏实地还是继续故弄玄虚?
下一篇: 第二届中国区块链开发大赛初评工作顺利结束
推荐专栏
Boss Wallet Web3 Econom Pass
专注币圈最新资讯
通俗浅显地聊透Web3大事小情
读懂区块链生态与未来,尽在币界网!
热门币种
更多
币种
美元价格
24H涨跌幅
BTC比特币
60,963.61 USDT
¥435,103.38
-2.72%
ETH以太坊
3,368.69 USDT
¥24,042.67
-0.3%
BNB币安币
570.68 USDT
¥4,073.00
-0.28%
USDT泰达币
1.02 USDT
¥7.25
-0.19%
SOL
135.96 USDT
¥970.36
+7.66%
USDC
1.00 USDT
¥7.15
-0.01%
TON
7.59 USDT
¥54.14
+4.55%
XRP瑞波币
0.47720 USDT
¥3.41
+0.48%
DOGE狗狗币
0.12210 USDT
¥0.87140
+2.43%
ADA艾达币
0.39050 USDT
¥2.79
+3.88%
热搜币种
更多
币种
美元价格
24H涨跌幅
Solana
180.72 USDT
¥1,310.49
+0.29%
比特币
66129.12 USDT
¥479,535.31
-0.07%
Curve
0.2568 USDT
¥1.86
-0.43%
Filecoin
4.3437 USDT
¥31.50
-1.79%
FTX Token
1.3892 USDT
¥10.07
-2.35%
比特币SV
51.0769 USDT
¥370.38
-0.68%
狗狗币
0.1252 USDT
¥0.91
-2.03%
柚子
0.5812 USDT
¥4.21
+1.82%
Yield Guild Games
0.474 USDT
¥3.44
-2.03%
奇亚
18.7015 USDT
¥135.61
-0.22%
Conflux
0.167 USDT
¥1.21
+1.09%
Shiba Inu
1.632E-5 USDT
¥0.00
-1.33%
最新快讯
更多
贝莱德以太坊ETF资金流入量排行今年所有新ETF的前15名
2024-07-31 10:53:40
50,00万枚USDC在USDC国库铸造
2024-07-31 10:52:58
链上数据分析平台Arkham集成Blast链数据
2024-07-31 10:48:39
MellowProtocol已经接入OKXWeb3钱包
2024-07-31 10:41:48
Doubler完成DoublerLitev2升级,将于8月1日在MantaNetwork上发布新版本
2024-07-31 10:41:00
Paradigm于8小时前将39,068枚ETH存入托管平台AnchorageDigital
2024-07-31 10:38:36
ZKX24小时跌逾34%
2024-07-31 10:34:00
下载币界网APP