草庐IT

什么是智能合约?它有哪些应用?又有哪些问题?

袁文泽博客 2023-03-28 原文
所谓智能合约,指的是“一套以数字形式指定的承诺,包括合约参与方可以在上面执行这些承诺的协议”。早在1994年,美国计算机科学家尼克·萨博(Nick Szabo)就提出了智能合约的概念。不过,在当时的技术条件之下,这个概念并没有引起人们的太多重视。直到2008年,中本聪那篇关于比特币的奠基性论文发表之后,人们才发现作为比特币底层技术的区块链与智能合约存在着天然的契合,区块链可借助智能合约的可编程性封装分布式节点的复杂行为,而智能合约则可借助区块链的去中心化基础架构在去信任、可执行环境中有效实现。自此,智能合约才开始被人们重新重视,而区块链也逐渐成为智能合约最主要的计算场景。

图1 智能合约的运行机制

资料来源:欧阳丽炜、王帅、袁勇、倪晓春、王飞跃:《智能合约:架构及进展》,《自动化学报》2019年第3期,第447页。

智能合约的运行机制如图10所示。它一般具有“值”和“状态”两个属性,代码中用If-Then和What-If语句预置了合约条款的相应触发场景和响应规则。智能合约经多方共同协定、各自签署后随用户发起的交易(transaction,Txn)提交,经P2P网络传播、矿工验证后存储在区块链特定区块中。用户得到返回的合约地址及合约接口等信息后即可通过发起交易来调用合约。“矿工”受系统预设的激励机制激励,将贡献自身算力来验证交易。

“矿工”收到合约创建或调用交易后在本地沙箱执行环境(如以太坊虚拟机)中创建合约或执行合约代码,合约代码根据可信外部数据源[也称为预言机(Oracle Machines)]和世界状态的检查信息自动判断当前所处场景是否满足合约触发条件以严格执行响应规则并更新世界状态。交易验证有效后被打包进新的数据区块。新区块经共识算法认证后链接到区块链主链,所有更新生效。

随着区块链技术的逐渐兴起,智能合约的应用日益广泛。目前,它在金融、管理、医疗、物联网和供应链等领域都有了应用。

1.金融领域的应用

智能合约在金融领域的应用十分广泛。首先,它可以被用于资产清算。例如,由高盛、摩根大通等财团组成的R3区块链联盟率先尝试将智能合约应用于资产清算领域,利用智能合约在区块链平台Corda上进行点对点清算。目前,已有超过200家银行、金融机构、监管机构和行业协会参与了Corda上的清算结算测试。其次,它可以被用于保险理赔。Gatteschi等设计了一种旅行保险智能合约,一旦合约检测到如航班延误等满足要求的赔偿条件即可自动补偿旅客。最后,它可以用于资产交易环节。

例如,ECoinmerce是一种去中心化的数字资产交易市场,借助智能合约,任何用户都可在ECoinmerce上创建、购买、出售和转租其数字资产。类似的应用还有Slock.it,它允许用户基于区块链出租房地产、汽车、智能设备、路由器等有形资产,这些资产经智能合约编码获得身份认证后即可作为智能资产直接完成复杂协议。

2.管理领域的应用

传统的组织管理是自上而下的“金字塔型”架构,容易产生机构臃肿、管理层次多、管理成本高、责任界定不明、信息传递不畅、权力集中在上层而下层自主性小、创新潜能难以有效释放等问题。智能合约和DAO将对管理领域带来革命性影响。智能合约可以将管理规则代码化,代码设定完成后,组织即可按照既定的规则自主运行。组织中的每个个体,包括决策的制定者、执行者、监督者等都可以通过持有组织的股份权益或提供服务的形式来成为组织的股东和参与者(即前文所述的DAO)。DAO使得每个个体均参与到组织的治理中,从而充分激发个体的创造性,提高组织决策的民主化。此外,编码在智能合约上的各项管理规则均公开透明,也有助于杜绝各类不当行为。

3.医疗领域的应用

