EOS代码架构及分析(四)
什么是智能合约
在解释智能合约前,我们先来看看传统合约的形态。合约的本质是由一系列条款组成,每个条款由若干条规则组成,通过向条款中输入固定的参数,会输出固定的结果。传统合约需要由双方共同参与签署确认,同时需要第三方见证人公证后,才具有法律效应,确保合约按照既定的规则执行。这里的第三方通常是具有法律效力的公证方,同时必须是能够精准理解合约条款的专业机构,可以避免双方产生纠纷。比如,在租赁合同中,需要由房东和租客双方共同签署,而中介则扮演了第三方见证人。
随着信息技术的发展,纸质的合约逐渐被电子合约替代。电子合约是用程序代码来实现合约条款,当外部条件满足后,自动执行相应的规则,避免人工参与,提高合约执行效率。比如,信用卡自动还款、股票委托交易等,都采用了电子合约方式。
虽然电子合约实现了合约的自动化执行,但是仍然需要一个第三方仲裁机构参与,比如银行、股票交易所。这些机构相互独立,而且需要协作处理大量的清算、交割任务。这导致了中心化的仲裁模式产生了瓶颈。
智能合约 = 电子合约 + 去中心化仲裁 + 合约间交互
智能合约是对电子合约的进一步优化,去除了中心化的第三方仲裁机构,由区块链上所有节点产生的共识,作为合约执行依据。大大减少人工参与工作,进一步提升了合约的执行效率。智能合约本质就是部署在区块链上的一段可执行代码,可以被查询或者调用。智能合约可以与人进行交互,也可以和其它智能合约交互,合约的执行过程完全不需要额外的人工参与。
EOS智能合约分析
EOS智能合约是由一系列action组成,每个action代表一条合约条款,实现了条款中的具体规则。智能合约的执行基于C/S通信架构,分为制作智能合约、部署智能合约和调用智能合约三部分。
1.制作智能合约
智能合约的代码放在eos/contracts/目录下,每个智能合约对应一个独立目录,主要包含cpp文件、hpp文件、abi文件,例如,token合约目录结构如下:
其中,hpp头文件主要包含类定义、全局变量、宏定义等等;cpp源文件主要包含合约函数的实现细节;abi文件全名叫做“Application Binary Interface”(应用程序二进制接口),通过abi接口转换层,用户可以通过JSON格式直接调用智能合约里面的action函数。
2.部署智能合约
用户需要将智能合约C++代码编译成WASM格式(一种面向web的二进制格式,也是区块链唯一能够识别的格式),例如,编写一个用来打印hello world的智能合约:
hello/hello.cpp:
其中,每个智能合约必须实现一个apply()函数,用来将action请求映射到具体的处理函数,具体的实现细节封装在EOSIO_ABI宏里面。这样,开发者只需要专注合约业务逻辑的开发,而不必关注底层技术细节,简化了智能合约开发的工作。
将合约代码变成WASM格式,用于存储在区块链上:
通过客户端工具cleos,将智能合约发送给服务器,由服务器持久化部署在区块链上,随后可以被其它用户调用执行该合约:
3.调用智能合约
Action处理流程
cleos会将一组action封装成一个transaction数据包发送给服务器。这里借用了数据库事务的概念,一个transaction代表一个事务,在事务内的action要么全部执行,要么都不执行,必须保证事务的原子性。Transaction可以包含一个action,也可以包含多个action,用json格式表示,例如:
服务器接收到大量的action请求,然后将action派发到对应的智能合约。每个智能合约都会实现一个apply()函数,用来处理各个action请求。apply()函数包含3个参数,receiver表示处理请求的账号,code表示合约名称,action表示action名称,例如:
action在运行之前,EOSIO会为action创建一个运行环境,也叫做Action “Apply” Context,提供程序运行所需的CPU和内存资源,具体的资源申请量取决与账户持有的股权比例,也就是EOS代币。
每个服务器都有一个action处理函数集合副本,当客户端发起action请求后,所有服务器会在本地运行action处理函数,并相互校验结果,最后将确认结果返回给客户端,具体流程如下:
智能合约的通信模型
智能合约中所谓的智能概念,就是智能合约不但可以和人交互通信,而且可以和其它智能合约进行交互通信。例如,当本次智能合约的transaction中可以调用其它智能合约的action来完成一些工作,或者在未来某个时刻触发其它智能合约的transaction。
EOSIO支持两种基本的通信模型,inline和deferred。其中,inline模型是指在当前的transaction中完成对其它智能合约action的调用,可以简单的认为是transaction的嵌套调用,内部的action失败会导致transaction整体做回退。Deferred模型是指延迟一段时间,或者满足一定条件后才执行,也就是说不能保证一定被执行到。
EOS代码架构及分析(四)相关推荐
- EOS代码架构及分析(一)
EOS简介 EOS(Enterprise Operation System),企业操作系统,是为企业级分布式应用设计的一款区块链操作系统.相比于目前区块链平台性能低.开发难度大以及手续费高等问题,EO ...
- EOS代码架构及分析(二)
EOS通信机制分析 客户端和服务器端的通信采用RESTful软件架构风格,服务器端的每个资源对应一个唯一的URL地址,客户端将URL地址封装成http请求发送到服务器端,请求对应的资源或者执行相应操作 ...
- 5G学习-OAI代码架构分析
文章目录 1 OAI代码架构分析 1.1 简介 1.2 硬件部分 1.3 软件部分 1.3.2 代码结构 1.3.3 代码结构说明 1.4 参考文献 1 OAI代码架构分析 1.1 简介 官方网站: ...
- 手机自动化测试:Appium源码分析之跟踪代码分析四 1
手机自动化测试:Appium源码分析之跟踪代码分析四 控制器模块 // Appium webserver controller methods // https://github.com/hugs/a ...
- Android架构实例分析之编写hello驱动的HAL层代码
Android架构实例分析之编写hello驱动的HAL层代码 摘要: HAL层中文名称又叫硬件抽象层,可以理解我Linux驱动的应用层.本文实现了一个简单的hello HAL的代码,衔接hello驱动 ...
- npu算力如何计算_CPU、GPU、NPU、FPGA等芯片架构特点分析
来源 | 汽车电子与软件 知圈 | 进"高精度地图社群",请加微信15221054164,备注地图 概述 随着人工智能的热潮和AI算法的广泛应用,深度学习已成为当前AI研究的重点, ...
- 走向.NET架构设计—第四章—业务层分层架构(中篇)
走向.NET架构设计-第四章-业务层分层架构(中篇) 前言: 在上一篇文章中,我们讨论了两种组织业务逻辑的模式:Transaction Script和Active Record.在本篇中开始讲述Dom ...
- x86架构和arm架构处理器分析
x86架构和arm架构处理器分析 目录: 1.两种cpu架构:冯洛伊曼和哈佛 2.x86架构和arm架构分析 3.x86架构和arm架构功耗探究 一.两种cpu架构: 目前主流的cpu处理 器都采用了 ...
- 网络安全学习(渗透测试方法论,web架构安全分析,信息收集)
目录 一.渗透测试方法论 渗透测试种类 *黑盒测试 *白盒测试 *脆弱性评估与渗透测试 二.安全测试方法论 *开放式 Web 应用程序安全项目(Open Web Aplication Security ...
最新文章
- 20155204 2016-2017-2 《Java程序设计》第3周学习总结
- 如何去掉桌面标签背影
- 便利的操作plist文件
- Qt on Android:将Qt调试信息输出到logcat中
- 电脑软件:微软Windows官方电脑管家,仅针对国内用户?看看怎么说
- Anaconda jupyter-notebook 添加kernel
- CSDN 2020博客之星投票进行中:送你喜爱的博主C位出道!
- 【使用技巧】【图像编辑和处理】将多幅图片放到一块方便对比
- 用python写一个地铁线路图_python制作一线城市地铁运行动态图
- ETERM航班销售控制指令
- 如何构建企业TPM管理体系?
- 基于余弦相似性的指纹匹配算法在WIFI室内定位上的应用
- 《快学BigData》--Linux 常用命令
- 阿里云的服务器、腾讯云的域名,域名解析失败的解决方案
- android网页编辑软件,HTML5编辑器
- 朴灵:打破限制,从前端到全栈
- c语言将矩形分成多个小正方形,蓝桥杯练习算法题(矩形切割成正方形)
- L9935_二相步进电机驱动器
- 论坛介绍 | COSCon'22 闪电演讲(Z)
- 【blog】小白博客搭建和踩坑历程 hexo+butterfly
热门文章
- 计算机专业知识教学,2016计算机专业知识:计算机的分类(一)
- oppo计算机锁屏快捷键,电脑如何快速锁屏
- c++直角空心三角形_2019秋人教版八年级数学上册三角形教材全解读
- IDEA中suppress warnings
- 阿里云安全ACP认证试验之阿里云Web应用防火墙接入体验
- 微信小程序引用外部文件找不到文件报错问题
- 安装mysql驱动报错_java.sql.SQLException: org.gjt.mm.mysql.Driver 报错【解决办法】
- 什么是web移动端-移动端布局特点
- 快速学习Groovy
- 油猴加idm不起作用了 油猴加idm下载百度云