智能合约

06-智能合约

0 啥是智能合约?

定义

智能合约,又称加密合约,在一定条件下可直接控制数字货币或资产在各方之间转移的一种计算机程序。

角色

  • 区块链网络可视为一个分布式存储服务,因为它存储了所有交易和智能合约的状态
  • 智能合约还是基于存储服务之上的计算,即运行在区块链上的代码程序。

特点

智能合约,即先前设定好的代码数字协议,在不可更改和公共监督情景下,去运行一个合约,违反合约的一方将付出事先约定好的代价,自动执行(无需借助外部力量)。

智能合约是公平的,第三方无法干预。

功能

智能合约不仅以与传统合约相同方式定义协议的规则和处罚,还可自动强制执行这些义务。

它通过接受信息作为输入,通过规则为输入赋值,在合约中列出并执行这些合约条款。

实例

设想人寿保险,智能合约在保单持有人去世后,向指定受益人支付利益。

合约可以对在线死亡登记表进行实时检查以确定支付时间,智能合约是可靠的,自动的。

架构地位

核心数据和核心业务逻辑运行在区块链上,保证去中心化与上层业务系统进行衔接,提供用户界面或业务集成:

意义

区块链智能合约:从数据可信上升到业务可信。

1 假如没有智能合约?

区块链网络将仅作为一个分布式存储服务。区块链主要功能将会是记录和保存数据,而不会自动执行任何逻辑或业务规则。

没有智能合约的区块链网络的特点和局限:

1.1 特点

  • 去中心化存储:区块链仍提供去中心化的数据存储功能,保证数据的完整性和防篡改性
  • 数据透明性:所有节点可访问相同数据,确保信息公开透明
  • 安全性:通过共识机制和密码学技术,确保数据安全性和不可篡改性

1.2 局限

  • 缺乏自动化处理:无法在链上执行自动化的业务逻辑。如不能在特定条件下自动触发资金转移或更新数据
  • 手动操作:所有业务逻辑和操作需要依赖链下的系统或人工操作,增加操作复杂性和潜在错误
  • 有限的应用场景:仅能用于简单的数据记录和查询,无法支持复杂的去中心化应用(dApps)

1.3 假如没有智能合约的区块链网络的典型使用场景

  1. 数据记录:例如,公证和时间戳服务,用于证明某个数据在某个时间点已经存在。
  2. 审计跟踪:用于保存和跟踪记录的变更历史,确保记录的完整性和不可篡改性。
  3. 简单交易:例如,比特币的早期应用,仅支持简单的转账功能,而没有复杂的业务逻辑。

1.4 实例

若一个区块链网络没有智能合约,其工作流程可能:

  1. 数据写入:用户通过客户端,将数据写入区块链
  2. 数据存储:区块链网络通过共识机制将数据记录在区块中,并存储在各节点的账本中
  3. 数据查询:用户或应用程序可查询区块链中的数据,但不能执行任何业务逻辑

如Alice向区块链提交一笔交易,记录她向Bob转账1个单位货币。区块链网络会验证并记录这笔交易,确保其不可篡改。但若无智能合约,无法在特定条件下自动执行转账或其他逻辑操作,所有业务流程要在链下由用户或第三方系统手动处理。

综上,无智能合约的区块链网络在功能上受限,只能提供基础的分布式存储和数据记录功能,无法支持复杂的自动化业务逻辑和去中心化应用。

所以,智能合约

1.5 有啥用?

在区块链社会里,大家共同维护一个区块链账本,所有交易数据无法篡改、不可伪造,还能减少人工对账的出错概率和人力成本。 随智能合约普及,我们也会变得更佛系。面对潜在的纠纷,无需自己出马,一切代码说了算。

如乘飞机买延误险,理赔就变得简单多了:

  • 投保乘客信息、航班延误险和航班实时动态均以智能合约的形式存储在区块链上
  • 一旦航班延符合赔付标准,赔偿款将自动划账到投保乘客账户,保单处理十分高效
  • 你也不需要跟工作人员费口舌、争论计赔时间等问题

智能合约是以太坊区块链上指定地址的代码和数据集合,智能合约能直接相互发送消息,同时也能执行图灵完备计算。

智能合约是建立在以太坊虚拟机字节码基础之上的。

一般不会直接编写字节码,而是使用像 Solidity 这样的以太坊高级语言。

Solidity 是可以用来编写以太坊智能合约的高级语言,它和js很像。

推荐使用 Solidity 语言,其使用的人比较多,意味着更好的生态,能找到更多的资源,有问题也更容易找到答案。

2 重要性

2.1 经济活动可编程

