一个简单的智能合约模型

article/2025/9/11 12:11:03

我问过的每个人对“智能合约”有着不同的定义。下面是我的智能合约定义。

最近这些天,我听到越来越的人谈论“智能合约”。但是,当你让他们对“智能合约”这一术语下一个定义的时候,他们不能清晰地表达,这一个概念就像从他们手中溜走了一样。

这不是什么新发现:Peter Todd在听过了多场研讨会以后,也得出了类似的结论。

经过多场智能合约的讨论后,我得出了这样的结论:没人真正知道智能合约是什么,如果实现智能合约,将需要预言机(oracles)。

— Peter Todd (@petertoddbtc) December 5, 2014

 事实上,我也是没能向Peter清晰阐明智能合约概念的人之一。

现在,对智能合约下一个定义,最简单的回答就是引用富有远见的学者的定义,他们在几十年以前就已经预言了“智能合约”。尼克萨博1997年的智能合约论文是非常简洁和有用的综述。另外,我也真的喜欢Grigg的“李嘉图合约”(Ricardian Contract)。萨博的“自动贩卖机”模型也十分有用。

但是,这些人的理念是在比特币、区块链和密码学货币出现以前提出来的,所以对密码学货币领域的新人来说,他们的定义存在隔阂,不够明显。更加使人混淆的是,现在有许多平台打算实施智能合约。事实上,你可以将比特币看作一个智能合约平台。所以,区分概念和具体实现的不同点变得更加困难。

在这篇文章中,我尽力解释为什么智能合约可能是一个非常棒的理念,然后做出我自己的“智能合约”定义和模型。

 

可复制、共享的账本( The Replicated, Shared Ledger)

当我思考区块链和分布式账本时,我首先从比特币的最核心创新开始:它教会世界如何在不需要信任第三方的情况下远距离转移价值。(我知道有些人会对此有异议,这个表述可能并不是100%精确–但是我觉得它能为思路带来直觉。)

我们当然可以面对面地转移实体纸币,但是,在比特币出现以前,我们做不到:在不需要信任中心化第三方机构(邮局、银行等)的情况,远距离向某人转移价值。

就好像银行和支付系统的传统转账模式的基础设施被重构为点对点支付网络。这种转变如下图所示:

 

smartcontracts1 (1)

比特币打开了点对点的电子价值转移模式的大门,完全不同于现在的银行系统、中央银行和支付系统。

但是,上面的图并没有解释比特币是怎样实现点对点价值转移的。

答案是:比特币系统建立在我所称的“可复制、共享的账本”之上。比特币网络中的每个参与者(完全节点)拥有一个完整的交易账本的副本,这一系统的神奇之处在于:它是如何做到使每个人的副本与其他人的副本保持一致的。

所以,正确的示意图应该是下图,每个参与者都能够从相同的可复制、共享的账本中获取信息。

smartcontracts2

 

比特币和其它去中心化共识系统的窍门在于:它们怎样保证每个人有一个账本的副本,并使每个人确信自己的账本与别人的账本是同步的。

先把可扩展性等问题放在一边,我们知道这样的架构能够运行:如果每个人拥有的账本的副本是相同的,那么人们就不再需要一个中心化的机构记录谁拥有什么。你知道:当你的账本更新,记录一笔新的资产所有权变动时, 其他人的账本也会发生相同的变动。

 

我们需要区分:账本记录什么和怎样记录

密码学货币领域的争论和竞争主要集中在:账本如何建构和保证安全。比特币的挖矿算法?以太坊的系统?瑞波币的共识算法?这些争论只聚焦于“怎样做”:怎样保证账本安全?共识过程如何工作?怎样防止坏人?因为不同的密码学货币对于自己可能面临的威胁的本质有着不同的假设,所以他们是不一样的。

但是,在这篇文章,让我们暂时忽视这些“怎样做”的问题,只问自己一个问题:账本记录什么?它可以用于哪些方面?

 

账本记录什么?

在我最近的一篇博文中,我探索了“可复制、共享的账本”这一概念如何应用到货币以外的领域。我的观点是:一旦你能确定地知道你对世界的观点与其他每个人是一致的,“可复制、共享的账本”在完全不相关的领域会开辟出新的可能性,例如会计领域。Ian Grigg写过关于三重记账法的文章,像tripleentry(三重记账)这样的公司正在探索三重记账法,变革现有的会计行业。

