时间:2023-07-09|浏览:180
高可用架构翻译blockgeeks的系列文章,帮助大家更好学习及了解区块链开发。本文为第二篇。
对区块链基础及公链开发感兴趣的读者请参阅如何成为一名区块链开发者(一)。
成为区块链开发者-里程碑4:学习智能合约开发
如何定义智能合约?
根据维基百科,智能合约是"一种旨在促进、验证或执行合约的协商或执行的计算机协议"。虽然它是由美国密码学家Nick Szabo在1996年首次提出,但Ethereum(以太坊)通常被认为是普及这一概念并使其成为主流的原因。
可以在我们的深度指南中了解更多关于智能合约的信息。 https://blockgeeks.com/guides/smart-contracts/
在智能合约中,我们想要的理想属性是什么?
任何在区块链上运行的东西都需要是不可变的,必须以太坊矿机价格有能力在不影响其完整性的情况下通过多个节点运行。因此,智能合约的功能需要具备三个要素:
确定性(Deterministic)
可终止的(Terminable)
隔离性(Isolated)
特点1:确定性
如果一个程序每次给定的输入都有相同的输出,那么它就是确定性的。例如:如果3+1=4,那么3+1将永远是4(假设基础相同)。所以当一个程序在不同的计算机中对同一组输入给出相同的输出时,这个程序就被称为确定性程序。
有各种情况,程序可以以非确定性方式运行。
调用非确定性的系统函数。当在程序中调用一个不确定的函数时。
访问不确定的数据资源。如果一个程序在运行时获取数据,而这个数据源是不确定的,那么这个程序就会变成不确定的。比如一个程序获取一个特定查询的前10名Google搜索。这个列表可能会不断变化。
动态调用。当一个程序调用第二个程序时,就叫做动态调用。由于调用目标只在执行过程中确定,所以它的性质是不确定的。
特征2:可终止
在数理逻辑中有一个错误叫做“停顿问题”。基本上,它表示无法知道一个给定的程序是否能在限定的时间内执行其功能。1936年,Alan Turing利用Cantor's Diagonal Problem推断出,无法知道一个给定的程序是否能在限定时间内完成。
这对于智能合约来说,这显然是一个问题,因为合约的定义,必须能够在给定的时间限制内终止。我们采取了一些措施来确保有办法从外部“杀死”合约,不进入一个无尽的循环,从而消耗资源。
图灵非完备性一个图灵非完备的区块链的功能是有限的,代码不能进行跳转及循环。当然也不能进入无尽循环。
步数和计费。一个程序可以简单地跟踪它所走的"步数",也就是它所执行的指令数量,然后在某一特定步数被执行后终止。另一种方法是计费。在这里,合约的执行需要预先支付一定的费用。每一条指令的执行都需要一定的费用。如果花费的费用超过了预付费用,那么合约就会终止。
定时器:这里有一个预先设定的定时器。如果合约的执行超过了时间限制,那么合约就会被外部中止。
特征#3:隔离性
在区块链中,任何人都可以上传智能合约。然而正因如此,这些合约可能会在有意和无意中包含病毒和bug。如果合约没有被隔离,这可能会影响整个系统。因此将合约隔离在沙盒中,使整个生态系统免受任何负面影响是至关重要的。
现在我们已经看到了这些功能,重要的是要知道它们是如何执行的。通常,智能合约使用下面两个系统中的一个运行。
虚拟机:Ethereum使用的是虚拟机
Docker:Fabric使用
让我们比较一下这两者,并确定哪一个生态更好。为了简单起见,我们将比较Ethereum(虚拟机)和Fabric(Docker)。
如果你对Ethereum开发特别感兴趣,那么你需要同时学习solidity编程语言。
对于任何想要学习如何开发DAPP(去中心化应用)的人来说,学习Solidity是绝对必须的。我们已经有一份详细的指南,你可以在这里阅读(1)。在