1648385340
在这篇文章中,您将了解区块链生态系统中智能合约的生命周期
智能合约本质上是在满足特定标准时运行并在区块链上维护的程序。
智能合约通常用于自动执行协议,以便各方可以立即确定决策,而无需中介或浪费时间。他们还可以自动化工作流程,从满足某些情况开始。
简单的“if/when...then...”行被写入区块链上的代码以使智能合约工作。当预设情况得到满足和验证时,活动由计算机网络执行。
这些活动可能包括将付款转移给适当的各方、发送警报、登记车辆或开出罚单。当交易完成时,区块链被更新。这意味着无法修改事务,并且结果仅对已获得访问权限的人可见。
以太坊 ( ETH ) 是用于运行自动协议的最广泛使用的智能合约区块链。以太坊上的智能合约通常用图灵完备的编程语言 Solidity 编写,然后编译成以太坊虚拟机可以执行的低级字节码。
Polkadot 是由以太坊的联合创始人之一 Gavin Wood 建立的另一个智能合约生态系统。在了解 ETH 距离发挥其作为安全和可扩展系统的潜力还有很长的路要走后,他选择启动他的区块链网络。
交易、投资、借贷等金融应用就是智能合约用例的例子。它们可用于各种行业,包括医疗保健、游戏和房地产,以及构建整个公司结构。
分布式账本和加密货币是作为分散式智能合约基础的两种技术。
首先,包含的数据,即交易必须被安全存储以形成数字分类账。这意味着必须保留交易的整体排名和内容。单个交易被捆绑到区块链中的块中,然后按顺序持续存在。
在比特币 (BTC) 等数字平台上开发和交易的虚拟货币被欧洲中央银行描述为“不受监管、去中心化的数字加密货币”。在 1990 年代,已经有建立数字货币的倡议。然而,这些尝试需要使用银行(分类账保管人)来跟踪资金的所有权账户。
今天,区块链提供了一种技术解决方案,用于在对等网络中传播该分类账或交易日志,同时保持交易日志的完整性。由于这一突破,不受监管的加密货币市场现在成为可能。
智能合约的形成、智能合约的冻结、智能合约的执行和智能合约的最终确定是智能合约生命周期的四个重要步骤。它与区块链开发生命周期不同,后者从定义您希望使用区块链产品解决的问题开始,并以最小可行产品结束。
迭代合同协商和实施阶段组成了创建阶段。首先,双方必须就合同的总体内容和目标达成一致。这类似于传统的合同谈判,可以在线或离线进行。在底层账本平台上,所有参与者都必须有一个钱包。其标识符在大多数情况下是匿名的,用于识别当事人和转移支付。
在目标和内容达成一致后,必须将合同转换为代码。底层智能合约编码语言的表达性限制了合约的编码。大多数智能合约系统提供了构建、维护和测试智能合约以验证其执行行为和内容的基础设施。
正如在传统编程语言中看到的那样,将需求转换为代码需要利益相关者和程序员之间的多次迭代。智能合约也不例外,谈判和实施阶段之间可能会进行多次迭代。
在发布阶段,当各方就合同的编码形式达成一致后,将其上传到分布式账本中。在此阶段,分布式账本中的节点将合约作为交易块的一部分接收。一旦大多数节点确认了区块,该合约就可以执行。由于去中心化智能合约一旦被区块链接受就无法修改,因此对智能合约的任何更改都需要开发新的合约。
虽然智能合约被放置在区块链上,但这一事实本身不应被解释为一方同意签订合约,因为任何人都可以向区块链提交智能合约,这意味着任何随机钱包所有者的义务。同样,去中心化智能合约可以使任何区块链参与者受益,无论他们是否选择提前获得收益。
在提交给区块链之后,智能合约得到大多数参与节点的确认。必须向矿工支付价格以换取这项服务,以防止生态系统被智能合约淹没。
合约及其各方现在向公众开放,并可通过公共分类账获得。在冻结阶段,任何向智能合约钱包地址的转账都被阻止,节点作为治理委员会运行,验证合约执行的先决条件是否得到满足。
参与节点读取存储在分布式账本上的合约。那么,智能合约是如何执行的呢?合约的完整性得到验证,代码由智能合约环境的推理引擎(编译器、解释器)执行。智能合约的功能是在从智能预言机和相关方(通过硬币承诺商品)收到执行输入时执行的。
智能合约的执行会为智能合约生成一组新的交易和新的状态。将结果集和新状态信息输入分布式账本并使用共识机制进行验证。
生成的交易和更新的状态信息被放入分布式账本中,并在智能合约执行后使用共识过程进行确认。之前承诺的数字资产被转移(资产解冻),合约完成确认所有交易。
智能合约生命周期的每个阶段都承诺降低成本、提高透明度和建立信心,但它也带来了新的障碍、成本和法律不兼容性。
由于去中心化智能合约的形成分为两个阶段,传统条款谈判阶段和代码实施阶段,因此必须根据智能合约程序员的费用来评估减少律师所节省的费用。
由于合约执行和支付最终确定之间的加密安全链接,去中心化执行基础设施和参与参与者扮演了合约执行者的角色。这种内置的冲突解决流程提高了所有相关方的公开性和公平性。
另一方面,已缔结的智能合约的不可逆性质引发了有关补救的额外问题,因为由此产生的交易集合在定义上是不可变的和不可撤销的。
虽然智能合约生命的几个方面目前需要专门的技术知识(例如编写智能合约),但在成本节约承诺的推动下,去中心化智能合约的预期广泛采用无疑将降低现有的进入壁垒并导致开发用户友好的智能合约创建、测试和共享环境。
阅读更多:什么是加密中的智能合约审计?
是的,可以使用 selfdestruct 函数销毁智能合约。
以太坊智能合约提供自毁功能,允许他们销毁区块链系统上的合约。然而,对于开发人员来说,它是一把双刃剑。一方面,自毁功能允许开发人员从以太坊中删除智能合约并在发生紧急情况(例如攻击)时转移以太币。另一方面,此功能可能会增加开发的复杂性并为攻击者提供攻击渠道。
当发现安全漏洞或必须升级智能合约的功能时,开发人员会终止合约。他们将在解决错误或升级当前版本后启动新版本的合约。
攻击者于 2016 年在去中心化自治组织 (DAO) 的智能合约中发现了一个名为 Reentrancy 的漏洞,该漏洞导致 DAO 组织损失了 360 万以太币(2020 年 2 月为 270 美元/以太币)。这种臭名昭著的攻击有时被称为 DAO 攻击。
DAO 黑客攻击持续了几天,该组织当时并不知道他们的合同已被泄露。由于智能合约的不变性,他们无法阻止攻击或移动以太币。如果合约具有自毁功能,DAO 组织可以快速转移所有 Ether,避免经济损失。
感谢您的阅读!
1648385340
在这篇文章中,您将了解区块链生态系统中智能合约的生命周期
智能合约本质上是在满足特定标准时运行并在区块链上维护的程序。
智能合约通常用于自动执行协议,以便各方可以立即确定决策,而无需中介或浪费时间。他们还可以自动化工作流程,从满足某些情况开始。
简单的“if/when...then...”行被写入区块链上的代码以使智能合约工作。当预设情况得到满足和验证时,活动由计算机网络执行。
这些活动可能包括将付款转移给适当的各方、发送警报、登记车辆或开出罚单。当交易完成时,区块链被更新。这意味着无法修改事务,并且结果仅对已获得访问权限的人可见。
以太坊 ( ETH ) 是用于运行自动协议的最广泛使用的智能合约区块链。以太坊上的智能合约通常用图灵完备的编程语言 Solidity 编写,然后编译成以太坊虚拟机可以执行的低级字节码。
Polkadot 是由以太坊的联合创始人之一 Gavin Wood 建立的另一个智能合约生态系统。在了解 ETH 距离发挥其作为安全和可扩展系统的潜力还有很长的路要走后,他选择启动他的区块链网络。
交易、投资、借贷等金融应用就是智能合约用例的例子。它们可用于各种行业,包括医疗保健、游戏和房地产,以及构建整个公司结构。
分布式账本和加密货币是作为分散式智能合约基础的两种技术。
首先,包含的数据,即交易必须被安全存储以形成数字分类账。这意味着必须保留交易的整体排名和内容。单个交易被捆绑到区块链中的块中,然后按顺序持续存在。
在比特币 (BTC) 等数字平台上开发和交易的虚拟货币被欧洲中央银行描述为“不受监管、去中心化的数字加密货币”。在 1990 年代,已经有建立数字货币的倡议。然而,这些尝试需要使用银行(分类账保管人)来跟踪资金的所有权账户。
今天,区块链提供了一种技术解决方案,用于在对等网络中传播该分类账或交易日志,同时保持交易日志的完整性。由于这一突破,不受监管的加密货币市场现在成为可能。
智能合约的形成、智能合约的冻结、智能合约的执行和智能合约的最终确定是智能合约生命周期的四个重要步骤。它与区块链开发生命周期不同,后者从定义您希望使用区块链产品解决的问题开始,并以最小可行产品结束。
迭代合同协商和实施阶段组成了创建阶段。首先,双方必须就合同的总体内容和目标达成一致。这类似于传统的合同谈判,可以在线或离线进行。在底层账本平台上,所有参与者都必须有一个钱包。其标识符在大多数情况下是匿名的,用于识别当事人和转移支付。
在目标和内容达成一致后,必须将合同转换为代码。底层智能合约编码语言的表达性限制了合约的编码。大多数智能合约系统提供了构建、维护和测试智能合约以验证其执行行为和内容的基础设施。
正如在传统编程语言中看到的那样,将需求转换为代码需要利益相关者和程序员之间的多次迭代。智能合约也不例外,谈判和实施阶段之间可能会进行多次迭代。
在发布阶段,当各方就合同的编码形式达成一致后,将其上传到分布式账本中。在此阶段,分布式账本中的节点将合约作为交易块的一部分接收。一旦大多数节点确认了区块,该合约就可以执行。由于去中心化智能合约一旦被区块链接受就无法修改,因此对智能合约的任何更改都需要开发新的合约。
虽然智能合约被放置在区块链上,但这一事实本身不应被解释为一方同意签订合约,因为任何人都可以向区块链提交智能合约,这意味着任何随机钱包所有者的义务。同样,去中心化智能合约可以使任何区块链参与者受益,无论他们是否选择提前获得收益。
在提交给区块链之后,智能合约得到大多数参与节点的确认。必须向矿工支付价格以换取这项服务,以防止生态系统被智能合约淹没。
合约及其各方现在向公众开放,并可通过公共分类账获得。在冻结阶段,任何向智能合约钱包地址的转账都被阻止,节点作为治理委员会运行,验证合约执行的先决条件是否得到满足。
参与节点读取存储在分布式账本上的合约。那么,智能合约是如何执行的呢?合约的完整性得到验证,代码由智能合约环境的推理引擎(编译器、解释器)执行。智能合约的功能是在从智能预言机和相关方(通过硬币承诺商品)收到执行输入时执行的。
智能合约的执行会为智能合约生成一组新的交易和新的状态。将结果集和新状态信息输入分布式账本并使用共识机制进行验证。
生成的交易和更新的状态信息被放入分布式账本中,并在智能合约执行后使用共识过程进行确认。之前承诺的数字资产被转移(资产解冻),合约完成确认所有交易。
智能合约生命周期的每个阶段都承诺降低成本、提高透明度和建立信心,但它也带来了新的障碍、成本和法律不兼容性。
由于去中心化智能合约的形成分为两个阶段,传统条款谈判阶段和代码实施阶段,因此必须根据智能合约程序员的费用来评估减少律师所节省的费用。
由于合约执行和支付最终确定之间的加密安全链接,去中心化执行基础设施和参与参与者扮演了合约执行者的角色。这种内置的冲突解决流程提高了所有相关方的公开性和公平性。
另一方面,已缔结的智能合约的不可逆性质引发了有关补救的额外问题,因为由此产生的交易集合在定义上是不可变的和不可撤销的。
虽然智能合约生命的几个方面目前需要专门的技术知识(例如编写智能合约),但在成本节约承诺的推动下,去中心化智能合约的预期广泛采用无疑将降低现有的进入壁垒并导致开发用户友好的智能合约创建、测试和共享环境。
阅读更多:什么是加密中的智能合约审计?
是的,可以使用 selfdestruct 函数销毁智能合约。
以太坊智能合约提供自毁功能,允许他们销毁区块链系统上的合约。然而,对于开发人员来说,它是一把双刃剑。一方面,自毁功能允许开发人员从以太坊中删除智能合约并在发生紧急情况(例如攻击)时转移以太币。另一方面,此功能可能会增加开发的复杂性并为攻击者提供攻击渠道。
当发现安全漏洞或必须升级智能合约的功能时,开发人员会终止合约。他们将在解决错误或升级当前版本后启动新版本的合约。
攻击者于 2016 年在去中心化自治组织 (DAO) 的智能合约中发现了一个名为 Reentrancy 的漏洞,该漏洞导致 DAO 组织损失了 360 万以太币(2020 年 2 月为 270 美元/以太币)。这种臭名昭著的攻击有时被称为 DAO 攻击。
DAO 黑客攻击持续了几天,该组织当时并不知道他们的合同已被泄露。由于智能合约的不变性,他们无法阻止攻击或移动以太币。如果合约具有自毁功能,DAO 组织可以快速转移所有 Ether,避免经济损失。
感谢您的阅读!
1660644302
Tezos 是最古老的智能合约区块链之一,以太坊是第一个。
虽然以太坊是开发人员开发和部署智能合约的热门选择,但由于费用高且交易缓慢,其应用程序的可扩展性并不高。相比之下,Tezos 应用程序的设置非常高效且成本低廉。
在本指南中,您将学习如何使用 SmartPy CLI 在 Tezos 中开发和部署智能合约。
您可以在此 GitHub 存储库中获取最终项目的代码。
要阅读本文,您需要熟悉 Tezos 区块链。你的知识不必很深入。
不需要了解以太坊区块链,但它有很大帮助。
Tezos 是一个区块链网络和智能合约平台,通过其治理模型和自我升级能力构建为自适应的。
虽然 Tezos 和 Ethereum 是支持智能合约和 DApp 开发的类似区块链,但它们在几个方面有所不同。下面的 Tezos 与 Ethereum 表显示了两个网络之间的一些差异。
特所思 | 以太坊 |
开发者提议升级网络上的区块链协议 | 开发者使用硬分叉升级区块链协议 |
利益相关者通过投票接受或拒绝提案来控制区块链协议的升级 | 区块链网络的创建者管理区块链协议的升级 |
使用形式验证来执行智能合约 | 使用 EVM 在网络上存储和执行智能合约 |
参与者(节点)可以选择提供计算资源或委托他们的代币参与验证交易 | 所有参与者(节点)必须提供计算资源并质押他们的硬币以参与验证交易 |
汽油费很低,这使得它非常可扩展 | 汽油费真的很高,这使得它无法扩展 |
SmartPy 是一种工具,可让您在 Tezos 区块链上轻松构建智能合约。
您使用 Python 在 SmartPy 中编写合约。如果您已经熟悉 Python,则无需学习新的智能合约编程语言。
SmartPy 有两个使用其他语法的变体:SmartTS,使用 TypeScript,SmartML,使用 OCaml。
SmartPy 将 Python 脚本编译为 Michelson。Michelson 是 Tezos 中用于智能合约的低级编程语言。SmartTS 和 SmartML 也可以使用 SmartPy 工具进行编译。
智能合约是您可以在区块链网络上构建、部署和执行的程序。在部署智能合约之前,您无需在网络上拥有节点。
借助智能合约,您可以构建可供所有设备访问的应用程序,而无需拥有或维护服务器。这些完全分散的应用程序需要很少或不需要维护。
智能合约利用区块链的全部潜力,允许您在链上执行程序以及与链本身进行交互。您可以持有或转移代币,并通过智能合约访问区块链上的特殊功能。
要安装 SmartPy CLI,请运行以下命令:
$ bash <(curl -s https://smartpy.io/cli/install.sh)
此命令使用此树结构在其中创建一个smartpy-cli
目录:home
smartpy-cli
├── browser.py
├── node_modules/
├── originator.js
├── package.json
├── package-lock.json
├── __pycache__/
├── smart.css
├── smart.js
├── smartpyc.js
├── smartpyc.py
├── smartpyio.py
├── smartpy.py
├── SmartPy.sh
├── smarttop/
├── smart-ts-cli.js
├── templates/
├── theme.js
└── typography.css
要确认安装,请运行以下命令:
$ ~/smartpy-cli/SmartPy.sh --version
作为易于访问的额外步骤SmartPy.sh
,通过将以下内容复制到您的.bashrc
文件或相关配置文件中来创建别名:
$ alias smartpy="$HOME/smartpy-cli/SmartPy.sh"
现在您可以使用:
$ smartpy --version
代替:
$ ~/smartpy-cli/SmartPy.sh --version
tezos-client
本指南用于tezos-client
与已部署的智能合约进行交互。要安装tezos-client,
运行以下命令之一,具体取决于您使用的是 Mac 还是 Linux 操作系统:
# Mac
$ brew tap serokell/tezos-packaging-stable https://github.com/serokell/tezos-packaging-stable.git
$ brew install tezos-client
# Linux
$ wget https://github.com/serokell/tezos-packaging/releases/latest/download/tezos-client
$ chmod +x tezos-client
$ mkdir -p $HOME/.local/bin
$ mv tezos-client $HOME/.local/bin
$ echo 'export PATH="$HOME/.local/bin:$PATH"' >> $HOME/.bashrc
$ source $HOME/.bashrc
请注意,如果您使用的是 Windows,则需要使用 wsl 安装 Linux 发行版并运行 Linux 安装。
安装后tezos-client
,您需要进行设置。首先运行以下命令:
$ tezos-client --endpoint https://jakartanet.ecadinfra.com config update
本指南使用 Jarkatanet 测试网来部署智能合约并与之交互。上述命令tezos-client
通过网络上的节点连接到 Jakartanet 测试https://jakartanet.ecadinfra.com
网。
在对 执行任何操作之前tezos-client
,您需要连接一个帐户。Tezos 提供 Faucet 帐户,让您可以免费与网络交互。
您需要访问Jakartanet Faucet 网站并下载 Faucet 文件。之后,在终端中打开下载文件夹并运行以下命令:
$ tezos-client activate account faucet with ./jakartanet.json
该命令会激活您的 Faucet 帐户tezos-client
并为其赋予别名faucet
。要检查此帐户的余额,请打开jakartanet.json
文件,复制 的值pkh
,然后运行以下命令:
$ tezos-client get balance for <address>
替换为您复制<address>
的pkh
值。
请注意,Tezos Faucet 帐户对所有人都是公开的,并且 Tez 代币数量有限,因此您必须规范您的使用。
要开始创建我们的示例智能合约,请创建一个新store_text.py
文件并将以下内容复制到其中:
import smartpy as sp
class StoreText(sp.Contract):
def __init__(self, value):
self.init(text = value)
@sp.entry_point
def replace(self, params):
self.data.text = params.text
@sp.entry_point # Note: the spaces before "@"
def append(self, params):
self.data.text += params.text
以下是上述合同的工作方式,逐个进行:
首先,我们导入了smartpy
库:
import smartpy as sp
然后,我们定义了一个扩展类sp.Contract
:
class StoreText(sp.Contract):
最后,我们在智能合约中定义了一些项目;首先,要初始化的构造函数text
:
def __init__(self, value): # Note: the spaces before "def"
self.init(text = value)
其次,替换 的值的入口点text
:
@sp.entry_point # Note: the spaces before "@"
def replace(self, params):
self.data.text = params.text
第三,将字符串附加到的入口点text
:
@sp.entry_point # Note: the spaces before "@"
def append(self, params):
self.data.text += params.text
接下来,我们来看看如何测试智能合约。
部署到 Tezos 的智能合约无法更改或删除。这可能是一个问题,因为合同中可能存在错误,错误可能导致代价高昂的错误和资金损失。
SmartPy 使您能够在部署之前轻松测试您的合约。测试合约不需要任何代币或钱包账户即可运行。您需要做的就是打开store_text.py
文件并复制以下内容:
@sp.add_test(name = "StoreText")
def test():
scenario = sp.test_scenario()
contract = StoreText("Hello")
scenario += contract
scenario.verify(contract.data.text == "Hello")
contract.replace(text = "Hi")
contract.append(text = ", there!")
scenario.verify(contract.data.text == "Hi, there!")
以下是代码段的工作原理。首先,我们将test
函数注册为测试脚本:
@sp.add_test(name = "StoreText")
然后,我们定义了test
函数:
def test():
在剩下的几行中,我们创建了一个测试场景:
scenario = sp.test_scenario()
初始化合约"Hello"
:
contract = StoreText("Hello")
将合约实例添加到场景中:
scenario += contract
验证合约的text
价值为"Hello"
:
scenario.verify(contract.data.text == "Hello")
称为replace
和append
入口点:
contract.replace(text = "Hi")
contract.append(text = ", there!")
最后,验证合约的text
价值现在是"Hi, there"
:
scenario.verify(contract.data.text == "Hi, there!")
添加测试后,保存文件并运行以下命令:
$ ~/smartpy-cli/SmartPy.sh test store_text.py ./test-output
如果测试成功,编译器不会抛出错误信息。
在部署智能合约之前,您需要将其编译为 Michelson。如前所述,Michelson 是一种用于 Tezos 区块链上的智能合约的低级编程语言。
要编译store_text.py
,请运行以下命令:
$ ~/smartpy-cli/SmartPy.sh compile message.py ./output
如果编译成功,您应该会看到output
如下所示的文件夹:
output/
├── scenario.json
├── script_init.py
├── script_pure.py
└── storeMessage/
├── log.txt
├── step_000_cont_0_contract.json
├── step_000_cont_0_contract.py
├── step_000_cont_0_contract.tz
├── step_000_cont_0_sizes.csv
├── step_000_cont_0_storage.json
├── step_000_cont_0_storage.py
├── step_000_cont_0_storage.tz
└── step_000_cont_0_types.py
该output
目录包含部署智能合约所需的所有文件。
要部署store_text.py
,请在终端中打开output/storeMessage
文件夹并运行以下命令:
$ ~/smartpy-cli/SmartPy.sh originate-contract --code step_000_cont_0_contract.json --storage step_000_cont_0_storage.json --rpc https://jakartanet.ecadinfra.com
[INFO] - Using RPC https://jakartanet.ecadinfra.com/...
[INFO] - Contract KT1………………CAjjW originated!!!
以下是该命令的工作方式:
originate-contract
告诉tezos-client
部署(“发起”)合约--code step_000_cont_0_contract.json
指向已编译的合约文件--storage step_000_cont_0_storage.json
指向编译后的存储文件--rpc
https://jakartanet.ecadinfra.com
指向要部署到的网络上的 RPC 节点Tezos 智能合约通常涉及两个组件:存储和合约。存储保存合约存储的数据,合约保存智能合约的逻辑。
请注意,您可以使用任何合约或存储编译部署合约。当您使用该命令时,它们只需具有相同的文件扩展名。
默认情况下,如果您在测试网上部署,编译器将使用 Faucet 帐户。如果您正在部署到主网或想要使用您的钱包帐户,请添加--private-key
标志,后跟帐户的私钥。
在与已部署的智能合约进行交互之前,您需要了解合约当前的外观。为此,请在浏览器中打开 SmartPy Explorer并按照以下步骤操作:
mainnet
到jakartanet
https://jakartanet.ecadinfra.com
到文本框中当合约数据出现时,文本存储应显示为“Hello, There!”
现在您知道合同的文本,您可以将其更改为“Hi, There!” replace
通过使用以下命令调用入口点:
$ tezos-client transfer 0 from faucet to <contract-address> --entrypoint replace --arg '"Hi, There!"'
如果命令成功,当您刷新资源管理器时,存储现在应该显示“Hi, There!”
请注意,您必须<contract-address>
在运行命令之前替换为已部署合约的地址。
本文介绍了使用 SmartPy 在 Tezos 上构建智能合约的过程。构建智能合约可以让您充分利用区块链网络来构建去中心化的应用程序和组织。
我希望这篇文章能帮助你理解在 Tezos 上构建智能合约的过程。如果您想了解有关智能合约的更多信息,请查看这篇关于要避免的智能合约错误的文章。
谢谢阅读!祝你有愉快的一天。开发和部署 Tezos 智能合约
来源:https ://blog.logrocket.com/developing-deploying-tezos-smart-contracts/