我们可以得到这样的结论:如果我知道每个人“看到”相同的事物,那么我就不再需要花费巨大的成本建立自己的账本,不再需要花费巨大的成本进行账本审计和与其他每个人的账本进行对账、调账。账本自身就可以为我做这些事情。

所以,可复制、共享的账本可能取代现有的商业系统中的记账方式。

哪些领域需要双重记账(duplication)?

 一个领域就是在商业逻辑之中(business logic)。在现实的商业中,有无数的这样的例子:合约的双方(或多方)分别独立地运行着一个计算/记账系统,对合约的条款进行建模。我有时候习惯于以银行为例,现在有几个非银行的例子:

大型线上零售商可能拥有一个系统,检查他们从快递公司收到的账单是否正确:所有商量好的打折都实行了吗?

大型杂货店与供应商就打折问题,达成复杂的合约协议。折扣的大小与一定时期内的销售量和许多其它因素有关。我们可以确信:合约的双方都已经开发出一套非常成熟的合约模型,并做成了软件。

 以上几个例子的共同点是:合约的每一方都需要独立的手段计算自己在合约中拥有的价值。他们不能相信对方。所以,每一方不得不建立自己的计算/记录系统。这会造成浪费,还需要对账、调账等。

但是回到我在上文所讲的:对于一个可复制、共享的账本,每个人都知道每个人看到的事情是相同的,一方不需要相信另一方是诚实的。

现在想象一下,你的账本也可以运行计算机代码。你需要做的是:

 当你与某人商定合约时,你也同意一份代码版的合约。

“合约使用哪个外部数据的信息源,怎么解决纠纷”,双方需要达成共识。

双方都仔细检查代码,确信不存在后门或者恶意漏洞。你也可以进行测试,查看它产生的答案是否正确。

双方对它感到满意后,签字并部署到账本上。

 现在双方都不需要花费精力在自己的系统中重新实现合约条款,双方都知道这段代码能够同时满足各自的目的。因为它运行在可复制、共享的账本,双方都能够确信程序的输出结果对两个人来说是一样的。

 

但是我们可以更加科幻

 到目前为止,我已经描绘了一种十分平常的应用场景:代表双方或多方之间合约协议的计算机程序。

但是,请记住:我们正在构想一个这些程序运行在可复制、共享的账本上的新世界。

如果这些程序能够与账本进行交互,会怎样?程序能够控制账本上的资产,你甚至可以向程序发送资产。所以,它不再只是一个计算机程序,而是一个自足的经济活动参与者。

回到上面提到的杂货店的例子:杂货店可以通过向计算机程序发送货款(数量为A),对供应商进行支付。程序可以计算出可能的折扣额(数量为B),然后将A-B(A减去B)数量的钱发给供应商,但是暂时保管折扣额B–因为我们只有到月底的时候才能确定地知道折扣率。到了月底,合约会将保管的B正确地计算并发给各方。

这个程序不再只是一个计算机程序:它自己就是一个参与者。它对接收到的信息进行回应,它可以接收和储存价值,也可以向外发送信息和价值。

这个程序就像一个可以被信任的人,可以临时保管资产,总是按照事先的规则执行操作。

我认为这就是人们谈论智能合约时想要表达的想法。

下面这个示意图就是我的智能合约模型:一段代码(智能合约),被部署在分享的、复制的账本上,它可以维持自己的状态,控制自己的资产和对接收到的外界信息或者资产进行回应。

smartcontracts4

我自己的智能合约模型:它是运行在可复制、共享的账本上的计算机程序,可以处理信息,接收、储存和发送价值。

 

理论上的问题

这就是智能合约的本质。如果更加正式一点,智能合约定义可能如下:

 智能合约是由事件驱动的、具有状态的、运行在一个复制的、分享的账本之上的、且能够保管账本上资产的程序。

 这只是我的临时性定义。智能合约还有许多理论问题没有解决。我总结了一下,以供将来的研究。

 导入真实世界信息

智能合约十分依赖于发送给它的信息的质量。“预言机”和“m个中选n个”(n-of-m)方案可以帮助解决问题。但是,我认为还应该考虑:如果信息源消失了,如果以前独立的信息源合并,如果新的更好的信息源出现了,该怎么办?

