主页 > 苹果商城可以直接下载imtoken吗 > 分享大事记 | 区块链技术与智能合约介绍(开发实例)

分享大事记 | 区块链技术与智能合约介绍(开发实例)

image

1 什么是区块链

1.1 白话解释区块链

现在区块链很流行。 可能大家都听说过区块链和比特币,那么区块链到底是什么?

几天前,我和一个朋友出去玩。 我给他安利了区块链、比特币和一些数字货币的知识。 这位朋友也是技术人员。 他问我:你说了很久区块链和数字货币。 作为技术人员我可以理解,其他人可能不理解,所以除了这些技术术语,你能简单介绍一下什么是区块链吗?

当时,我被这个问题惊呆了。 百度搜索官方给出的答案是:区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的一种新型应用模式。 看完这句话,相信大部分人还是不能完全理解。

那么,让我用通俗易懂的语言重新解读一下“什么是区块链”。 区块链是一种人人参与的记账方式,不需要中介,有奖励机制。 因为每个人都有这个账本的备份,每个账本都有连续性,所以不会有造假,而且是公开透明的。 而且不会出现一个公司独大的情况,因为这个账号只有在大家达成共识后才会记账。

image

举个例子帮助理解。

比如在一个村子里,村民的孙子找老李借一百块钱,老李怕他反悔,就让村长去公证,记账。 这称为集中化。 可你不去找村长,拿个喇叭在村子里喊,我老李借给老孙一百块钱! 请记在账本上”,然后大家就来验证,确实是这样,所以记在账本上,就叫去中心化。

过去,村长德高望重,掌握着全村的账本。 每个人都把钱存到他那里。 这是过去大家对中心化的信任。 现在,大家都担心村长偷偷挪用你的钱。 我们应该做什么? 所以我们给大家发了一个账本,谁在他们之间转账,谁就通过喇叭发布这个消息。 每个人收到消息后比特币合约例子,每个人都把交易记录在自己的账本上,这就是去中心化。 有了分布式账本,老张、老李的账本丢了也没关系,因为老赵、老马他们家都有账本。

后来,村民们觉得大家背起来太麻烦,就可以每天轮流换人背,谁干了这个活儿,就给予一定的奖励。 这样一来大家就抢着录了,于是大家都同意谁先掷到6就可以录,但是对账号的格式有要求,下一个账号的开头必须带上一个账号的标识。 这样就杜绝了盗号,记号之后一定要公布给大家,让大家公开查账。

自从村里采用了这种新的记账方式后,大家都很高兴。 他们不用担心假账坏账,记账还能得到奖励,于是周围的村子纷纷效仿。

其实,区块链技术并没有想象中那么神秘。 它的运行方式和运行原理就像例子中提到的乡村记账法。 通过这个例子,我们可以更形象地理解区块链本身的运行模式。

2.2 比特币与区块链的关系

说到区块链,就不能不提到比特币。 去年以来,比特币一路飙升,与其他数字加密货币一同走红,使得数字加密货币市场一度盖过了股票、外汇、黄金等市场。 那么什么是比特币? 区块链和比特币是什么关系? 事实上,比特币是世界上第一个使用区块链技术的应用。

2008年的金融危机几乎席卷了整个世界。 2008年底,一个叫中本聪的人发表了一篇论文《比特币:一种点对点的电子现金系统》。 通过这篇论文,他阐述了对金融危机后遗症的一些看法和思考。 本文主要提出一个系统设计:

通过哈希为所有交易打上时间戳,将它们合并到一个不断延伸的基于哈希的工作量证明链中作为交易记录,除非重新做所有工作量证明,否则形成的交易记录不会改变。 最长的链不仅可以作为观察到的事件序列的证明,而且可以被视为来自最大的 CPU 计算能力池。 只要大部分 CPU 算力不打算合作攻击全网,那么诚实节点就会产生超过攻击者的最长链。

(也就是说,如果要攻击,必须掌握51%以上节点一半以上的算力,也就是我们常说的51%攻击,做起来难度很大,而且攻击的成本远大于攻击的成本收入。)

