智能合约简介

在本文中,我们将了解什么是智能合约,它们是什么,我们将熟悉不同的智能合约平台及其功能,并讨论它们如何工作以及它们可以带来哪些优势。 对于不太熟悉智能合约主题但想要进一步了解它的读者来说,本材料将非常有用。

常规合同 vs 定期合同智能合约

在深入研究细节之前,我们先举一个例子,了解一下纸质合同和数字化智能合同之间的区别。

智能合约简介

在智能合约出现之前这是如何运作的? 想象一下,有一群人想要建立一定的价值分配规则和条件,以及一定的机制来保证这种分配按照给定的规则和条件实施。 然后他们会聚在一起,起草一份文件,在上面写下他们的身份详细信息、条款、所涉及的价值观、日期并签名。 该合同还得到了受信任方(例如公证人)的认证。 进一步地,这些人带着这样一份纸质合同走向了不同的方向,开始执行一些可能与合同本身不符的行为,即他们做了一件事,但在纸面上证明他们应该做某事完全不同。 以及如何摆脱这种局面? 事实上,团体成员之一需要拿着这张纸,拿出一些证据,告上法庭,实现合同与实际行动的相符。 很多时候,该合同很难得到公平的履行,从而导致不愉快的后果。

关于智能合约可以说些什么? 它们结合了编写合同条款的可能性和严格执行的机制。 如果条件已经设定并且相应的交易或请求已经签署,那么一旦该请求或交易被接受,就不再可能更改条件或影响其实施。

有一个验证器或整个网络,以及一个数据库,该数据库存储按严格时间顺序提交执行的所有智能合约。 同样重要的是,该数据库必须包含执行智能合约的所有触发条件。 此外,还必须考虑合同中描述的分配的价值本身。 如果这适用于某些数字货币,那么该数据库应该考虑到它。

换句话说,智能合约验证器必须能够访问智能合约运行的所有数据。 例如,应该使用单个数据库来同时记录数字货币、用户余额、用户交易和时间戳。 那么,在智能合约中,条件可能是用户某种货币的余额,某个时间的到来,或者某笔交易已经进行,仅此而已。

智能合约的定义

一般来说,该术语本身是由研究员 Nick Szabo 创造的,并于 1994 年首次使用,并于 1997 年在一篇描述智能合约概念的文章中记录下来。

智能合约意味着执行一些价值分配的自动化,这只能取决于提前预定的条件。 从最简单的形式来看,它看起来就像是由某些当事方签署的具有严格定义条款的合同。

智能合约旨在最大限度地减少对第三方的信任。 有时,一切所依赖的决策中心被完全排除在外。 此外,此类合同更容易审计。 这是此类系统的一些设计特征的结果,但大多数情况下,我们将智能合约理解为去中心化环境以及允许任何人分析数据库并对合约执行进行全面审计的功能。 这可以确保防止追溯数据更改,从而导致合同本身的履行发生变化。 创建和启动智能合约时大多数流程的数字化通常会简化其实施的技术和成本。

一个简单的例子 - 托管服务

让我们看一个非常简单的例子。 它将帮助您更深入地了解智能合约的功能,以及更好地了解应该在哪些情况下使用它们。

智能合约简介

它也可以使用比特币来实现,尽管目前比特币还很难被称为成熟的智能合约平台。 所以,我们有一些买家,我们有一个网上商店。 一位顾客想从这家商店购买一台显示器。 最简单的情况是,买家完成并发送付款,在线商店接受、确认,然后发货。 然而,在这种情况下,需要极大的信任 - 买家必须信任在线商店支付显示器的全部费用。 由于网上商店在买家眼中的声誉可能较低,因此存在由于某种原因,在接受付款后商店将拒绝服务并且不会将货物发送给买家的风险。 因此,买家会问这个问题(相应地,在线商店也会问这个问题)在这种情况下可以应用什么,以便最大限度地减少此类风险并使此类交易更加可靠。

