写点什么

【区块链 DAPP】智能合约概述

作者:联系wxwy926
  • 2023-09-01
    陕西
  • 本文字数:7069 字

    阅读完需:约 23 分钟

【区块链DAPP】智能合约概述

智能合约概述

智能合约是运行在区块链公链上的一种代码,该代码由 Solidity 编写,并通过区块链的智能合约虚拟机来执行,以达到对区块链编程的目标。可以将区块链公联理解为操作系统,Solidity 是编写该操作系统应用程序的编程语言,智能合约虚拟机则是编程语言编译之后的代码运行环境。

[技术开发+185-0921-7890]

区块链基本知识

交易

区块链通常被理解为超级账本,账户与账户之间可以通过交易来完成转账,只是这种转账方式与传统的银行转账有很大的不同。

(1)这是一个完全去中心化的金融系统,区块链账户不需要使用者到银行机构或者其他部门申请,因为整个系统中没有这样的中心化部门来管理账户信息,使用者只需要根据一种非对称加密算法来生成一个密钥对,其公钥作为账户地址,也就是常说的区块链钱包地址,这个地址可以在网络中广播,允许网络中所有的账户获取和使用。

该账户是公开的。私钥作为转账交易的签名和密码,由使用者私人保管,每次转账时,需要通过私钥签名来证明交易的合法性。在现实使用中,区块链钱包会将私钥进行对称加密,通过使用者输入人类能够理解的密码作为私钥加密的密钥,将区块链密钥以密文的形式保存到磁盘空间中。需要注意的是,如果忘记解密密钥的密码,就失去了对账户的操作权限。

(2)这是一个完全无中心的账本系统。在区块链上的每一笔交易都是一条转账记录,如果该交易成功被整个区块链网络认可则转账成功,并且会将转账记录存储在区块链的数据库里面,每个区块链节点都可以访问和操作这个数据库,并且任何人都可以查询交易双方的账户信息。

(3)发生在区块链上的交易,是存储在区块链网络中的所有全节点(拥有所有交易数据的区块链节点叫作全节点)上的,并且也是公开可查的,用户不仅可以查询某个账户下的所有交易,还可以查看其账户余额。

区块

所有的交易信息都会形成一个结构化的账本,它们会被区块链的节点(矿工)按照一定的方式和时间间隔组织起来,存储在区块链节点中。这个用于存储交易信息的结构体就是区块,除了交易信息,区块还要存储一些额外的信息以保证交易数据的完整性和可靠性,区块数据结构如下:

不同的公链有各自不同的涉及,关于区块的生产间隔,不同的区块链网络有不同的设定,比如以太坊出块的时间间隔约 15 秒,而比特币网络则需要 10min 才生成一个区块。

区块数据包含区块头与区块体,区块体存储具体的交易及交易相关的原始数据,区块头存储的是原始数据的 Hash 信息,任何对原始数据的修改,都会引起区块头 Hash 值的变化,这样对任何信息的篡改都很容易被察觉到并被验证为假数据。

区块的作用就是将不同时间阶段内的交易数据按照一定的格式和数量,打包成结构化数据,方便存储和管理。只有被打包到区块中并且被全公链网络认可的交易,才算真正的有效交易。

区块头和区块体数据也会被当作输入数据做一次 Hash 运算,其运算结果会被存储在下一个区块的区块头中,这样任何区块内容的修改都会反映到区块的 Hash 值上,而区块的 Hash 值又是下一个区块的输入数据,它又会被当作新区块的数据参与一次新区块的 Hash 运算,随着时间的推移和交易量的增加,所有的区块会通过保存前一个区块的 Hash 运算结果的方式组成一条链。

==将交易打包成数据块,再将数据块以 Hash 值的方式组织成链式结构,这就是区块链定义的来源。==由分布在全世界的节点组成,任何人都可以公开查询,但又无法任意修改。

挖矿