系统本身需要很少的基础设施。 信息以最大努力的方式在网络中传播,节点可以随时离开和重新加入网络,以最长的工作量证明链作为节点离线时发生的交易的证明。

本系统有非常完善的业务模型,保证系统的正常运行,不被黑客攻击。

比特币数据结构

image

从图中可以看出,一个区块由区块头和区块体组成。 区块头包含前一个区块头的哈希值和 Merkle 根。 每个区块头中的默克尔根与区块相关联 区块中有很多交易,每个区块通过区块头的哈希值关联,也就是它的哈希值。

可以看出,这是一种非常有趣的数据格式,将连续发生的数据一个一个地划分成数据块,在下载和同步这些数据时可以从各个节点并行获取。 不管数据的先后顺序,到达本地后,根据数据块的标识进行组装。 另外,这是一个链式结构。 链式结构最大的特点就是很难破坏。

简单介绍一下Merkle树,比如上图右下方的树形数据结构。 比特币中的默克尔树称为二叉默克尔树,是将区块中的交易哈希值配对计算出的新哈希值。 交易哈希值成对配对,然后进行递归循环,直到计算出最后一个根哈希值。 这样的树就是默克尔树。

为什么要用Merkle树这样的数据结构来存储交易的交易数据呢? 由于比特币系统是分布式网络结构,当一个节点需要同步自己的区块链账本数据时,没有明确的服务器下载数据,而是通过与其他节点通信来实现的。 下载区块数据时,难免会损坏部分数据,因此可以使用 Merkle 树来验证每笔交易。

后来人们通过研究比特币的白皮书及其源代码,提炼出其背后的一系列思想和技术,并将提炼出来的结果称为区块链。 区块链技术不仅可以实现数字货币,还可以基于该技术实现各种应用。 因此,比特币是区块链技术的一种实践方式,区块链是比特币的技术基础。 这就是比特币和区块链的关系。

现在的比特币是一个家族,包括BTC、BCC、BTG等,各种类似比特币的加密货币应运而生。

为什么现在有比特币现金、比特币黄金和莱特币? 这要从扩容说起:比特币本身的区块容量限制在1M,随着时间的推移,运行速度越来越慢,因为1M的容量太小了,一个区块只能容纳有限数量的For交易,网络中会排起长队等待确认的交易,此时需要扩容。

所谓区块链扩容,主要是指增加区块容纳交易交易的能力。 通常有两种方法:一种是增加权限空间的大小,另一种是减少交易数据的大小。

第一种方法符合一般思维,就是我们的衣服越来越多,一个衣柜装不下,就多买了几个衣柜; 第二种方法的意思就是,比如说像前面的例子,衣服越来越多,在不增加衣柜的情况下,我们把衣服折叠好,压紧,这样同样的空间可以容纳更多的衣服。 第二种方法引出一个概念:segregated witness isolation verification。

隔离见证

比特币的交易数据结构是由发起者签署自己的UTXO(未花费的交易输出),然后填写接收者的地址来建立的。 这笔交易的过程就像签支票一样。 这张支票相当于一笔比特币交易。 签署UTXO就相当于签署了支票,也就是所谓的验证。 这个签名是用来确认支票的合法性的,然后我们可以在支票上看到关键的东西:发件人的签名,收件人的地址,以及要支付的金额。

那么如何判断支票数据的唯一性或完整性呢? 在比特币中,对每笔交易进行哈希计算,得到一个交易ID。 在计算这个交易ID的过程中,涉及到包括上述签名在内的整个交易。 签名信息的主要作用是验证交易数据来源的合法性。 事实上,验证过程也是交易过程,只需要执行一次,即计算一次。 矿工负责验证交易是否合法授权,而其他普通节点只关心收到的结果。 这部分拆分数据对于普通节点其实用处不大。 这部分数据在接收时可以丢弃,然后开始以节省资源为目的,这种将验证信息与交易数据分离的思想就是Segregated Witness。

分叉是分布式共识的副产品,只要两个矿工几乎同时找到一个区块,就会产生分叉。 当后续块被添加到其中一个块时,这种不确定性就会消失,从而使链条最长; 另一个块被网络“孤立”或“遗弃”。

