智能合约

06-智能合约

0 啥是智能合约?

定义

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

角色

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

特点

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

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

功能

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

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

实例

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

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

架构地位

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

alt

意义

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

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 智能合约框架

alt

3.1 广域网的状态一致性

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

3.2 合约开发语言多样性

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

支持不同的合约语言:

  • C++
  • GO
  • JAVA
  • Solidity

支持不同的合约类型:

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

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

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

3.3 合约执行的高性能

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

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

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

4 WASM智能合约字节码

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

4.1 优点

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

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

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

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

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

多语言支持

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

4.2 工作流程

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

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 计费原理-控制流图分析

alt

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 合约执行事务流程

alt

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

  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 合约并发执行原理

alt

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

  1. 交易分类

    • 首先,将待处理的交易按照涉及的账户或智能合约进行分类。不同账户或合约的交易可以并发执行,而相同账户或合约的交易则需要按顺序执行以避免冲突。
  2. 依赖关系检测

    • 通过依赖关系检测算法,确定交易之间的依赖关系。依赖关系指的是交易之间存在数据读写冲突的情况。
    • 例如,交易A需要读取交易B写入的数据,则A依赖于B,需要等待B执行完毕才能执行A。
  3. 构建依赖图

    • 根据依赖关系构建一个依赖图(DAG,Directed Acyclic Graph),其中每个节点代表一个交易,边表示依赖关系。
    • DAG图确保了并发执行的正确性,即交易的执行顺序符合依赖关系。
  4. 并发执行引擎

    • 使用并发执行引擎对交易进行调度和执行。引擎根据DAG图中的依赖关系,选择可以并行执行的交易集。
    • 同时满足无依赖关系的交易可以并行执行,依赖关系中的交易按顺序执行。
  5. 状态隔离

    • 每个交易在执行过程中操作的状态(如账户余额、合约存储等)在隔离的环境中进行,以确保并行执行时不会互相影响。
    • 使用沙盒技术或事务管理机制实现状态隔离,保证数据的一致性和隔离性。
  6. 结果合并

    • 所有交易执行完毕后,将各个交易的执行结果(状态变更、事件触发等)合并到全局状态中。
    • 确保最终的全局状态一致性,即所有交易的结果都正确应用到区块链上。
  7. 共识与确认

    • 并发执行完成后,交易结果进入共识阶段,由区块链网络通过共识算法进行验证和确认。
    • 确认通过的交易结果被持久化到区块链中,完成整个并发执行流程。

流程关键点

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

并发执行的优势

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

挑战与解决方案

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

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

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

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧油客:从初识、再识OceanBase,到全栈上线

今天&#xff0c;我们邀请了智慧油客的研发总监黄普友&#xff0c;为我们讲述智慧油客与 OceanBase 初识、熟悉和结缘的故事。 智慧油客自2016年诞生以来&#xff0c;秉持新零售的思维&#xff0c;成功从过去二十年间以“以销售产品为中心”的传统思维模式&#xff0c;转向“以…

【深度学习】手机SIM卡托缺陷检测【附链接】

一、手机SIM卡托用途 SIM卡托是用于固定和保护SIM卡的部件&#xff0c;通过连接SIM卡与手机主板的方式&#xff0c;允许设备访问移动网络&#xff0c;用户可以通过SIM卡进行通话、发送短信和使用数据服务。 二、手机SIM卡托不良影响 SIM卡接触不良&#xff0c;造成信号中断&…

消防物证管理系统|DW-S404实现消防物证智能化管理

一、系统概述 智慧消防物证管理系统DW-S404系统旨在借助现代信息技术&#xff0c;达成消防物证管理的高效化、安全化及智能化管理目标。该系统运用物联网、大数据、云计算等先进技术&#xff0c;实现对消防物证从产生到销毁的全生命周期跟踪与监控&#xff0c;从而增强物证管理…

Odoo :一款免费且开源的食品生鲜领域ERP管理系统

文 / 贝思纳斯 Odoo金牌合作伙伴 引言 提供业财人资税的精益化管理&#xff0c;实现研产供销的融通、食品安全的追踪与溯源&#xff0c;达成渠道的扁平化以及直面消费者的 D2C 等数字化解决方案&#xff0c;以此提升运营效率与核心竞争力&#xff0c;支撑高质量的变速扩张。…

如何部署vue项目到Github Pages

1.创建vue项目 npm create vitelatest my-vue-app -- --template vue 2.创建github仓库 3.连接仓库 在项目根目录右键选择open git base here&#xff0c;如果没有安装git请先安装git。 初始化仓库 $ git init $ git add . $ git commit -m "init"将项目与仓库连…

Dubbo应用篇

文章目录 一、Dubbo简介二、SSM项目整合Dubbo1.生产者方配置2.消费者方配置 三、Spring Boot 项目整合Dubbo1.生产者方配置2.消费者方配置 四、应用案例五、Dubbo配置的优先级别1. 方法级配置&#xff08;Highest Priority&#xff09;2. 接口级配置3. 消费者/提供者级配置4. 全…