区块被增加到区块链之前,并不是所有区块都可以生成区块数据,也不是所有区块数据都能被增加到区块链成为最新的数据,这个过程有一定的门槛,需要筛选出一个值得信任的节点来生成数据,然后由其他节点来验证其生成数据的有效性。这个生产区块的过程会得到数字货币的激励,因此很多节点会加入生产区块的竞争。如果某个节点生产的区块数据得到了其他节点的验证,则其他节点会将最新的区块存储到本地,然后加入下一个数据块的生产竞争,这个过程被称为挖矿,而生成数据的节点被称为矿工。

需要注意的是,在矿工将交易打包成区块之后,还需要查找一个数字 n,这个数字满足不等式:

n < = 2 256 / H d n <= {2^{256}}/{H_d}

n<=2

256

/H

d

计算有效数字 n 的过程是需要付出算力的,而这个算力付出的过程是值得信赖的,这就是区块链为何可以在没有中心管理者的情况下正常运作,且任何人都可以在无须信任的情况下参与区块链业务。

成为出块人就可以成功拿到奖励,奖励分为系统的奖励和交易中的交易手续费,在每一笔交易数据中,转账人都可以手动设置手续费,这些手续费用于奖励矿工打包的工作。在转账时设置的手续费越高,转账时间就越短,转账速度就越快。

共识算法

在挖矿的过程中,矿工需要付出算力来查找一个满足条件的数字,这种算力的付出是无法伪造的,必须付出相应的算力和电力之后才能得到正确的数字。当某一个节点发现该数字之后,其他节点可以很快验证该数字的有效性,验证并不用花费太多的算力和能源。这种为了持续生成区块而被所有网络节点认可的方案就叫做共识算法,而付出算力来证明自己工作的共识算法被称作 PoW(Proof of Work)。

目前比较流行的共识算法由 DPoS、BFT 和 PoST 等:

DPoS:类似于民主选举的运行模式,该算法根据数字货币持有的数量对区块事务进行投票管理,并且轮流来选举出块人进行出块。

BFT:拜占庭容错机制,该机制通过多次通信交互来区分恶意节点和诚实节点,接收诚实节点的区块数据,丢弃恶意节点发送的数据和消息。

PoST:是存储公链的共识算法之一,即统计节点有效存储和数据的大小和时长,将其作为节点的算力,来竞争成为出块节点,算力越大成为出块节点的概率越高,算力越大生成恶意数据的动力就越小,这是通过一种经济手段约束恶意行为的共识算法。

分叉

因为整个区块链系统是点对点的对等网络,没有统一的中心机构协调各个节点的行为,所以在生成区块时,各个节点的行为都是相互独立的,很有可能同时由多个矿工在同一区块高度生成出 2 个以上的区块来。这些区块打包的交易很可能是不一样的,同时满足条件的数字 n 不是唯一的,多个矿工之间生成的数字 n 是不一样的,但是同样是满足不等式的。在这种情况下,网络中的其他节点很可能同步到不同的区块数据,并且这些数据在数学上都是合法的、有效的。当不同的节点中的不同的区块作为当前最新区块时,就会存在分叉的情况,即不同的矿机对同一高度的区块生产了内存不一样的新区快,并且这些矿工都找到了满足不等式的数字 n。

攻击

区块链对于交易的组织方式及账户的管理方式决定了只有私钥持有者才有权修改本账户下的数字货币信息。但是并不意味着区块链是绝对安全的,由于区块链网络是无主的,每个持有数字货币的账户和区块打包的矿工都无须审批、无须信任,随时随地可以参与,因此,只要拥有足够的算力就可以对整个网络发起攻击,比如著名的 51%算力攻击。除了算力攻击,还有仅属于区块链点对点网络特有的攻击,比如女巫攻击、日食攻击等。

以太坊智能合约

除了拥有上述区块链的基本功能,以太坊还在比特币网络的基础上增加了以太坊智能合约虚拟机,即 EVM。在增加了 EVM 之后,以太坊就成了一个可编程的去中心化平台,任何系统开发者在支付一定的部署费用之后,就可以拥有一套完全去中心化的业务系统,这样的业务系统被称为 DAPP。