代码即法律,表达现实世界的经济活动,满足条件自动触发的电子合约

2.2 现实事物可映射

智能提供丰富的数据结构,完成复杂的现实事物的标识和时序变化

2.3 区块链2.0的标志

区块链2.0通常指的是在比特币之后出现的区块链技术,其核心特征是支持智能合约(Smart Contracts)。智能合约是一种自动执行的合约,其中的条款和条件直接编码到代码中,无需第三方介入即可执行。

以太坊,HLFabric等都是建立在智能合约的基础上。

3 智能合约框架

3.1 广域网的状态一致性

  • 不同节点得到一致执行结果
  • 不同硬件环境得到一致的资源消耗

3.2 合约开发语言多样性

适应不同开发者的开发习惯

支持不同的合约语言:

  • C++
  • GO
  • JAVA
  • Solidity

支持不同的合约类型:

  • WASM 合约
  • Native 合约
  • EVM 合约

合约语言/运行时相容矩阵:

  • 环境准备
  • 合约编写
  • 合约编译
  • 部署调用

3.3 合约执行的高性能

支撑真实落地场景的业务体量

3.4 不同业务场景的可扩展性

  • 公开网络和联盟网络的虚拟机需求
  • 兼容已有的区块链生态

4 WASM智能合约字节码

将智能合约编译成WebAssembly字节码格式,以便在区块链环境中高效、安全地执行。WASM(WebAssembly)是一种高效、可移植的低级字节码格式,最初是为在浏览器中高效运行而设计的,但由于其安全性、跨平台兼容性和高效性,逐渐在区块链和智能合约领域中获得广泛应用。

4.1 优点

字节码预编译AOT,实现高性能

硬件无关中间码,生成本地指令 编译执行 V.S 解释执行

WASM字节码经过优化,可以接近本地执行速度,确保智能合约的高效执行。

资源限制及审计
  • 设置资源限制,超限制自动退出
  • 多纬度资源统计:CPU,内存,磁盘
安全性保障
  • 内存越界检查
  • 限制系统资源访问,类似web沙盒环境。WASM运行在沙盒环境中,隔离了智能合约执行和底层系统,减少了安全漏洞。
  • 超资源自动退出保护机制,防恶意攻击
可移植性

WASM字节码可以在任何支持WASM的环境中执行,增加了智能合约的跨链兼容性

多语言支持

开发者可用多种编程语言(如Rust、C++、Go等)编写智能合约,然后编译成WASM字节码

4.2 工作流程

  1. 编写合约:开发者使用高层语言(如Rust)编写智能合约。
  2. 编译成WASM字节码:使用编译工具将智能合约编译成WASM字节码。
  3. 部署:将编译后的WASM字节码部署到区块链网络上。
  4. 执行:当调用智能合约时,区块链节点将加载并执行WASM字节码。

4.3 例子

1. 编写智能合约(Rust)
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
    a + b
}
2. 编译为WASM字节码

使用Rust工具链和wasm-pack将代码编译为WASM字节码:

wasm-pack build --target web

编译后生成的WASM字节码文件可以部署到支持WASM的区块链平台。

3. 部署和调用

将生成的WASM字节码文件部署到区块链上,然后通过交易调用合约函数。例如,调用add函数并传递参数ab

4.4 未来

WASM智能合约在区块链领域具有广阔的前景:

  • 跨链互操作性:由于WASM的可移植性,未来不同区块链平台之间可以更方便地共享和执行智能合约。
  • 更高性能:WASM的高效执行能力使得区块链平台可以支持更复杂和计算密集的应用。
  • 更安全的合约执行:WASM沙盒环境提供了更好的安全性,减少了智能合约中的潜在漏洞。

5 Gas 计费原理-控制流图分析

Gas 计费是区块链平台(如以太坊)用来防止资源滥用和激励资源使用优化的机制。智能合约执行过程中每一步操作都会消耗一定量的Gas,用户需要为这些操作支付费用。Gas 费用通常以加密货币(例如以太币)支付。

Gas 计费原理

  1. 初始Gas分配:在交易开始前,用户需要指定一个Gas上限(即最大愿意支付的Gas量)和Gas价格(每单位Gas愿意支付的费用)。在交易执行时,这个Gas上限会被锁定,确保不会超过用户设定的最大Gas量。
  2. 操作计费:智能合约执行过程中,每个操作指令(如算术运算、存储操作、合约调用等)都有预定义的Gas消耗。虚拟机(如以太坊的EVM)会根据操作指令的类型和数量逐步扣除Gas。
  3. Gas不足处理:如果执行过程中Gas消耗超过了用户设定的Gas上限,交易会被强制中止并回滚,但已经消耗的Gas不会退还。
  4. 剩余Gas退还:如果交易执行完毕且未耗尽所有的Gas,上限中未用尽的部分会退还给用户。