分叉分为硬分叉和软分叉。

硬分叉是向网络引入与旧软件不兼容的新规则的软件升级。 您可以将其视为规则的扩展(使块大小为 2MB 而不是 1MB 的新规则需要硬分叉)。

分叉后,继续运行旧版本软件的节点会发现新交易无效。 因此,为了切换到新链并继续挖掘有效区块,必须将所有网络节点升级到新规则。

当存在某种政治僵局并且社区的某些部分坚持旧规则时,就会出现问题。 旧链的哈希率和网络计算能力将变得过时。 重要的是老链的数据和规则还是有价值的,矿工当然要继续挖,开发者要继续支持。

比特币的第一次硬分叉是在 2017 年 8 月 1 日,产生了比特币现金。 当时也有大量的矿工和社区支持。 比特币现金市值一度超越ETH,成为主流数字货币。 之后比特币的分叉一发不可收拾,出现了各种币,但是从走势来看,这些分叉的币如果没有很好的技术支持,也没有那么多人支持。 这要看市场的走势,能不能给矿工带来收益。

软分叉是加强一些规则。 因此,新规则可能会拒绝 1MB 的区块,而支持 500K 的区块。 软分叉是向后兼容的。

尚未升级的节点将继续将新交易视为有效。 但是,未升级节点开采的区块将被升级节点拒绝。 因此,软分叉需要网络的大部分计算能力。

如果软分叉得到少量算力的支持,可能会成为最短的链,进而得到网络的鼓励。 或者它可以像硬分叉一样分离出来并独立运行。

软分叉是升级比特币的常用方式,因为分裂网络的风险被认为很低。 以往成功的软分叉包括BIP 66软件升级(涉及签名验证)、P2SH(修改比特币地址格式)。

比特币的一次重要升级是在2012年,升级了P2SH机制,被社区称为多重签名软分叉。 本次升级修改了比特币数据结构中的lock script字段,使比特币更方便地通过多重签名发送交易。

除了修改数据结构,软分叉还可以有针对性地修改比特币的交易历史。 例如,2010年8月,黑客利用比特币“不禁止负输出值”的漏洞,在半天后开发的高度为74638的区块上生成了一笔包含1844个比特币的交易。 工作人员发现了意外,紧急发布补丁:定义一类负输出交易为无效,利用软分叉的特性发布补丁修复漏洞。

因为硬分叉和扩容,所以会出现Bitcoin Cash、Bitcoin Gold等分叉的币种。 因为一开始的扩容问题,莱特币等山寨币一开始设计的区块大小都是8M,运行机制几乎和比特币一样。

image

2 什么是以太坊

2.1 区块链1.0——数字加密货币

以前我们讲web1.0、web2.0、移动互联网等概念,那么什么是区块链1.0、区块链2.0乃至区块链3.0呢? 区块链 1.0 是一种数字加密货币。

image

上图展示了数字加密货币的结构。 从整体来看,一个区块链系统分为节点后台和前端两部分。 前端包括钱包、命令行界面、区块链浏览器、图形界面开发工具等多种表现形式。

我们与各种钱包接触较多。 钱包的主要功能是保管账户或私钥、签署交易、发送交易验证等。

节点后台包含系统的核心功能,包括共识机制、相邻节点管理、区块链管理、交易验证、内存管理、脚本引擎等。节点可以安装在各种计算机或设备中,专门用于挖矿称为矿机。

2.2 区块链 2.0 可编程区块链

接下来,我们来看看区块链2.0。 区块链 2.0 是一个用于创建去中心化程序、自治组织和智能合约的系统。

与 1.0 的不同之处在于,2.0 提供了一个可以构建应用程序的平台。 最大的代表是以太坊,它提供了各种模块,用户可以基于它们构建应用程序。 这个应用程序本质上是一个智能合约。

智能合约除了构建货币体系外,还可以实现股票、债券、期货、借贷、产权、智能财产等功能。智能合约的核心是用程序算法代替人来执行合约,这些合同需要自动化的资产流程。 合同由三个基本要素组成:要约、承诺和价值交换。 智能合约有效地定义了新的应用形态,使区块链能够从最初的货币体系扩展到金融等行业应用。