就比特币而言,可以允许买方和卖方独立选择调解人。 有很多人参与解决有争议的问题。 我们的参与者可以从一份调解员总名单中选择他们信任的调解员。 他们一起创建了一个 2 of 3 多重签名地址,其中有三个密钥,并且需要任意两个密钥的两个签名才能从该地址花费硬币。 一把钥匙属于买家,第二把钥匙属于在线商店,第三把钥匙属于调解员。 买方将向这样的多重签名地址发送支付监视器所需的金额。 现在,当卖家看到资金在依赖于他的多重签名地址被冻结一段时间时,他可以安全地通过邮件发送监视器。

接下来,买家收到包裹,检查货物并做出最终购买决定。 他可能完全同意所提供的服务并用他的密钥签署交易,将硬币从多重签名地址转移给卖家,或者他可能对某些事情不满意。 在第二种情况下,他联系调解人来整理一项替代交易,以不​​同的方式分配这些代币。

假设显示器到达时有一点划痕,并且套件不包括用于连接计算机的电缆,尽管在线商店网站说套件中应包含电缆。 然后,买方收集必要的证据,向调解员证明他在这种情况下被欺骗了:他拍摄了网站的屏幕截图,拍摄了邮件收据的照片,拍摄了显示器上划痕的照片,并显示封条是断了,电缆被拔了出来。 反过来,在线商店收集证据并将其传输给调解员。

调解员有兴趣同时满足买家的愤慨和在线商店的利益(稍后会清楚原因)。 它构成了一项交易,其中来自多重签名地址的代币将按一定比例在买家、在线商店和调解人之间花费,因为他自己拿走一部分作为其工作的奖励。 假设总金额的 90% 归卖方,5% 归中介,5% 赔偿给买方。 中介者用他的密钥签署了这笔交易,但它还不能应用,因为它需要两个签名,但只有一个是值得的。 它将这样的交易发送给买方和卖方。 如果至少其中一个人对重新分配硬币的这一选项感到满意,那么交易将被预先签名并分配到网络。 为了验证这一点,交易双方之一同意调解人的选择就足够了。

最初选择一名调解员非常重要,这样双方参与者都信任他。 在这种情况下,他会独立于一方或另一方的利益而行动,并客观地评估局势。 如果调解者没有提供一种可以满足至少一个参与者的硬币分配选项,那么,在共同同意的情况下,买方和在线商店都可以通过放置两个签名将硬币发送到新的多重签名地址。 新的多重签名地址将由不同的调解人编译,他们可能在这方面更有能力并提供更好的选择。

以宿舍和冰箱为例

让我们看一个更复杂的示例,它更明确地显示智能合约的功能。

智能合约简介

假设有三个人最近搬进了同一个宿舍。 他们三人有兴趣为他们的房间购买一台可以一起使用的冰箱。 其中一人自愿筹集购买冰箱所需的金额并与卖家谈判。 但他们才刚刚认识不久,彼此之间还没有足够的信任。 显然,其中两个人给第三个钱是在冒险。 此外,他们需要在选择卖家方面达成一致。

他们可以使用托管服务,即选择一个调解人来监控交易的执行并解决出现争议的问题。 然后,在同意后,他们起草一份智能合约并在其中规定某些条件。

第一个条件是,在某个时间之前,比如一周内,对应的智能合约账户必须从特定地址收到三笔特定金额的付款。 如果这种情况没有发生,智能合约将停止执行并将代币返还给所有参与者。 如果满足条件,则设置卖方和调解员标识符的值,并检查所有参与者都同意卖方和调解员的选择的条件。 当满足所有条件时,资金将被转移到指定地址。 这种方法可以保护参与者免受任何方面的欺诈,并且通常消除信任的需要。

我们在这个例子中看到了一个原则,即这种逐步设置参数来满足每个条件的能力允许您创建任何复杂性和嵌套级别深度的系统。 另外,您可以先在智能合约中定义第一个条件,只有满足后才可以设置下一个条件的参数。 换句话说,条件是正式编写的,并且可以在其操作期间设置它的参数。

智能合约的分类

对于分类,您可以设置不同组的标准。 然而,就技术发展而言,其中四个是相关的。