控制流图分析

控制流图(CFG)是用来表示程序所有可能执行路径的图结构,节点表示基本块(basic blocks),边表示控制流(control flow)。在智能合约中,CFG可以帮助分析程序的Gas消耗情况。

示例智能合约控制流图

假设有一个简单的智能合约,伪代码如下:

function foo(x) {
    if (x > 10) {
        y = x * 2;
    } else {
        y = x + 10;
    }
    return y;
}

其控制流图如下所示:

        [Start]
           |
           v
    [Entry: x > 10]
       /       \
      /         \
     v           v
[y = x * 2]   [y = x + 10]
      \         /
       \       /
        v     v
         [Return y]
Gas 计费过程
  1. 进入合约:Gas 消耗包括调用合约的基础费用和传递参数的费用。
  2. 条件判断:根据条件判断的复杂度,会消耗一定量的Gas。
  3. 分支执行
    • x > 10,执行 y = x * 2,算术运算消耗Gas。
    • x <= 10,执行 y = x + 10,算术运算消耗Gas。
  4. 返回结果:返回结果的过程会消耗Gas。

通过控制流图,可以直观地分析不同路径上的Gas消耗情况,并优化智能合约代码以减少Gas使用。例如,在上述示例中,可以通过合并相似的计算路径来减少条件判断的复杂度。

Gas 计费优化

  1. 减少存储操作:存储操作(如写入合约存储)是最昂贵的操作之一,尽量减少写操作可以显著降低Gas消耗。
  2. 优化计算:避免不必要的复杂计算,使用低Gas消耗的操作替代高Gas消耗的操作。
  3. 减少条件判断:减少条件分支的复杂度和数量,优化控制流路径。
  4. 合约重用:通过模块化设计,重用常见操作,减少重复代码带来的额外Gas消耗。

总结

Gas计费是区块链智能合约执行中的重要机制,通过控制流图分析,可以帮助理解和优化智能合约的Gas消耗。结合具体操作和优化策略,可以有效地降低智能合约的执行成本,提高运行效率。

6 合约执行事务流程

从用户发起交易请求到交易完成被区块链网络记录:

  1. 用户发起交易请求
    • 用户通过钱包或DApp(去中心化应用)向区块链网络提交一笔交易请求。
    • 交易请求中包含调用的智能合约地址、函数名、参数、Gas上限和Gas价格等信息。
  2. 交易广播
    • 用户的交易请求通过节点被广播到整个区块链网络。
    • 所有全节点都会接收到这笔交易请求。
  3. 交易验证
    • 节点对交易请求进行验证,包括签名验证、Nonce验证(防止重放攻击)和检查用户账户是否有足够的余额支付Gas费用。
    • 验证通过的交易被放入交易池中等待打包。
  4. 矿工打包交易
    • 矿工节点从交易池中选取若干交易进行打包。
    • 选取策略通常优先选择Gas价格较高的交易,以获得更多的手续费收入。
  5. 交易执行
    • 矿工节点在虚拟机(如以太坊的EVM)中执行交易。
    • 虚拟机按顺序执行交易中的每一条指令,并逐步扣除Gas。
    • 若交易中的Gas不足,交易会被中止并回滚,但已经消耗的Gas不会退还。
  6. 智能合约调用
    • 在交易执行过程中,合约函数被调用,执行相应的逻辑。
    • 合约调用过程中可能会涉及状态修改、事件触发、调用其他合约等操作。
    • 执行结束后,结果(包括状态变更、返回值等)被记录下来。
  7. 交易结果打包
    • 矿工将交易执行结果和状态变更打包成一个新的区块。
    • 新区块包含区块头(包含区块号、时间戳、前一区块哈希等信息)和交易列表。
  8. 区块广播
    • 新区块通过P2P网络广播给其他节点。
    • 其他节点收到新块后,对区块和其中的交易进行验证。
  9. 共识算法
    • 区块链网络使用共识算法(如PoW、PoS等)对新块进行共识验证。
    • 验证通过后,区块被添加到区块链上,交易被正式确认。
  10. 客户端确认
    • 客户端通过监听交易或区块事件,确认交易已上链。
    • 用户可以查询交易状态,查看交易是否成功、Gas消耗情况等。