以太坊

首先,以太坊可以视为大型的状态机,由分布在全球的以太坊节点来运行这个状态机,每一次交易的产生都会修改状态机的状态,将交易打包成区块之后,可以以区块为单位来衡量状态的迁移。

以太坊的状态是由以太坊上的所有账户组成的。也就是说,以太坊上的所有账户组成了以太坊的全局状态,以太坊账户的地址与账户状态的一个映射结构。以太坊账户又分为两种:一种是外部账户,也就是用于存放用户余额和转账的账户;另一种是智能合约账户,是在部署智能合约时生成的一个关于该智能合约的区块链地址及其状态的映射关系。

智能合约账户,其地址映射到一个账户状态,这个状态由 4 部分组成:nonce、余额、存储数据的 Hash 值、EVM 代码的 Hash 值。存储空间是智能合约虚拟机运行时需要的存储介质,EVM 代码是智能合约代码编译并部署到以太坊之后的数据。

外部账户,该账户的状态仅仅由 nonce 和余额组成。

以太坊上的账户之间会有系统调用:

首先是账户生成交易对以太坊状态的修改。每次创建和部署智能合约,都会创建一个新的账户,创建账户的代码包含在交易中,交易可以由外部账户发起,也可以由合约账户发起,创建合约账户的代码通过 solidity 编程语言编写,通过以太坊的智能合约编译器编译生成。

其次,账户生成之后,会开辟账户存储空间和以太坊虚拟机可以理解并执行的代码。当智能合约生成之后,可以通过 ABI 接口调用智能该智能合约,这种信息调用也会对区块链的状态发送读写操作。通过 ABI 接口传入外部数据,然后通过以太坊智能合约虚拟机读取合约代码,结合输入的数据和区块链上存储的数据,修改区块链状态,并将最新的状态信息存放在以太坊公链上。

EVM

在以太坊之前的公链项目中,如果需要修改某条公链的某些特征或者增加对某种场景的支持,开发者必须在原有的公链设计的基础上修改系统底层源代码,并重新维护一套公链生态,这往往被称为硬分叉。

而以太坊 EVM 的出现,使得任何需要实现某一行业具体逻辑的开发者,无须复制以太坊的整套代码,然后修改出符合自己逻辑的公链,而是基于以太坊现有的公链网络和矿机组织、共识社区,通过 EVM 提供的 API 来编写智能合约,就可以完成一套区块链系统,一套满足自己业务需求的系统,该系统具有区块链所有的通行特征:去中心化、公开透明、无法篡改等。

因此,EVM 的出现使得对区块链编程成为可能,具有 EVM 的以太坊公链技术可以视为是对原有区块链技术的一次重大革新。

EVM 作为一个离线的、独立的运行环境,它无法访问外界的文件系统、网络接口等资源,目前 EVM 的指令中尚未支持对这些资源的操作。当编写的智能合约被编译成 EVM 能够理解的代码之后,EVM 会在自己独立的运行环境中执行用户编写的智能合约程序。

通过智能合约编译器,可以将智能合约编译成虚拟机能够理解的指令,然后通过以太坊账户发起一个交易,将这些指令部署到区块链上,部署成功后会得到一个以太坊的地址,这个地址指明了该合约代码存放的位置。

当合约被调用时,可以根据合约的地址找到指令集的存储位置,虚拟机通过程序指令计数器记录当前指令的执行位置,随着程序的执行,指令计数器也会随之变化,它存储了下一条需要执行的指令的地址(偏移地址)。在指令中会有 JUMP 之类的跳转指令,因此指令计数器的数值并非总按顺序逐渐增加。

EVM 的指令执行不在寄存器中执行,而是在一个被称作栈的内存空间中进行。这个栈最多可以容纳 1024 条栈指令,每条栈指令可以达到 256 位,也就是说 EVM 是 256 位的计算机,这个长度的指令特别适合 Keccak-256 Hash 数据及椭圆函数运算。