智能合约可以根据其执行环境来区分,可以是集中式的,也可以是分散式的。 在去中心化的情况下,我们在执行智能合约时具有更大的独立性和容错能力。

它们还可以通过设置和满足条件的过程来区分:它们可以自由编程、限制或预定义,即严格类型化。 当智能合约平台上只有4个特定智能合约时,可以任意设置它们的参数。 因此,设置它们要简单得多:我们从列表中选择一个合约并传递参数。

从启动方式来看,有自动化智能合约,即当某些条件发生时,自动执行,也有合约中指定了条件,但平台不会自动检查其履行情况;为此,它们需要单独启动。

此外,智能合约的隐私级别也各不相同。 它们可以完全公开、部分或完全保密。 后者意味着第三方观察者看不到智能合约的条款。 然而,隐私主题非常广泛,最好将其与当前文章分开考虑。

下面我们将仔细研究前三个标准,以便更清楚地理解当前主题。

按运行时划分的智能合约

智能合约简介

根据执行环境,智能合约平台分为中心化和去中心化。 在集中式数字合约的情况下,使用单一服务,其中只有一个验证器,并且可能有备份和恢复服务,该服务也是集中管理的。 有一个数据库存储所有必要的信息来设置智能合约的条款并分配该服务数据库中考虑的价值。 这种集中式服务有一个客户,该客户根据某些请求设置条件并使用此类合同。 由于平台的中心化性质,身份验证机制可能不如加密货币安全。

我们可以以移动通信提供商(不同的移动运营商)为例。 假设某个运营商在其服务器上保存了集中的流量记录,这些流量可以以不同的格式传输,例如:以语音呼叫、短信传输、移动互联网流量的形式,并且根据不同的标准,也保存记录用户余额上的资金。 因此,移动通信提供商可以起草合同来对所提供的服务及其付款进行不同条件的核算。 在这种情况下,很容易设置“向某某号码发送带有某某代码的短信,您将收到某某流量分配条件”之类的条件。

再举一个例子:传统银行具有网上银行的扩展功能,合同非常简单,例如定期付款、收款自动转换、指定账户自动扣息等。

如果我们谈论的是具有去中心化执行环境的智能合约,那么我们就有一组验证器。 理想情况下,任何人都可以成为验证者。 由于数据库同步协议和达成共识,我们拥有一些通用数据库,现在将存储具有严格描述的合约的所有交易,而不是一些条件查询,其格式经常变化,并且没有开放规范。 在这里,交易将包含根据严格规范执行合约的指令。 该规范是开放的,因此平台用户自己可以审核和验证智能合约。 在这里我们看到,去中心化平台在独立性和容错性方面优于中心化平台,但其设计和维护要复杂得多。

通过设置和满足条件的方法的智能合约

现在让我们仔细看看智能合约在设置和满足条件的方式上有何不同。 在这里,我们将注意力转向可随机编程且图灵完备的智能合约。 图灵完备的智能合约允许您设置几乎任何算法作为合约执行的条件:写入周期、一些计算概率的函数等等 - 甚至是您自己的电子签名算法。 在这种情况下,我们指的是真正任意的逻辑书写。

也有任意的智能合约,但不是图灵完备的。 这包括带有自己脚本的比特币和莱特币。 这意味着您只能以任何顺序使用某些操作,但您不能再编写循环和自己的算法。

此外,还有实现预定义智能合约的智能合约平台。 其中包括比特股和 Steemit。 Bitshares 拥有一系列用于交易、账户管理、平台本身及其参数管理的智能合约。 Steemit 是一个类似的平台,但它不再像 Bitshares 那样专注于发行代币和交易,而是专注于博客,即以去中心化的方式存储和处理内容。

任意图灵完备合约包括以太坊平台和仍在开发中的RootStock。 因此,下面我们将详细介绍以太坊智能合约平台。

按启动方式划分的智能合约