ubuntu的matlab使用心得

1.读取视频 v VideoReader(2222.mp4);出问题&#xff0c;报错&#xff1a; matlab 错误使用 VideoReader/initReader (第 734 行) 由于出现意外错误而无法读取文件。原因: Unable to initialize the video properties 出错 audiovideo.internal.IVideoReader (第 136 行) init…

消息中间件-Kafka1-实现原理

消息中间件-Kafka 一、kafka简介 1、概念 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以…

如何利用“一键生成ppt”减轻工作压力

随着数字化的快速发展&#xff0c;PPT设计这一传统任务也迎来了新的变化。过去&#xff0c;制作一个简洁、专业的PPT需要花费大量时间与精力。但现在借助科技的力量&#xff0c;一键生成PPT的梦想成真了。从智能生成ppt到ai生成ppt的技术不断进步&#xff0c;令我们能够体验到更…

创造未来:The Sandbox 创作者训练营如何赋能全球创造者

创作者训练营让创造者有能力打造下一代数字体验。通过促进合作和提供尖端工具&#xff0c;The Sandbox 计划确保今天的元宇宙是由一个个创造者共同打造。 2024 年 5 月&#xff0c;The Sandbox 推出了「创作者训练营」系列&#xff0c;旨在重新定义数字创作。「创作者训练营」系…

Docker多架构镜像构建踩坑记

背景 公司为了做信创项目的亮点&#xff0c;需要将现有的一套在X86上运行的应用系统迁移到ARM服务器上运行&#xff0c;整个项目通过后端Java&#xff0c;前端VUEJS开发通过CICD做成Docker镜像在K8S里面运行。但是当前的CICD产品不支持ARM的镜像构建&#xff0c;于是只能手工构…

python学opencv|读取图像(三)放大和缩小图像

【1】引言 前序已经学习了常规的图像读取操作和图像保存技巧&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像-CSDN博客 python学opencv|读取图像&#xff08;二&#xff09;保存彩色图像-CSDN博客 今天我们更近一步&#xff0c;学习放大和缩小图像的技巧&…

D86【python 接口自动化学习】- pytest基础用法

day86 pytest配置testpaths 学习日期&#xff1a;20241202 学习目标&#xff1a;pytest基础用法 -- pytest配置testpaths 学习笔记&#xff1a; pytest配置项 主目录创建pytest.ini文件 [pytest] testpaths./testRule 然后Terminal里直接命令&#xff1a;pytest&#xff…

基于 Apache Dolphinscheduler3.1.9中的Task 处理流程解析

实现一个调度任务&#xff0c;可能很简单。但是如何让工作流下的任务跑得更好、更快、更稳定、更具有扩展性&#xff0c;同时可视化&#xff0c;是值得我们去思考得问题。 Apache DolphinScheduler是一个分布式和可扩展的开源工作流协调平台&#xff0c;具有强大的DAG可视化界…

Flask使用长连接

Flask使用flask_socketio实现websocket Python中的单例模式 在HTTP通信中&#xff0c;连接复用&#xff08;Connection Reuse&#xff09;是一个重要的概念&#xff0c;它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应&#xff0c;而不是为每个新的请求/响…

雨晨 26100.2454 Windows 11 24H2 专业工作站 极简纯净版

文件: 雨晨 26100.2454 Windows 11 24H2 专业工作站极简 install.esd 大小: 1947043502 字节 修改时间: 2024年12月6日, 星期五, 16:38:37 MD5: 339B7FDCA0130D432A0E98957738A9DD SHA1: 2978AE0CEAF02E52EC4135200D4BDBC861E07BE8 CRC32: 8C329C89 简述&#xff1a; 由YCDIS…

MongoDB性能监控工具

mongostat mongostat是MongoDB自带的监控工具&#xff0c;其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令&#xff0c;可以呈现出实时的状态变化。不同的是&#xff0c;mongostat所监视的对象是数据库进程。mongostat常用于…

Python模块之random、hashlib、json、time等内置模块语法学习

Python内置模块语法学习 random、hashlib、json、time、datetime、os等内置模块语法学习 模块 简单理解为就是一个.py后缀的一个文件 分为三种&#xff1a; 内置模块&#xff1a;python自带&#xff0c;可调用第三方模块&#xff1a;别人设计的&#xff0c;可调用自定义模块…

小程序 —— Day1

组件 — view和scroll-view view 类似于HTML中的div&#xff0c;是一个块级元素 案例&#xff1a;通过view组件实现页面的基础布局 scroll-view 可滚动的视图区域&#xff0c;用来实现滚动列表效果 案例&#xff1a;实现纵向滚动效果 scroll-x属性&#xff1a;允许横向滚动…

git pull error: cannot lock ref

Git: cannot lock ref ‘refs/remotes/origin/feature/xxx’: refs/remotes/origin/feature/xxx/car’ exists; cannot create refs/remotes/origin/feature/xxx git remote prune origin重新整理服务端和本地的关联关系即可