智能合约的指令中包含了操作码和操作数,EVM 加载到栈中之后,根据操作码运算,在执行操作码的过程中,会产生中间状态的临时数据,这些数据会被存放在栈空间上、内存中或者持久存储的空间中。指令中也有从内存或者持久存储空间中读取数据的操作,有些操作需要在区块链状态的基础上进行下一步的操作,这些状态信息就存储在持久存储空间上;有些操作是存储的运算,这些数据一般通过内存进行读写。使用内存和持久存储空间需要支付一定的 GAS 费用。GAS 指的是 EVM 执行指令时消耗的代价,这个代价以以太坊的数字货币 ETH 来表示。

智能合约

1996 年,Nick Szabo 在文章《Smart Contracts: Building Blocks For Digital Markets》中提出了智能合约的概念。==所谓“合约”,就是条文、合同一类的东西,里面记录了发生的条件与对应执行的条款,以支持确权等操作;所谓"智能",就意味着自动化、可编程。==所以,智能合约就是可编程的合同,也可以理解为一段自动执行的条文合同,在计算机中,就是一段自动执行的程序片段。它更易于合约保存,并且由确定的算法运行,给定输入,就得到对应的输出,极大保障了合约的执行力。

以自动售货机做类比,可以帮助我们更好地理解智能合约的核心特征。当使用者选择好要购买的货物并完成支付,出货逻辑就会被触发,用户就能得到想要的货物,而这个过程不需要人工介入,节省了售卖货物的人力成本。如果要破坏这个合约,就得物理破坏售卖机。像 POS 刷卡机、EDI(电子数据交换)等,也可作此种类比。

以太坊公链是操作系统,EVM 是区块链代码的运行环境,而 Solidity 则是区块链的编程语言,通过编程语言编写的逻辑模块被称为智能合约。智能合约产生价值的最基本前提是有一个强有力的底层介质用于储存,让其不可被物理破坏。

以太坊与比特币最大的不同在于可通过智能合约执行复杂的逻辑操作。在以太坊上,智能合约的语言是 Solidity,它是图灵完备且较为上层的语言,极大地扩展了智能合约的能力范畴,降低了智能合约编写难度。

智能合约在区块链上的可执行代码是一种类似汇编语言的指令集,这些指令集通过 EVM 的解释和执行,对区块链的状态进行读写,实现合约规定的业务逻辑。因此通过 Solidity 这种高级编程语言,加上 Solidity 编译器,可以将高级语言编译成汇编指令集码,再将其部署到区块链上执行。

账户发起创建合约交易时,以太坊交易中会加载合约创建代码,矿工在打包交易时会执行该合约的初始化代码,并生成智能合约对应的 EVM 代码和该合约对应的账户地址,当该交易所在的区块被成功打包并同步到其他节点时,其他节点就可以通过消息调用来访问该合约对外开放的接口和功能。

智能合约的现状

从编程角度而言,智能合约就是一段代码。相比常规代码,智能合约具有许多差别与限制,例如:

单线程执行

代码执行会消耗资源,不能超出资源限制

目前难以获取链外数据,例如取得天气信息、比赛结果等

其他限制,如 TPS

这些特点使得目前智能合约生态以链上资源的治理为核心。就像以太坊上各式各样的 ERC 标准与治理方案;EOS 上有各种资源模型,比如 CPU、RAM、兼经济模型、Rex、Bancor 协议等。

显然,就目前的生态而言,智能合约对现实世界的影响力有限。但事物总是在发展的。目前,已有许多致力于突破这些限制的研究,典型的有 Oracle(谕言机,但常被称为预言机),它允许智能合约和链外进行交互,这样就能大大提高智能合约的使用场景,彷佛一台电脑通上了网;再比如那些突破链自身性能瓶颈的尝试,例如支付通道、跨链、plasma、rollup,它们都从不同角度打破安全与性能的枷锁。

毋庸置疑,智能合约将扮演着越来越重要的角色,将来随着以太坊 2.0 的落地,也许会开启新一个区块链时代。

智能合约技术