根据启动方式,智能合约也可以分为至少两类:自动和手动(非自动化)。 自动化的特点是,在给定所有已知参数和条件的情况下,智能合约完全自动执行,也就是说,它不需要发送任何额外的交易,也不需要在每次后续执行时花费额外的佣金。 平台本身拥有计算智能合约如何完成的所有数据。 那里的逻辑不是任意的,而是预先确定的,所有这一切都是可以预测的。 也就是说,您可以提前估计执行智能合约的复杂性,为其使用某种恒定的佣金,并且其实施的所有流程都更加高效。

对于自由编程的智能合约,执行不是自动化的。 要启动这样的智能合约,几乎每一步都需要创建一个新交易,该交易将调用下一个执行阶段或下一个智能合约方法,支付适当的佣金并等待交易被确认。 执行可能成功也可能失败,因为智能合约代码是任意的,可能会出现一些不可预测的时刻,例如无限循环、缺少某些参数和参数、未处理的异常等。

以太坊账户

以太坊账户类型

让我们看看以太坊平台上可以有哪些类型的账户。 这里只有两种类型的帐户,没有其他选项。 第一种称为用户帐户,第二种称为合约帐户。 让我们弄清楚它们有何不同。

用户账户仅由电子签名的个人密钥控制。 帐户所有者使用 ECDSA(椭圆曲线数字签名算法)算法生成自己的电子签名密钥对。 只有使用此密钥签名的交易才能更改此帐户的状态。

为智能合约账户提供了单独的逻辑。 它只能由预定义的软件代码控制,该代码完全决定智能合约的行为:在某些情况下如何管理其代币,在哪个用户的倡议下以及在什么附加条件下将分发这些代币。 如果开发人员在程序代码中没有提供某些要点,则可能会出现问题。 例如,智能合约可能会收到某种状态,在该状态下,它不接受任何用户发起进一步执行。 在这种情况下,硬币实际上会被冻结,因为智能合约没有规定退出这种状态。

如何在以太坊上创建帐户

对于用户帐户,所有者使用 ECDSA 独立生成密钥对。 需要注意的是,以太坊使用与比特币完全相同的算法和完全相同的椭圆曲线进行电子签名,但地址的计算方式略有不同。 这里不再像比特币那样使用双重哈希的结果,而是通过 Keccak 函数提供长度为 256 位的单次哈希。 从结果值中截掉最低有效位,即输出哈希值的最低有效 160 位。 结果,我们得到了以太坊的一个地址。 事实上,它占用了20个字节。

请注意,以太坊中的账户标识符以十六进制编码,不应用校验和,这与比特币和许多其他系统不同,在比特币和许多其他系统中,地址以 58 基数系统编码,并添加了校验和。 这意味着在以太坊中使用帐户标识符时需要小心:即使标识符中的一个错误也肯定会导致代币丢失。

有一个重要的功能,那就是当他接受第一笔收款时,就会创建一个通用数据库级别的用户帐户。

创建智能合约帐户采用完全不同的方法。 最初,其中一个用户编写智能合约的源代码,然后代码通过以太坊平台专用的编译器,获得自己的以太坊虚拟机的字节码。 生成的字节码被放置在交易的一个特殊字段中。 它代表发起者的帐户进行认证。 接下来,该交易在整个网络中传播并放置智能合约代码。 交易的佣金以及相应的合同执行的佣金将从发起人的账户余额中扣除。

每个智能合约都必须包含其自己的构造函数(该合约的构造函数)。 它可能是空的,也可能有内容。 构造函数执行后,会创建一个智能合约账户标识符,使用它可以发送币、调用某些智能合约方法等。

以太坊交易结构

为了更清楚地说明这一点,我们将开始研究以太坊交易的结构和示例智能合约代码。

智能合约简介

以太坊交易由多个字段组成。 其中第一个随机数是交易的特定序列号,相对于分配该交易的帐户本身并且是其作者。 为了区分双重交易,即排除同一交易被接受两次的情况,这是必要的。 通过使用标识符,每笔交易都有一个唯一的哈希值。

接下来是一个像这样的字段 汽油价格。 这表示以太坊基础货币转换为gas的价格,用于支付智能合约的执行和虚拟机资源的分配。 这是什么意思?

