以太坊开发者文档02 智能合约简介

智能合约简介

什么是智能合约?

“智能合约”只是在以太坊区块链上运行的程序。它是位于以太坊区块链上特定地址的代码(其函数)和数据(其状态)的集合。

智能合约是一种以太坊账户。这意味着它们有一个余额(balance),并且可以成为交易的目标。但是,它们不受用户控制,而是被部署到网络并按被编写的过程运行。然后,用户帐户可以通过提交执行智能合约上定义的函数的交易来与智能合约交互。智能合约可以像常规合约一样定义规则,并通过代码自动执行它们。智能合约默认无法删除,与它们的交互是不可逆的。

先决条件

如果您刚刚入门或正在寻找技术含量较低的介绍,我们推荐我们的智能合约简介

在进入智能合约的世界之前,请确保您已经阅读了账户交易以太坊虚拟机

数字自动售货机

可能对于智能合约最好的比喻是自动售货机,就像Nick Szabo所描述的。有了正确的输入,就可以保证确定的(certain)输出。

从自动售货机获取零食:

money + snack selection = snack dispensed

该逻辑被编程到自动售货机中。

智能合约,就像自动售货机一样,已将逻辑编程到其中。这是一个使用 Solidity 编写智能合约来实现自动售货机的简单例子:

pragma solidity 0.8.7;

contract VendingMachine {

    // 声明合约的状态变量
    address public owner;
    mapping (address => uint) public cupcakeBalances;

    // 当“自动售货机”被部署的时候(构造函数):
    // 1. 设置部署地址是合约所有者的地址
    // 2. 设置部署的合约的 cupcake 余额为 100
    constructor() {
        owner = msg.sender;
        cupcakeBalances[address(this)] = 100;
    }

    // 允许所有者增加智能合约的 cupcake 余额
    function refill(uint amount) public {
        require(msg.sender == owner, "Only the owner can refill.");
        cupcakeBalances[address(this)] += amount;
    }

    // 允许任何人购买 cupcake
    function purchase(uint amount) public payable {
        require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake");
        require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");
        cupcakeBalances[address(this)] -= amount;
        cupcakeBalances[msg.sender] += amount;
    }
}

就像自动售货机如何消除对供应商员工的需求一样,智能合约可以取代许多行业的中介。

无许可

任何人都可以编写智能合约并将其部署到网络中。您只需要学习如何使用智能合约语言进行编码,并拥有足够的 ETH 来部署您的合约。部署智能合约在技术上是一个交易,因此您需要像为简单的 ETH 转账支付 Gas 费一样为部署合约支付 Gas 费。但是,合约部署的 gas 成本要高得多。

以太坊具有用于编写智能合约的开发人员友好的语言:

  • Solidity
  • Vyper

关于语言更多的内容

但是,它们必须在部署前被编译,以便以太坊虚拟机可以解释和存储合约。更多关于编译的内容

可组合性

智能合约在以太坊上是公开的,并且可以被认为是开放的 API。这意味着你可以在你自己的智能合约中调用其他的智能合约来大大扩展可能性。合约甚至可以部署其他合约。

了解更多关于智能合约可组合性的内容。

限制

智能合约自身无法获取有关“真实世界”事件的信息,因为它们无法发送 HTTP 请求。这是设计使然。依赖外部信息可能会危及共识,这对安全和去中心化很重要。

有一些方法可以使用预言机来解决这个问题。

智能合约的另一个限制是最大合约大小。一个智能合约最大可以是 24KB,否则就会耗尽 gas。这可以通过使用 The Diamond Pattern 来绕过。

多签合约

多签(多重签名)合约是智能合约账户,需要多个有效签名才能执行交易。这对于避免持有大量以太币或其他代币的合约出现单点故障非常有用。多重签名还可以在多方之间划分合同执行和密钥管理的责任,并防止丢失单个私钥导致不可逆转的资金损失。由于这些原因,多重签名合约可用于简单的 DAO 治理。多重签名需要 M 个可能的可接受签名中的 N 个签名(其中 N ≤ M,并且 M > 1)才能执行。 N = 3,M = 5 和 N = 4,M = 7 是常用的。 4/7 多重签名需要七分之四的可能有效签名。这意味着即使丢失了三个签名,资金仍然可以取回。在这种情况下,这也意味着大多数关键持有人必须同意并签署才能执行合同。

智能合约资源

OpenZeppelin 合约 - 安全智能合约开发库

DappSys - 安全、简单、灵活的智能合约构建块

延伸阅读


以太坊开发者文档02 智能合约简介
https://alphafitz.com/2022/08/31/officialweb-02-introduction-to-smart-contracts/
作者
alphafitz
发布于
2022年8月31日
许可协议