智能合约简介
页面最后更新: 2025年2月12日
什么是智能合约?
智能合约只是一个运行在以太坊链上的一个程序。 它是位于以太坊区块链上一个特定地址的一系列代码(函数)和数据(状态)。
智能合约是一种以太坊帐户。 这意味着它们有余额,可以成为交易的对象。 但是,他们无法被人操控,他们是被部署在网络上作为程序运行着。 个人用户可以通过提交交易执行智能合约的某一个函数来与智能合约进行交互。 智能合约能像常规合约一样定义规则,并通过代码自动强制执行。 默认情况下,你无法删除智能合约,与它们的交互是不可逆的。
前提条件
如果你刚开始入门或正在寻找技术性不强的介绍,我们建议你阅读我们的智能合约简介。
在进入智能合约的世界之前,请确保你已经阅读了有关帐户、交易和以太坊虚拟机的资料。
数字自动售货机
正如 Nick Szaboopens in a new tab 所描述,智能合约的最佳比喻或许是自动售货机。 有了正确的投入,就能保证一定的产出。
要从售货机中获取零食:
1money + snack selection = snack dispensed这种逻辑以程序的形式写入自动售货机。
像自动售货机一样,智能合约也有逻辑编程到其中。 这里有一个简单的例子,说明了如果售货机是一个用 Solidity 编写的智能合约将会是什么样子:
1pragma solidity 0.8.7;23contract VendingMachine {45 // 声明合约的状态变量6 address public owner;7 mapping (address => uint) public cupcakeBalances;89 // 部署“VendingMachine”合约时:10 // 1. 将部署地址设置成合约的所有者11 // 2. 将已部署的智能合约的纸杯蛋糕余额设为 10012 constructor() {13 owner = msg.sender;14 cupcakeBalances[address(this)] = 100;15 }1617 // 允许所有者增加智能合约的纸杯蛋糕余额18 function refill(uint amount) public {19 require(msg.sender == owner, "只有所有者才能补充。");20 cupcakeBalances[address(this)] += amount;21 }2223 // 允许任何人购买纸杯蛋糕24 function purchase(uint amount) public payable {25 require(msg.value >= amount * 1 ether, "每个纸杯蛋糕必须至少支付 1 ETH");26 require(cupcakeBalances[address(this)] >= amount, "库存中的纸杯蛋糕不足,无法完成此次购买");27 cupcakeBalances[address(this)] -= amount;28 cupcakeBalances[msg.sender] += amount;29 }30}显示全部就像自动售货机让厂商不再需要员工一样,智能合约可以在许多行业中取代中间人。
无需许可
任何人都可以编写智能合约并将其部署到区块链网络上。 你只需要学习如何用智能合约语言进行编码,并拥有足够的 ETH 来部署你的合约。 部署智能合约在技术上是一笔交易,因此你需要支付燃料,就像为简单的 ETH 转账支付燃料一样。 但是,合约部署的燃料成本要高得多。
以太坊提供了对开发者友好的智能合约编程语言:
- Solidity
- Vyper
然而,智能合约必须要先编译才能部署,以便以太坊虚拟机可以解释并存储它们。 更多关于编译
可组合性
智能合约在以太坊上公开,并且可以看成开放应用程序接口。 这意味着你可以在自己的智能合约中调用其他智能合约,以大幅扩展可能的功能。 合约甚至可以部署其他合约。
了解更多关于智能合约可组合性的信息。
局限性
智能合约本身无法获取有关“现实世界”事件的信息,因为它们无法从链下来源检索数据。 这意味着它们无法对现实世界中的事件作出响应。 这是设计使然。 因为依赖外部信息可能会影响共识,而共识对安全性和去中心化而言十分重要。
然而,对于区块链应用程序来说,能够使用链下数据非常重要。 解决方案是预言机,这是一种可以引入链下数据并提供给智能合约使用的工具。
智能合约的另一个限制是最大合约大小。 智能合约最大可达 24 KB,否则会消耗完燃料。 这个问题可以通过使用钻石模式opens in a new tab来规避。
多签合约
多重签名合约是需要多个有效签名才能执行交易的智能合约帐户。 这对于避免持有大量以太币或其他代币的合约出现单点故障非常有用。 多重签名还可以在多方之间划分合同执行和密钥管理的责任,并防止丢失单个私钥导致不可逆转的资金损失。 由于这些原因,多重签名合约可用于简单的去中心化自治组织治理。 多签需要从 M 个可能的可接受签名中获得 N 个签名才能执行(其中 N ≤ M,且 M > 1)。 通常使用 N = 3, M = 5 和 N = 4, M = 7。 4/7 多重签名需要七个可能的有效签名中的四个。 这意味着即使失去了三个签名,资金仍然可以收回。 在这种情况下,这也意味着必须得到大多数密钥持有人的同意和签名才能执行合约。
智能合约资源
OpenZeppelin Contracts - 安全智能合约开发库。