在比特币中,费用直接由基础货币——比特币本身支付。 这要归功于一种简单的计算机制:我们严格按照交易中包含的数据量付费。 在以太坊中情况更加复杂,因为很难依赖交易数据量。 这里,事务还可以包含将在虚拟机上执行的程序代码,并且虚拟机的每个操作可以具有不同的复杂度。 还有一些为变量分配内存的操作。 它们有自己的复杂性,每项操作的费用取决于其复杂性。

每次操作的天然气当量成本将保持不变。 专门引入它是为了确定每个操作的恒定成本。 根据网络的负载情况,Gas价格会发生变化,即基础货币转换为该辅助单位以支付佣金的系数。

以太坊中的交易还有一个特点:它包含的用于在虚拟机中执行的字节码将被执行,直到它完成并产生某种结果(成功或失败),或者直到分配的一定数量的硬币用完以支付佣金。 为了避免出现某些错误时,发送者帐户中的所有硬币都被花在佣金上的情况(例如,在虚拟机中启动某种永恒循环),存在以下字段 - 启动气体 (通常称为gas limit) - 它决定了发送者愿意花费来完成某笔交易的最大代币数量。

下一个字段称为 目的地址。 这包括代币接收者的地址或将调用其方法的特定智能合约的地址。 之后就是田野 折扣值,其中输入发送到目标地址的硬币数量。

接下来是一个有趣的领域,称为 data,整个结构适合的地方。 这不是一个单独的字段,而是一个定义虚拟机代码的整体结构。 您可以在此处放置任意数据 - 对此有单独的规则。

最后一个字段称为 签名。 它同时包含该交易作者的电子签名和用于验证该签名的公钥。 从公钥中您可以获取该交易发送方的账户标识符,即在系统本身中唯一标识发送方的账户。 我们找到了交易结构的主要内容。

Solidity 的智能合约代码示例

现在让我们用一个例子来仔细看看最简单的智能合约。

contract Bank {
    address owner;
    mapping(address => uint) balances;
    
    function Bank() {
        owner = msg.sender;
    }

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw(uint amount) public {
        if (balances[msg.sender] >= amount) {
            balances[msg.sender] -= amount;
            msg.sender.transfer(amount);
        }
    }

    function getMyBalance() public view returns(uint) {
        return balances[msg.sender];
    }

    function kill() public {
        if (msg.sender == owner)
            selfdestruct(owner);
    }
}

上面是一个简化的源代码,可以保存用户的币并按需归还。

因此,有一个银行智能合约执行以下功能:它在其余额上积累代币,也就是说,当交易被确认并放置这样的智能合约时,会创建一个新帐户,其余额中可以包含代币; 它记住用户以及他们之间的硬币分配; 有多种余额管理方式,可以充值、提现、查看用户余额。

让我们浏览一下源代码的每一行。 该合约具有恒定字段。 其中之一,类型为地址,称为所有者。 这里合约会记住创建此智能合约的用户的地址。 此外,还有一个动态结构来维护用户地址和余额之间的对应关系。

接下来是 Bank 方法 - 它与合约同名。 因此,这是它的构造函数。 这里的所有者变量被分配了将该智能合约放置在网络上的人的地址。 这是此构造函数中发生的唯一事情。 也就是说,本例中的 msg 正是与包含该合约完整代码的交易一起传输到虚拟机的数据。 因此,msg.sender 是托管此代码的交易的作者。 他将成为智能合约的所有者。

充值方式允许您通过交易将一定数量的币转入合约账户。 在这种情况下,接收这些代币的智能合约将它们保留在其资产负债表上,但在余额结构中记录了这些代币的确切发送者,以便知道它们属于谁。

下一个方法称为提款,它有一个参数 - 有人想要从这家银行提取的硬币数量。 这会检查调用此方法发送硬币的用户的余额中是否有足够的硬币。 如果有足够的硬币,那么智能合约本身会将该数量的硬币返回给调用者。