image

如图,我们看一下2.0的内部结构。 与1.0相比,2.0也分为前端应用和后台节点两部分。 前端应用类似,只是在区块链2.0中有一个智能合约开发工具,它是一个基于Web的应用,广泛用于智能合约的开发。

节点后台最大的变化是增加了智能合约模块和EVM虚拟机。 EVM 是用于执行智能合约的虚拟机。 它类似于Java的虚拟机,可以执行智能合约编译的字节码。

以太坊目前支持三种编程语言:solidity、serpent、LLL。 Solidity更主流。 除了金融应用,solidity在游戏的性能上也有广泛的应用。 比如去年大热的CryptoKitties,就是用solidity开发的。

此外,以太坊还增加了一个数据库模块,存储以太坊的事件状态。 以太坊的区块并不存储所有的交易信息,只存储交易的哈希值。 关于以太坊的存储结构,我们会在后面的章节中详细介绍。

2.3 区块链应用场景 3.0 区块链在金融业以外的各个行业

上面介绍了区块链1.0和区块链2.0的特点,那么什么是区块链3.0呢?

区块链3.0:区块链3.0是指区块链在金融业以外的各个行业的应用场景。 可以满足更复杂的业务逻辑。 区块链3.0堪称继互联网技术之后的新一代技术创新,足以推动更大的产业变革。

2.4 什么是以太坊

以太坊概念最早由程序员Vitalik Buterin于2013年至2014年间提出,受到比特币的启发,大意为“下一代加密货币和去中心化应用平台”,并于2014年通过ICO众筹开始发展。

与其他区块链一样,以太坊需要成千上万的人在他们的计算机上运行一个软件来为网络提供动力。 网络中的每个节点(计算机)都运行一个称为以太坊虚拟机(EVM)的软件。 将以太坊虚拟机想象成一个操作系统,可以理解和执行以以太坊特定编程语言编写的软件。 由以太坊虚拟机执行的软件/应用程序被称为“智能合约”。

在这台世界计算机上做任何事情都是收费的。 然而,付款不是使用美元或英镑等常规货币,而是使用网络的本地加密货币,称为以太币。 以太币与比特币非常相似,不同之处在于以太币可用于支付在以太坊上执行智能合约的费用。

可以换个方式理解,就像现在的云计算一样。 比如我们需要为虚拟机付费。 以太坊可以理解为另一种形式的云。 我们需要用它来在上面运行我们自己的应用程序或服务。 支付的货币。

image

以太坊不仅仅是像比特币一样的加密货币,它还具有使其成为巨型分布式计算机的其他特性。 然而,它非常慢——比今天的普通计算机慢大约 5 到 100 倍——而且价格昂贵。 那么为什么这个不怎么好看的计算机系统在全世界如此流行呢?

在以太坊上,人类和智能合约都可以充当用户。 智能合约可以做人类用户可以做的事情,甚至更多。 以太坊为用户提供了一种内部图灵完备的脚本语言来构建任何精确定义的智能合约或交易类型。 要构建一个全面的守护进程或天网,您可能需要几千个互锁合约并确保慷慨地提供它们,一切皆有可能。

2.5 智能合约

那么什么是智能合约呢?

想象一下,我们两个人打赌明天的天气。 我赌明天是晴天,你赌明天会下雨。 我们同意输家必须给赢家 100 美元。 我们如何下这个赌注并仍然确保输家信守诺言? 我可以想到三种不同的方法:

最简单的方法就是互相信任。 如果我们已经是老朋友了,就很容易相互信任。 我知道你的家庭住址,你也知道我的黑历史。 但是,如果我们是陌生人,那就更难了。 你没有理由相信我,我也没有理由相信你。

另一种可能的方法是根据我们之间的赌注签订合法合同。 我们双方都会签署一份合同,详细说明打赌的条款——包括关于输家违约的条款。 这份合同将使我们在法律上有义务支付赌注的赢家,但这是不切实际的。 因为如果通过法律手段强制对方履行合同,成本会比打赌本身还要高。

