智能合约
智能合约
(Smart Contract)是一种以信息化方式传播、验证和执行合同的计算机协议。智能合约概念于1995年由 Nick Szabo 首次提出。
智能合约允许在没有信任中介的情况下进行可信交易,这些交易可追踪且不可逆转。
简单地说,智能合约
可以理解为一个可以自动执行的协议,它可以自动处理协议的履行、管理,以及支付,无需第三方信任中介。
例如,我们可以编写这样一个智能合约:本月15号,张三转账给李四 1 个以太币。一旦这个智能合约部署后,那么在本月的15号,张三就可以领取到李四转来的 1 个以太币,整个过程不需要类似公证机构、银行这样的第三方信任中介参与。
智能合约
的基本特点:去中心化、不可篡改、自动执行,所以它能够提供去中心化的信任,执行过程安全透明,从而可以减少成本、提高效率、实现公平公正。
在区块链领域,智能合约的定义更为广泛,可以理解为具有“去中心化”能力的应用程序。
比如:运行在区块链上的输出 Hello World
的简单程序,也可以称为 智能合约
。
所以,以太坊上的 智能合约
就是位于以太坊区块链上特定地址的代码和数据的集合。
智能合约
的代码量一般都比较少,几千行级别的智能合约就属于中大型的智能合约了,常见的合约通常只有几十行或者几百行。但是,即使是短短的几行代码,也可以发挥出巨大的威力。
1. 智能合约语言
编写智能合约的语言,在不同的区块链上也并不一样,比如:以太坊使用 Solidity
语言编写智能合约,Solana
使用 Rust
语言,而 Aptos
使用 Move
语言。
由于以太坊和它的兼容链、二层链,在公链领域占据了绝大部分的份额,所以只要在以太坊上能够编写智能合约,基本上就能满足大多数的应用场景。
目前,在以太坊上编写智能合约,使用最广泛的的语言是 Solidity
。Solidity
是一种和 JavaScript
相似的语言。
Solidity
是一种面向对象的静态编程语言,用于在以太坊区块链上编写智能合约。
Solidity
深受 C++、Python 和 JavaScript 等编程语言的影响,语法与它们非常相似,但是 Solidity
针对以太坊虚拟机进行了专门的设计。
我们可以使用 Solidity
在以太坊区块链上创建代币、NFT、投票、DeFi 以及 GameFi 等各种类型的智能合约。
2. 智能合约的编译
使用 Solidity
语言编写的智能合约,并不能直接在以太坊区块链上运行,还需要经过编译和部署两个步骤。
在以太坊上运行智能合约的环境,称为“以太坊虚拟机”,英文缩写为 EVM
。
在 EVM
上最终执行的智能合约代码,并不是文本形式的 Solidity
语言的源代码,而是一种二进制代码,称为 字节码
。
二进制代码 非常不直观,难以理解。所以,我们是无法直接编写 二进制代码 的智能合约的。
通常,我们会使用更容易理解的 Solidity
语言来编写智能合约,然后使用 编译器 将其编译为二进制代码,最后在以太坊虚拟机上执行。
这个过程如下所示:
一个智能合约文件 Helloworld.sol,经过编译器编译,生成了 Helloworld.abi 和 Helloworld.bin 文件。
solc helloworld.sol --abi --bin -o ./
ABI
文件是合约的接口描述文件,也就是一份合约的使用说明书,提供给调用者参考使用。bin
文件可以看作是一个二进制文件,这二进制文件就是EVM
指令的集合。这个文件最终部署到以太坊区块链上。
3. 智能合约的部署
编译成功的合约需要部署到区块链上。
合约的部署跟发送一笔交易是一样的操作:调用 transaction 函数,from 为发布者的地址,to 为 0x 地址,data 为合约的二进制代码。
合约部署后,会生成一个智能合约地址。调用者只需要有合约地址和 abi
文件就可以调用这个智能合约。
4. 智能合约的调用
我们要调用一个智能合约,首先必须知道智能合约的地址和合约的方法。
然后通过 web3.js 这种前端 js 库,通过以太坊区块链的 RPC 接口,发送一笔调用合约的交易。
以太坊区块链收到交易后,将会在 EVM
中执行对应的智能合约的代码,并将结果记录在区块链上。