接下来是查看用户当前余额的方法。 无论谁调用此方法,都将用于检索智能合约中的此余额。 值得注意的是,这个方法的修饰符是view。 这意味着该方法本身不会以任何方式更改其类的变量,它实际上只是一个读取方法。 无需创建单独的交易来调用此方法,无需支付任何费用,并且所有计算均在本地执行,之后用户会收到结果。

需要kill方法来销毁智能合约的状态。 这里还额外检查了该方法的调用者是否是该合约的所有者。 如果是这样,那么合约就会自毁,并且销毁函数采用一个参数 - 合约将把其余额中剩余的所有代币发送到的帐户标识符。 在这种情况下,剩余的硬币将自动转到合约所有者的地址。

以太坊网络上的全节点如何工作?

让我们示意性地看一下这样的智能合约如何在以太坊平台上执行以及完整的网络节点如何工作。

智能合约简介

以太坊网络上的完整节点必须至少有四个模块。
对于任何去中心化协议来说,第一个是 P2P 网络模块 - 用于网络连接并与其他节点一起工作的模块,其中交换块、交易和有关其他节点的信息。 这是所有去中心化加密货币的传统组件。

接下来,我们有一个用于存储区块链数据、处理、选择优先级分支、附加块、取消链接块、验证这些块等的模块。

第三个模块称为 EVM(以太坊虚拟机)——这是一个从以太坊交易接收字节码的虚拟机。 该模块获取特定帐户的当前状态,并根据接收到的字节码更改其状态。 每个网络节点上的虚拟机版本必须相同。 每个以太坊节点上发生的计算完全相同,但它们以异步方式发生:有人先检查并接受该交易,即执行其中包含的所有代码,然后有人执行。 相应地,当一笔交易被创建时,它被分发到网络,节点接受它,并在验证时,与比特币中执行Bitcoin Script的方式相同,这里执行虚拟机的字节码。

如果一笔交易中包含的所有代码都已被执行,并且已生成并保存某个帐户的新状态,直到明确该交易是否已被应用,则该交易被视为已验证。 如果应用了事务,则该状态不仅被视为已完成,而且被视为当前状态。 有一个数据库存储每个网络节点的每个帐户的状态。 由于所有计算都以相同的方式发生并且区块链的状态相同,因此每个节点包含所有账户状态的数据库也将是相同的。

智能合约的神话和局限性

至于类似以太坊的智能合约平台存在的限制,可以列举如下:

  • 代码执行;
  • 分配内存;
  • 区块链数据;
  • 发送付款;
  • 创建新合同;
  • 调用其他合约。

让我们看看对虚拟机施加的限制,并相应地消除有关智能合约的一些误解。 在虚拟机上,不仅可以在以太坊上,而且可以在类似的平台上,您可以执行真正任意的逻辑操作,即编写代码,它将在那里执行,您可以另外分配内存。 但是,费用是为每个操作和分配的每个附加内存单元单独支付的。

接下来,虚拟机可以从区块链数据库中读取数据,以便使用该数据作为触发器来执行一个或另一个智能合约逻辑。 虚拟机可以创建和发送交易,它可以创建新合约并调用网络上已发布的其他智能合约的方法:现有的、可用的等。

最常见的误解是,以太坊智能合约可以使用来自任何互联网资源的信息。 事实是,虚拟机无法向互联网上的某些外部信息资源发送网络请求,也就是说,不可能编写一个智能合约来根据外部天气等因素在用户之间分配价值,或者谁赢得了一些冠军,或者根据外界发生的其他事件,因为有关这些事件的信息根本不存在于平台本身的数据库中。 也就是说,区块链上没有任何关于此的信息。 如果它没有出现在那里,则虚拟机无法使用该数据作为触发器。

以太坊的缺点

让我们列出主要的。 第一个缺点是以太坊中的智能合约的设计、开发和测试存在一些困难(以太坊使用Solidity语言编写智能合约)。 事实上,实践表明,所有错误中很大一部分都属于人为因素。 对于已经编写的具有平均或更高复杂性的以太坊智能合约来说,这实际上是正确的。 如果说简单的智能合约出错的概率很小,那么复杂的智能合约中经常会出现错误,导致资金被盗、冻结、智能合约被意外破坏等。这样的案例已经很多了。已知。

