智能合约

推特@Hita_DAO    DiscordHitaDAO

智能合约(Smart Contract)是一种以信息化方式传播、验证和执行合同的计算机协议。智能合约概念于1995年由 Nick Szabo 首次提出。

智能合约允许在没有信任中介的情况下进行可信交易,这些交易可追踪且不可逆转。

简单地说,智能合约 可以理解为一个可以自动执行的协议,它可以自动处理协议的履行、管理,以及支付,无需第三方信任中介。

例如,我们可以编写这样一个智能合约:本月15号,张三转账给李四 1 个以太币。一旦这个智能合约部署后,那么在本月的15号,张三就可以领取到李四转来的 1 个以太币,整个过程不需要类似公证机构、银行这样的第三方信任中介参与。

 

以太坊(Ethereum) 智能合约

 

智能合约 的基本特点:去中心化、不可篡改、自动执行,所以它能够提供去中心化的信任,执行过程安全透明,从而可以减少成本、提高效率、实现公平公正。

在区块链领域,智能合约的定义更为广泛,可以理解为具有“去中心化”能力的应用程序。

比如:运行在区块链上的输出 Hello World 的简单程序,也可以称为 智能合约

所以,以太坊上的 智能合约 就是位于以太坊区块链上特定地址的代码和数据的集合。

智能合约 的代码量一般都比较少,几千行级别的智能合约就属于中大型的智能合约了,常见的合约通常只有几十行或者几百行。但是,即使是短短的几行代码,也可以发挥出巨大的威力。

1. 智能合约语言

编写智能合约的语言,在不同的区块链上也并不一样,比如:以太坊使用 Solidity 语言编写智能合约,Solana 使用 Rust 语言,而 Aptos 使用 Move 语言。

由于以太坊和它的兼容链、二层链,在公链领域占据了绝大部分的份额,所以只要在以太坊上能够编写智能合约,基本上就能满足大多数的应用场景。

目前,在以太坊上编写智能合约,使用最广泛的的语言是 SoliditySolidity 是一种和 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 中执行对应的智能合约的代码,并将结果记录在区块链上。