构建模型

如果可以有多种方式(例如,程序直接作为账本上的资产或者作为合约)为世界各种现象构建模型,最终选择哪一种,这可能是一种商业上的问题。需要出现最佳实践,以正确的方式为不同的真实世界现象建立模型。

处理程序错误

你写过没有bug的程序吗?智能合约部署后,发现它存在bug,明显地有利于合约的一方,该怎样进行修复? 就像律师可以通过发现合约中的漏洞,赚到许多钱一样,会出现一种通过发现智能合约中的漏洞赚钱的“工程师-律师”吗?

流动性

如果资产由智能合约保管,那么这些资产任何人都不能使用。这将改变许多商业模式的经济逻辑。

合法性

智能合约具有与“真正”合约一样的法律效力吗?如果智能合约的结果违背法律,或者法庭发现它有合约法冲突,怎么办?

隐私

大多数分享的、复制的账本都是公开的。我不知道有多少零售商同意公开自己与供应商之间的合约。

技术问题

底层技术能够满足需要吗?可以进行扩展吗?等等

其它更多的问题

但是,我十分确信社区中的聪明人都在关注并解决这些问题。所以,也许问题只有一个:哪些引人注目的商业情景将率先采用智能合约?

如果你已经看到这里,理解我所说的,我力劝你研究萨博、Grigg和其他这个领域大神的著作,他们比我更好地解释了智能合约领域。

转载于:https://www.cnblogs.com/fangbei/p/smart-contracts-model.html


http://chatgpt.dhexx.cn/article/tXNujOUq.shtml

相关文章

HBase数据模型与整体架构

目录 1.HBase的特点 2.HBase数据模型 2.1.HBase逻辑架构 2.2.HBase物理存储 3.HBase整体架构 HBase原理深入: HBase原理深入_李嘉图呀李嘉图的博客-CSDN博客 HBase优化:https://blog.csdn.net/qq_42029989/article/details/126607734 1.HBase的特点 海量存储&…

数据结构与算法--图的深度优先搜索 (DFS)

深度优先搜索即是 从起点出发,从规定的方向中选择一个不断往前走,走到头为止,然后尝试另一种方向直到最后的终点。 DFS解决的是连通性问题,即从A是否能到达B。 采用DFS进行遍历的话,必须依赖栈,后进先出。 …

国际经济学——期末复习

这里写自定义目录标题 李嘉图模型相对价格与供给贸易所得相对工资多种、连续产品的拓展其他概念 专用要素模型孤立经济的情况在国际贸易中贸易模式影响 Heckscher-Ohlin模型要点表述 中略新贸易理论垄断竞争模型(1979)CES效用函数规模报酬递增由于不考所以只写重要结论和推导思…

经济学中的李嘉图模型

前言 因为模型里要用到很多数学推导,所以这篇文章用word写成。然后再截图发上来 原文楼主放在百度网盘里了,链接如下: https://pan.baidu.com/s/14sxnllQ44Wu88moH5_NzTw 定义 一个简单的基础模型 引入技术优势 一个极端的假设 悖论 贸易的…

java中Long型和long型的比较大小

一. Long数据的大小的比较 对于Long类型的数据&#xff0c;这个数据是一个对象&#xff0c;所以对象不可以直接通过“>”,“”&#xff0c;“<”的比较&#xff0c;如果要比较两个对象的是否相等的话&#xff0c;我们可以用Long对象的.equals&#xff08;&#xff09;方…

【Java】Long型与String型互转