以太坊采用了 Solidity 作为智能合约语言,Solidity 是一门为实现智能合约而创建的高级编程语言,能在允许以太坊程序的节点上运行。该语言吸收了 C++、JavaScript 的一些特性,例如它是静态类型语言,支持继承、库等。

除了 Solidity,每个平台的智能合约技术也有所不同,接下来将从公有链、联盟链作为切入,介绍其他平台所采用的技术。

公有链

首先,不妨先认识三大公链的智能合约技术。

链 合约语言 底层技术 图灵完整 备注

比特币 脚本语言 脚本语言 否 未被官宣为智能合约,但具备某些特征

以太坊 Solidity EVM 是 是最活跃的合约语言之一

EOS C++/… WASM 是 WASM 是底层字节码,理论支持多种上级语言

联盟链

除了公链,联盟链也是重要的区块链类型。比之公链,联盟链共识的复杂度被大大缩减,因此具有更高的执行效率。

联盟链受企业级机构青睐,一般而言,相关机构之间会形成联盟,通过联盟链来共享数据。联盟链可覆盖供应链金融、司法存证、溯源等多种场景,未来还会与 IOT、AI 等技术结合。

在当今联盟链生态中,除去采用 chaincode 的 Fabric,大部分平台都采用 Solidity 作为智能合约语言,FISCO BCOS 即是如此。

当前,Solidity 可谓占据了智能合约的 C 位,掌握 Solidity 是学习智能合约和区块链的重要一环。后面系列也将对如何用 Solidity 编写、运行以及测试智能合约作深入介绍解析。

除了 Solidity,WebAssembly、Libra 的 Move 等一些智能合约语言也在发展中,可以保持关注。

DAPP

一套完整的区块链 DAPP,除智能合约这些可以查询和改变区块链状态的代码外,还需要用户操作界面及连接用户操作与智能合约代码的接口。

首先,用户通过 Web 界面或者收集 App 将操作数据发送到一个传统的业务服务器,该业务服务器时传统互联网中心化的服务器,但是与传统系统不同的是,该系统没有像传统互联网设计那样将数据放入中心化的数据库存储,而是通过一个 Web3.0 接口,将数据传送到以太坊区块链公链上。

该接口是一个 JSON RPC 协议,该协议由很多代码实现。目前最流行的是运行在 Web 容器中的 Web.js3 模块。Solidity 编程语言经过编译之后,除了交易需要的合约初始化代码之外,还有 ABI 接口等描述文件,Web3.js 通过这些描述文件,可以构建与以太坊智能合约虚拟机进行通信的模块,通过 JS 代码将用户的操作数据传入以太坊公链上的合约地址,智能合约虚拟机会根据函数签名和加载的函数参数,在虚拟机内执行编译成 EVM Code 的智能合约。

如果涉及区块链数据的读取,则虚拟机会读取区块链上的区块数据。如果虚拟机的指令代码修改以太坊公链的状态,那么通过调用相关的状态机指令,并消耗一定的 GAS 之后,就可以将修改操作提交到以太坊区块链公链网络中,这些操作往往以交易的方式体现。

在虚拟机执行任务结束后,其对区块链状态的修改会被矿工打包。当状态修改被全网共识时,虚拟机对公链网络的状态修改也相应成功。可以通过查询相关的执行结果,将执行状态返回给用户交互系统,这样终端用户就可以通过交互系统查看 DAPP 操作的执行结果

————————————————

版权声明:本文为 CSDN 博主「镰刀韭菜」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/ARPOSPF/article/details/105255986

用户头像

联系wxwy926

关注

只做区块链技术开发 2023-08-24 加入

为海内外客户提供交易所开发、元宇宙游戏、链游开发、国内积分商城开发、区块链钱包、公链、联盟链、项目宣传 宣发、项目包装、代币发行、智能合约开发 dapp开发 量化交易软件 夹子机器人 k线机器人。互助分红系统

评论

发布
暂无评论
【区块链DAPP】智能合约概述_区块链_联系wxwy926_InfoQ写作社区