我们可以找一个我们都信任的共同朋友,每人支付 100 美元与他或她在一起。 第二天,他或她查看天气并将 200 美元转给获胜者。 这种方法简单明了,除了一种情况:如果朋友带着钱逃跑了怎么办?

image

以太坊的智能合约在这种情况下可以派上用场。 智能合约就像是寻求共同朋友的帮助,只是写入了代码。 使用以太坊,我们可以编写软件向双方收取价值 100 美元的以太币。 第二天,打开API访问天气应用查看天气情况,将总价值200美元的以太币转给获胜者。 由于区块链的性质,智能合约一旦完成,就无法以任何方式进行编辑或修改。 因此,可以肯定的是,合同中规定的任何内容无论如何都会得到执行。

2.6 智能合约原理

image

本质上,智能合约也是以太坊交易。 无论智能合约何时执行,它都会记录有关在区块上执行的交易的信息。 上图描述了以太坊交易,分为几个字段:时间戳、发送方、接收方、账户发送的金额、数据。 这里sender就是调用者,receiver就是智能合约的地址,data就是智能合约要调用的内容,也就是俗称的API,DATA字段赋予了以太坊独特的创建记录的能力并执行智能合约。

一般来说,以太坊交易分为三种:

首先是人类用户之间的相互转账,如下图所示,此时Data字段没有内容,发送者和接收者都是人类。

image

第二种是没有接收者的以太币传输。 在没有接收者的情况下进行交易时,这意味着交易的目的是使用网络中“数据”项的内容创建智能合约。 “数据”项包含软件代码,其行为与网络上的任何其他用户相同。

image

第三个是用户和智能合约之间的以太币转移。 每当用户(或智能合约)想要执行智能合约时,他/她/它需要与智能合约进行交易,将执行指令放在“数据”项中。

image

2.6.1 以太坊账户

以太坊中有两种账户共享地址空间:外部账户和合约账户。 外部账户由公钥和私钥(如people)控制,合约账户由存储在账户中的代码控制。

无论帐户类型如何,这四个组件都存在:Nonce、Balance、StorageRoot、CodeHash。