第二个缺点是虚拟机本身并不完美,因为它也是人编写的。 它可以执行任意命令,这其中存在漏洞:可以以某种方式配置多个命令,从而导致事先无法预见的后果。 这是一个非常复杂的领域,但已经有几项研究表明,当前版本的以太坊网络中存在这些漏洞,它们可能导致许多智能合约的失败。

又一个很大的困难,也算是一个劣势。 它在于,你可以从实践或技术上得出这样的结论:如果你编译了将在虚拟机上执行的合约的字节码,你可以确定一些特定的操作顺序。 当一起执行时,这些操作将极大地增加虚拟机的负载,并且与执行这些操作所支付的费用不成比例地减慢虚拟机的速度。

过去,以太坊的发展已经有一段时间,很多详细了解虚拟机操作的家伙都发现了这样的漏洞。 事实上,交易只需支付很少的费用,但实际上会减慢整个网络的速度。 这些问题很难解决,因为首先需要确定它们,其次需要调整执行这些操作的价格,第三需要进行硬分叉,这意味着将所有网络节点更新为新版本软件,然后同时激活这些更改。

至于以太坊,已经进行了大量的研究,获得了很多实践经验:积极的和消极的,但仍然存在需要以某种方式处理的困难和漏洞。

至此,文章的主题部分已经完成,让我们继续讨论经常出现的问题。

Частозадаваемыевопросы

— 如果现有智能合约的所有各方都想要更改条款,他们可以使用多重签名取消该智能合约,然后创建一个具有更新执行条款的新智能合约吗?

这里的答案是双重的。 为什么? 因为一方面,智能合约被定义一次,不再意味着任何更改,另一方面,它可以具有预先编写的逻辑,提供某些条件的完全或部分更改。 也就是说,如果您想更改智能合约中的某些内容,那么您必须规定可以更新这些条件的条件。 因此,只有以这种审慎的方式,才能组织续签合同。 但在这里,您也可能会遇到麻烦:犯一些错误并获得相应的漏洞。 因此,这样的东西需要非常详细、仔细地设计和测试。

— 如果调解员与参与方之一达成协议:托管或智能合约怎么办? 智能合约中是否需要中介者?

智能合约不需要调解人。 它可能不存在。 如果在托管的情况下,调解员与其中一方合谋,那么是的,该计划将急剧失去其所有价值。 因此,调解员的选择方式应使参与该过程的所有各方同时信任他们。 因此,您根本不会将代币转移到您不信任的中介的多重签名地址。

— 是否可以通过一笔以太坊交易将许多不同的代币从您的地址转移到不同的目标地址,例如交易这些代币的交易所地址?

这是一个很好的问题,它涉及以太坊交易模型以及它与比特币模型的不同之处。 差异是根本性的。 如果在以太坊交易模型中,您只是转移硬币,那么它们只是从一个地址转移到另一个地址,没有任何变化,只是您指定的具体金额。 换句话说,这不是未花费输出(UTXO)的模型,而是账户和相应余额的模型。 理论上,如果您编写一个巧妙的智能合约,可以在一笔交易中一次发送多个不同的代币,但您仍然需要进行许多交易,创建一个合约,然后将代币和硬币转移给它,然后调用适当的方法。 这需要精力和时间,所以在实践中它并不是这样工作的,以太坊中的所有支付都是在单独的交易中进行的。

— 关于以太坊平台的神话之一是,不可能描述依赖于外部互联网资源数据的条件,那么该怎么办呢?

解决方案是,智能合约本身可以提供一个或多个所谓的可信预言机,这些预言机收集有关外界事物状态的数据,并通过特殊方法将其传输给智能合约。 合约本身认为从受信任方收到的数据是真实的。 为了获得更高的可靠性,只需选择一大群预言机并将其串通的风险降至最低即可。 合约本身可能不会考虑来自预言机的与大多数人相矛盾的数据。

区块链在线课程的其中一个讲座专门讨论了这个主题——“智能合约简介“。

来源: habr.com

添加评论