医疗技术的发展高度依赖历史病例、临床试验等医疗数据的共享,由于医疗数据不可避免地包含大量个人隐私数据,其访问和共享一直受到严格的限制。患者个人难以控制自己的医疗数据访问权限,隐私性难以保证,医疗工作者需花费大量时间和精力向相关部门提交申请进行权限审查并在数据使用前完成数据校验以保证可靠性,这样不仅工作效率很低,而且存在医疗数据被篡改、泄露以及数据传输不安全等风险。对于以上问题,医疗智能合约可以比较有效地加以解决。医疗数据可被加密存储在区块链上,患者对其个人数据享有完整的控制权,通过智能合约设置访问权限,用户可实现高效安全的点对点数据共享,无需担心数据泄露与篡改,数据可靠性得到充分保障。

目前该应用领域有三种比较典型的智能合约。一是医疗信息存储和共享合约。例如,MedShare为共享医疗数据提供溯源及审计服务,其设计采用了智能合约和访问控制机制,可有效追踪数据行为,并在违规实体违反数据权限时撤销访问。二是医学研究型智能合约。例如Kuo等提出了名为ModelChain的框架。该框架基于区块链进行医疗预测建模,每个参与者都可对模型参数估计作出贡献,而不需要透露任何私人健康信息。三是药品溯源及打假合约。例如,医疗药品联盟链MediLedger、电子处方平台BlockMedx等可用于加强对处方类药物的溯源能力。

4.物联网与供应链领域的应用

物联网与去中心化、去信任的区块链架构的结合将成为必然的发展趋势。智能合约将在此过程中实现物联网复杂流程的自动化、促进资源共享、保证安全与效率、节约成本。例如,Dorri等提出了一种基于区块链及智能合约的智能家居模型,探讨了模型中的各种交互流程,并通过仿真实验证明了此模型将显著降低物联网设备的日常管理费用。Zhang等提出了一种物联网电子商务模型,利用基于智能合约的点对点交易实现物联网上智能资产和付费数据的交易。Zhang等提出了基于智能合约的物联网设备访问控制模型,该模型由多个访问控制合约、一个决策合约和一个注册合约组成,可实现对物联网系统的分布式可信任访问控制。IoTeX则是一个以隐私为中心区块链驱动的去中心化物联网网络,支持包括共享经济、智能家居、身份管理与供应链在内的多种物联网生态系统。

与物联网类似,供应链通常包含许多利益相关者,如生产者、加工者、批发商、零售商和消费者等,其相关合约将涉及复杂的多方动态协调,可见性有限,各方数据难以兼容,商品跟踪成本高昂且存在盲点。通过将产品从生产到出售的全过程写入智能合约,供应链将具有实时可见性,产品可追溯、可验证,欺诈和盗窃风险降低,且运营成本低廉。其代表性的应用有棉花供应链、医疗药品供应链等。

尽管已经有了广泛的应用,但总体来说智能合约目前还处于发展的初期,仍有很多问题亟待解决:

(1)安全问题。

虽然智能合约拥有很高的效率,但其安全性依然是有待检验的。例如,2016年5月,以太坊最大的众筹项目The DAO被攻击者利用程序中的递归调用漏洞获取了大量以太币(Ether,ETH),这个问题引发了大众对于智能合约安全性和法律问题的思考。Luu等提出了检查智能合约漏洞的工具,文中利用工具检查了以太坊中包含3068654以太币、价值3万美金的19366个合约,其中有8833个合约至少包含一种安全漏洞。

(2)法律问题。

The DAO事件也对法律提出了巨大挑战:首先,界定“漏洞”困难,智能合约与实际合约无法显示转换;其次,由于区块链不可更改,智能合约难以撤销。目前也有一些研究从法律角度讨论智能合约的模板与标准化格式,法律与参数、代码联系以及数据标准与合约特点。

(3)效率问题。

区块链系统本身存在的吞吐量低、交易延迟、能耗过高、容量和带宽限制等性能问题极大地限制了智能合约的执行效率。同时由于智能合约按顺序执行,随着交易增多,交易确认将变很慢,且交易费会变高。

总之,要想扬长避短,发挥好智能合约的优势、减少使用中出现的各种问题,我们还有很多工作需要做。

有关什么是智能合约?它有哪些应用?又有哪些问题?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 将差异补丁应用于字符串/文件 - 2

    对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl

  4. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  5. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  6. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  7. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  8. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  9. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  10. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

随机推荐