外部账户的地址由公钥确定,而合约地址是在创建智能合约时确定的(这个地址来源于创建者的地址和发送者发送的交易号,这个号码通常称为“nonce” ") 无论账户是否有code(合约账户有code,外部账户没有),这两个账户就等于EVM。 每个账户都有一个key和value长度为256个字符的键值对的持久存储,称为“存储”。 而且,在以太坊中,每个账户都有一个余额(就是以“Wei”为基本单位),可以通过发送方与以太币的交换来改变。

2.6.2 交易

交易的本质是一个账户与另一个账户之间的信息交换,包括二进制数据(即消费数据)和以太币数据。 如果目标账户包含代码,一旦代码执行,其消费数据将作为输入数据。 如果目标账户是0账户(地址为0的账户),交易会生成一个新的合约。

image

image

上图红框内的内容是新合约编译出来的字符串。

这个合约的地址不是0,而是来自sender,然后会发送这个账户的交易数据。 该合约消费将被编译成 EVM 二进制代码并执行。 该执行将作为该合约的代码被持久化。 也就是说:为了创建合约,您不需要将实际代码发送给合约,实际上代码是作为合约代码返回的。

2.6.3 气体

以太坊上的每笔交易都会收取一定数量的 Gas。 这是为了限制交易数量并为每笔交易支付额外费用。 当EVM执行一笔交易时比特币合约例子,交易发起方会按照定义的规则消耗相应的Gas。 交易的创建者定义 gas 价格。 所以交易发起者每次都需要支付gas_price * gas。 如果执行后还有剩余的gas,将以同样的方式返还给交易发起方。 如果任何时候gas被消耗掉,就会抛出out-of-gas异常,将当前交易的当前状态回滚到初始状态。

这是一种保护机制,用来保护以太坊免受恶意攻击,让全网的一些恶意程序无法执行。 这里可以看出,区块链是用一种经济模型,或者说经济的方法,来限制黑客的攻击。 黑客并不是不能利用技术手段进行恶意攻击,而是他要付出的代价远远大于获得的价值。

2.6.4 以太坊虚拟机内存结构

以太坊中的每个账户都有一个称为存储的持久内存空间。 存储是key-value键值对,key和value的长度为256位。 无法从合约中枚举存储。 读取存储中的内容需要一定的成本,修改存储中的内容成本更高。 合约只能读取或修改自己的存储。

以太坊的第二个内存区域称为主内存。 系统为每个消息调用分配一个新的、清空的主内存空间。 主内存是线性的,以字节为粒度寻址。 读取粒度为32字节(256位),写入可以为1字节(8位)或32字节(256字节)。 当访问内存的一个字(256 位)时,主内存会扩展该字的大小。 当主存扩容时,Gas的消耗也必须付出代价,主存的开销会随着其增长(指数增长)而增加。

EVM 不是基于寄存器的,而是基于堆栈的。 所以所有的计算都是在栈上进行的。 最大大小为 1024 个元素,每个元素是一个 256 位字。 对栈的访问仅限于栈顶,如下所示:允许将栈顶的 16 个元素之一复制到栈顶,或者将栈顶与其下方的 16 个元素之一交换。 所有其他操作从堆栈中获取两个(可以是一个或多个,具体取决于操作)元素,并将操作结果放回堆栈。 当然,也可以将栈中的元素放入存储器或主存中,但不能在不移除上层元素的情况下随意访问下层元素。

2.6.5 指令集

为了避免不正确的实现带来的一致性问题,EVM的指令集保留了一个最小集。 所有指令都对 256 位字进行操作。 包含常用的算术运算、位运算、逻辑运算和比较运算。 允许有条件和无条件跳转。 并且合约可以访问当前区块的相关属性,例如数字和时间戳。

2.6.6 消息调用

合约可以调用其他合约或通过消息调用向非合约账户发送以太币。 消息调用类似于交易,它们都有源、目的地、数据有效负载、以太币、gas 和返回数据。 事实上,每个交易都包含一个顶级消息调用,这反过来又可以创建更多的消息调用。

一个合约可以定义内部消息调用需要消耗多少gas,需要预留多少gas。 如果在内部消息调用中发生 out-of-gas 异常,合约将得到通知,并在堆栈上标记错误值。 在这种情况下,该调用的 gas 已耗尽。 在Solidity中,这种情况下调用合约会造成人为异常,抛出堆栈信息。

如上所述,调用合约将分配一个新的且已清理的主内存,并且可以访问被调用的负载。 调用有效负载时称为 calldata 的单独区域。 调用结束后,返回一个存储在调用主存空间的数据。 这个存储空间是被调用者预先分配的。 调用深度限制为1024。对于更复杂的操作,我们更喜欢使用循环而不是递归。

2.6.7 代理调用/代码调用和库

有一种特殊的消息调用称为代理调用。 与消息调用相同,只是目标地址的代码是在调用者的上下文中执行的,并且 msg.sender 和 msg.value 不改变它们的值。 这意味着合约可以在运行时从其他地址动态加载代码。 存储、当前地址和余额都与调用合约有关。 仅从被调用方获取代码。 这允许我们使用 Solidity 中的库。 例如,为了实现复杂的数据结构,可以将可重用代码应用于合约存储。

2.6.8 日志

我们可以将数据存储在专门索引的数据结构中。 该结构映射到块级别的各个位置。 为了实现这个事件,这个特性在 Solidity 中被称为登录。 合约创建后无法访问日志数据。 但他们可以从区块链外部有效地访问这些数据。 因为部分日志数据存储在布隆过滤器上。 我们可以通过一种高效、安全的加密方式查询这些数据。 无需下载整个区块链数据(轻客户端)即可找到这些日志。

2.6.9 创建

合约可以通过特殊指令创建其他合约。 The only difference between these creation call instructions and ordinary message calls is: the load data is executed, the result is stored as code, and the caller receives the address of the new contract on the stack.

2.6.10 Self-destruct

The only way to remove code from the blockchain is if the contract performs a selfdestruct operation on its address. The remaining ether in this account will be sent to the specified target, and the storage and code will be removed from the stack.

3 Attachment: Example PPT based on solidity

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image