流程关键点

  • Gas机制:交易执行过程中每一步操作都会消耗一定量的Gas,防止资源滥用。
  • 交易验证:确保交易的合法性,包括签名验证和账户余额检查。
  • 共识机制:通过共识算法保证区块链的去中心化和安全性。
  • 状态变更:合约调用过程中会涉及状态变更,必须确保状态变更的一致性和不可篡改性。

7 合约并发执行原理

通过允许多个智能合约交易并行处理,可以显著提高系统的吞吐量和响应速度。

  1. 交易分类
    • 首先,将待处理的交易按照涉及的账户或智能合约进行分类。不同账户或合约的交易可以并发执行,而相同账户或合约的交易则需要按顺序执行以避免冲突。
  2. 依赖关系检测
    • 通过依赖关系检测算法,确定交易之间的依赖关系。依赖关系指的是交易之间存在数据读写冲突的情况。
    • 例如,交易A需要读取交易B写入的数据,则A依赖于B,需要等待B执行完毕才能执行A。
  3. 构建依赖图
    • 根据依赖关系构建一个依赖图(DAG,Directed Acyclic Graph),其中每个节点代表一个交易,边表示依赖关系。
    • DAG图确保了并发执行的正确性,即交易的执行顺序符合依赖关系。
  4. 并发执行引擎
    • 使用并发执行引擎对交易进行调度和执行。引擎根据DAG图中的依赖关系,选择可以并行执行的交易集。
    • 同时满足无依赖关系的交易可以并行执行,依赖关系中的交易按顺序执行。
  5. 状态隔离
    • 每个交易在执行过程中操作的状态(如账户余额、合约存储等)在隔离的环境中进行,以确保并行执行时不会互相影响。
    • 使用沙盒技术或事务管理机制实现状态隔离,保证数据的一致性和隔离性。
  6. 结果合并
    • 所有交易执行完毕后,将各个交易的执行结果(状态变更、事件触发等)合并到全局状态中。
    • 确保最终的全局状态一致性,即所有交易的结果都正确应用到区块链上。
  7. 共识与确认
    • 并发执行完成后,交易结果进入共识阶段,由区块链网络通过共识算法进行验证和确认。
    • 确认通过的交易结果被持久化到区块链中,完成整个并发执行流程。

流程关键点

  • 并发调度:通过依赖图调度交易执行,确保无依赖关系的交易可以并发执行。
  • 状态隔离:使用沙盒或事务管理技术,确保并行执行时的状态隔离和数据一致性。
  • 依赖检测:检测交易之间的读写依赖关系,构建依赖图以指导并发执行。

并发执行的优势

  • 提高吞吐量:并发执行可以显著提高区块链网络的交易处理能力,增加每秒交易处理数量(TPS)。
  • 缩短确认时间:并发执行减少了交易等待时间,缩短了交易确认所需的时间,提高了用户体验。
  • 优化资源利用:并发执行可以更高效地利用节点的计算资源,提高区块链系统的整体性能。

挑战与解决方案

  • 数据冲突:需要有效的依赖关系检测和冲突解决机制,避免并发执行时的数据冲突。
  • 隔离与一致性:确保并发执行环境中的状态隔离和最终的一致性,保证数据的准确性和可靠性。
  • 复杂性管理:并发执行引擎的设计和实现较为复杂,需要处理多种并发场景和异常情况。

通过上述原理和流程,可以有效地实现智能合约的并发执行,提高区块链系统的性能和可扩展性。

获取更多干货内容,记得关注我哦。

本文由mdnice多平台发布

相关推荐
cwtlw25 分钟前
如何创建maven工程
java·笔记·后端·学习·maven
我命由我123451 小时前
15.Java 网络编程(网络相关概念、InetAddress、NetworkInterface、TCP 网络通信、UDP 网络通信、超时中断)
java·开发语言·网络·后端·tcp/ip·udp·java-ee
爱吃香菜---www2 小时前
Scala隐式泛型
开发语言·后端·scala
我爱写代码?2 小时前
Scala的隐式对象
开发语言·后端·scala
●VON3 小时前
go语言的成神之路-标准库篇-os标准库
linux·运维·服务器·开发语言·后端·学习·golang
一只拉古3 小时前
后端编程大师之路:在 .NET 应用中使用 ElasticSearch 和 Kibana 进行日志管理
后端·elasticsearch·架构
程序员大金3 小时前
基于SpringBoot+Vue的驾校管理系统
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
机智阳4 小时前
介绍一个InnoDB的数据页,和B+树的关系是什么?
java·数据结构·分布式·后端·b树
啊松同学5 小时前
【Spring】使用@Async注解后导致的循环依赖问题
java·后端·spring
rock——you5 小时前
django通过关联表字段进行排序并去重
数据库·后端·postgresql·django