String转Long Long.valueOf(str)Long.parseLong(str) Long转String String.valueOf(num)Long.toString(num) import java.util.Arrays; import java.util.List;public class Test {public static void main(String[] args) {String str "100";Long one Long.va…

Long型数据精度丢失问题

数据库中有一个bigint类型数据&#xff0c;对应java后台类型为Long型&#xff0c;在某个查询页面中碰到了问题&#xff1a;页面上显示的数据和数据库中的数据不一致。例如数据库中存储的是&#xff1a;1475797674679549851&#xff0c;显示出来却成了1475797674679550000&#…

vue前端处理后台返回的Long型数据精度丢失

vue前端处理后台返回的Long型数据精度丢失 问题描述 开发时后端返回的id为Long型&#xff0c;结果发现俩id怎么会一样呢&#xff1f;如下图是控制台Preview返回的数据 正以为是后端那边数据有误时&#xff0c;我点开Response发现这边的id是正常的… Preview和Response的数据…

C语言中的long型是究竟占4个字节还是8个字节?

今天在复习C语言的时候踩了一个很有意思的坑。 #include <stdio.h>int main() {printf("long int : %d\n", sizeof(long));return 0; }上面是我在IDE中使用的测试代码&#xff0c;执行它我的第一反应是会得到 4 的长度。 但实际的结果如下图所示&#xff1a;…

c java long_C语言中输出long long型数据怎么输出

展开全部 C语言中输出long long型数据使用%lld格式输出的方法: 1、32313133353236313431303231363533e59b9ee7ad9431333366303761 long long 是C99标准对整型类型做的扩展,每个long long类型的变量占8字节,64位。其表示范围为-9223372036854775808~9223372036854775807。 2、…

解决问题:long型数据精度丢失

在数据库中id设置为bigint且自增在java中对应long型数据 而在前台传输过程中键值过长导致精度丢失 原因是JS内置number类型的安全整数是53位&#xff0c;而Long为8个字节64位&#xff0c;会发生精度丢失 解决办法1&#xff1a; 点击设计表查看选项&#xff0c;发现自动递增数字…

浏览器接收Long型数据精度丢失问题的解决方案

问题描述 当我们后端返回前端Long类型的数据时&#xff0c;后三位会变成0&#xff0c;导致精度丢失。 有意思的地方是&#xff0c;postman测试接口时&#xff0c;查看返回值精度并未丢失&#xff0c;是字符串。 解决方案 在需要保留精度的属性上使用JsonSerialize(using To…

long型长整数字在前端页面显示异常及其解决方法

文章目录 1.引子2.解决问题&#xff08;1&#xff09;初试EL表达式取long型数值&#xff08;2&#xff09;再探EL表达式取字符串格式long型数值&#xff08;3&#xff09;最后一试---给EL表达式加引号 3.总结 1.引子 在做项目中&#xff0c;发现了一个诡异的事情&#xff0c;后…

long 型应该加上 l或者L

Long类型定义数字的L或LL后缀 如果数字后面不加L&#xff0c;默认的取值范围是int&#xff08;整型&#xff09; 比如&#xff1a; 给a赋值&#xff1a;long a&#xff1d;2147483648; &#xff08;数字超出int型取值范围&#xff09; 给a赋值&#xff1a;long a&#xff1…

JAVA生成20位LONG型UUID

编者在开发过程中用postman测试接口&#xff0c;发现要求id为必填且不能含有英文字母&#xff0c;问了对面开发人员才知道需要自己生成20位Long型uuid&#xff0c;写法大概如下&#xff0c;在需要生成的部分调用这个类即可。 package nc.bs.task.util;import java.text.Simple…

解决页面js接受Long型损失精度问题

目录 一、场景描述 二、问题分析 三、解决方法 一、场景描述 在下面这个后台管理中&#xff0c;当我们点击禁用后&#xff0c;会向服务器发送一个请求&#xff0c;同时携带这个员工的19位数字的id。 请求方式为PUT 这里的禁用对应employee表中的status字段&#xff0c;1为启…

java long格式化输出_C语言中输出long long型数据怎么输出?

展开全部 C语言中输出long long型数据使用%lld格式输出的e68a843231313335323631343130323136353331333365633838方法&#xff1a; 1、 long long 是C99标准对整型类型做的扩展&#xff0c;每个long long类型的变量占8字节&#xff0c;64位。其表示范围为-9223372036854775808~…

long型数字计算

在进行以亿为单位的数字计算时&#xff0c;int型往往会有溢出的问题&#xff0c;这时我们需要使用long型数字进行计算 public class demo04 {public static void main(String[] args) {//JDK7新特性&#xff0c;数字之间可以用下划线分割int money 10_0000_0000;int years 2…

随机游走模型(RandomWalk Mobility)

随机游走模型由首先由爱因斯坦在1926年以数学方式描述。由于自然界中的许多实体会以不可预知的方式移动&#xff0c;因此随机游走模型用来描述这种不稳定的移动。在这种移动模型中&#xff0c;移动节点随机选择一个方向和速度来从当前位置移动到新的位置。新的速度和方向分别从…