本文共 3452 字,大约阅读时间需要 11 分钟。
智能合约是一种特殊协议,旨在提供、验证及执行合约。
具体来说,智能合约是区块链被称之为“去中心化的”重要原因,它允许我们在不需要第三方的情况下,执行可追溯、不可逆转和安全的交易。
在以太坊,记录在区块链账本里的不仅仅是账户余额,还有函数调用后变量的新状态。
启动一个以太坊节点(如Geth)
使用智能合约编程语言(如Solidity)编写智能合约(后缀为.sol)。
可以将一个智能合约实例理解成一个对象,编写一个智能合约类似于编写一个类,其可以在这个类里定义各种变量以及函数。
这里给出一个简单的例子。下面这段代码就是一个智能。合约SimpleStorage,里面只有一个变量storedData,以及set和get方法。
contract SimpleStorage { string storedData; function set(string s) { storedData = s; } function get() constant returns (string) { returnstoredData; }}
用solc编译器将.sol合约代码编译成EVM字节码。
通过以太坊客户端将编译好的合约代码上传部署到以太坊区块链需要消耗GAS,并且需要合约发起用户使用自己的外部所有账户对将要部署的合约进行签名,通过矿工确认后,将合约代码存于以太坊区块链上,即智能合约被发送到所有连接到网络的设备上。在这一步中,用户可获得合约的地址,以及调用合约所需的接口,以便之后使用。
图1-4展示了在以太坊网络中创建智能合约的过程。
当Bob将一个包含智能合约信息(如上例代码)的交易发送到以太坊网络中后,节点的EVM执行这个交易并生成对应的合约实例,图中的“0x6f8ae93..”代表了这个合约的地址。节点间通过共识机制达成一致后,这个合约就正式生效了,之后用户就可以调用SimpleStorage合约了。
当用户将这个智能合约发布到以太坊网络中时,相当于给这个类生成一个对象,合约发布之后用户会得到一个合约地址,相当于合约对象的指针。
使用web3.js库所提供的JavaScript API接口来调用合约。这一步也会消耗以太币。
当网络中的用户调用这个智能合约时,可以直接给这个合约地址发送“交易”,并声明本次调用的函数名称和参数,使得智能合约执行对应的逻辑。
无论发布还是调用智能合约,智能合约的信息都被附在“交易”中,以交易的形式发布到网络中。
因此以太坊网络中的节点接收到这些交易后,其中的EVM会执行对应的合约代码,最后各个节点通过PoW或PoS等达成共识,合约的内容和状态也就实现了全网一致
图1-5展示了在以太坊上调用智能合约的过程。
Bob同样以交易的形式在“To”字段填上SimpleStorage合约的地址,在“Data”字段填上调用的方法(set)和参数(“Hello”),就可以调用智能合约SimpleStorage,将其中的storedData设为“Hello”。节点收到这条交易后,通过EVM执行对应的操作,并通过共识机制实现以太坊网络上合约状态的改变。
之后,当Alice查看这个合约的变量时,就会发现这个合约中storedData变量的值变成了“Hello”。
由于查看的过程不涉及状态的修改,而且以太坊上数据是分布式的,网络中的每个节点都可以在本地保存一份完整的数据,因此Alice可以不通过交易的形式查看到这个变量的值。
--《以太坊技术详解与实战》
以太坊虚拟机(EVM)是以太坊上智能合约的运行环境。
每个以太坊节点都运行着EVM。
它实际上是完全隔离的,这意味着在EVM上运行的代码无法访问网络、文件系统和其他进程。
智能合约对其他的智能合约的访问权也有限,在区块链网络上单独运作。
在以太坊上部署和运行智能合约大致流程
智能合约这么火,但是你连它的执行原理都不知道?
去中心化的区块链平台
什么是智能合约,智能合约运作原理详解
转载地址:http://uqkof.baihongyu.com/