探索Web3世界:智能合约与以太坊

欢迎回到《探索Web3世界》系列文章,我是鲤哥,在本篇文章中,我将用简洁易懂的语言介绍清楚智能合约和以太坊是什么。

8 min read
智能合约 以太坊 区块链
此文章已上链验证

什么是智能合约?

想象一下,你走进一家无人售货店,想要买一瓶饮料。你扫码支付,选择饮料,机器"咔嚓"一声,饮料自动掉出来。整个过程没有店员,没有收银台,只有你和那台聪明的机器。这台机器,其实就是"智能合约"的现实版。

智能合约就像是一个自动执行的协议。它运行在区块链上,一旦满足预设条件,就会自动执行相应的操作。比如,你买了一份智能保险,如果你的车发生事故,传感器会自动检测到,并根据保险条款直接赔付给你。不需要打电话、填表格,甚至不需要等保险公司审核——一切都由代码自动完成。

智能合约的三大法宝

  1. 去中心化:没有中间商赚差价,一切由区块链网络自动处理
  2. 不可篡改:一旦部署,合约代码就像刻在石头上一样,谁也无法更改
  3. 自动执行:条件满足,合约自动运行,省时省力,还不用担心人为错误

智能合约的这些特性,让它成为了Web3世界的"超级助手",从金融交易到保险理赔,从投票系统到供应链管理,它的应用场景无处不在。

什么是以太坊?

以太坊简介

如果说比特币是区块链世界的"黄金",那么以太坊就是区块链世界的"超级计算机"。它由天才少年Vitalik Buterin于2015年创立,目标不仅仅是处理货币交易,还要让开发者能够构建各种去中心化应用(DApps)。

以太坊同样是一个开源的、去中心化的区块链平台,它不仅支持原生的加密货币:以太币(ETH),还提供了一个运行去中心化应用程序(DApps)的生态系统。这些应用程序通过智能合约来实现,运行在以太坊虚拟机(EVM)上。

以太坊的核心特点

  1. 智能合约:开发者可以用编程语言(比如Solidity)编写智能合约,部署到以太坊上
  2. 去中心化应用(DApps):以太坊为开发者提供了构建透明、安全、不可篡改应用的平台
  3. 以太币(ETH):以太坊的原生加密货币,用于支付交易费用和智能合约的执行费用

节点与网络:区块链的神经系统

以太坊网络由成千上万的节点组成,这些节点就像是区块链的"神经系统",共同维护着整个网络的运行。节点分为几种类型:

  1. 全节点:保存完整的区块链数据,验证所有交易和区块
  2. 轻节点:只保存部分数据,依赖全节点进行验证
  3. 矿工节点:负责打包交易并生成新区块(在PoW机制下)

这些节点通过互联网连接在一起,形成一个去中心化的网络,确保数据的安全性和一致性。

账号与钱包:你的区块链身份证

在以太坊的世界里,每个人都需要一个"身份证",这就是以太坊账号。账号分为两种:

  1. 外部账号(EOA):由你通过私钥控制,可以用来发送交易、调用智能合约
  2. 合约账号:由智能合约代码控制,没有私钥,只能通过外部账号触发

MetaMask是一款超级流行的以太坊钱包,你可以在浏览器插件市场找到它。它就像你的区块链"管家",可以帮助你:

  • 管理账号
  • 发送和接收ETH
  • 与DApps互动
  • 签署交易

Gas:区块链的燃料

在以太坊的世界里,ETH不仅是货币,还是驱动整个网络的"燃料"。每笔交易、每个智能合约的执行都需要消耗一定的资源,这些资源的费用就是用ETH支付的。

Gas费用由以下两个因素决定:

  1. Gas Limit:你愿意为这笔交易支付的最大Gas量
  2. Gas Price:你愿意为每单位Gas支付的ETH金额

计算公式:

总费用 = Gas Limit × Gas Price

举个例子,如果你设置的Gas Limit是50,000,Gas Price是20 Gwei,那么这笔交易的总费用就是:

50,000 × 20 Gwei = 1,000,000 Gwei = 0.001 ETH

对了,ETH的最小单位是Wei,1 ETH = 10^18 Wei。常用的单位还有Gwei(1 Gwei = 10^9 Wei),通常也用于计算Gas费用。

以太坊采用什么共识机制?

以太坊最初采用工作量证明(PoW)共识机制,和比特币类似。矿工们通过解决复杂的数学难题来争夺记账权,并获得区块奖励。然而,PoW机制有一个很大的问题——能耗太高。比特币矿工每年消耗的电力堪比一个中等国家!

为了解决这个问题,以太坊升级了到权益证明(PoS)机制,这一升级被称为以太坊2.0。

在PoS机制下,矿工变成了验证者。验证者需要质押至少32 ETH,才有资格参与区块验证。验证者通过随机选择的方式创建新区块,并获得区块奖励。

智能合约的编写规则

智能合约语言与框架

以太坊智能合约的编程语言有多种选择,但最主流的是 Solidity。

HardHat 框架则是 Solidity 语言最受欢迎的框架之一,它使用 JavaScript 语言编写。HardHat 提供了强大的工具链,包括本地测试网络、调试器和插件系统。

除了 HardHat,还有 Foundry 框架用的人也比较多,它是一个基于Rust的智能合约开发工具链,支持使用 Solidity 和 Rust 编写智能合约。

编译智能合约

编写完智能合约后,需要使用编译器将其转换为以太坊虚拟机(EVM)可以执行的字节码。Solidity 编译器(如solc)可以帮助你完成这一过程。

部署智能合约

编译完成后,智能合约需要部署到以太坊网络上。部署过程会消耗 Gas,因此你需要确保钱包中有足够的 ETH。

常用的部署工具包括:

  • HardHat Deploy:HardHat 的部署插件,支持多网络部署和脚本化管理。
  • Remix IDE:一个在线的智能合约开发环境,支持一键部署到测试网络或主网。

测试智能合约

在部署之前,务必对智能合约进行全面的测试。你可以使用 Foundry 或 HardHat 等工具编写测试用例,确保合约的逻辑正确无误。

验证智能合约

部署后,你可以通过 Etherscan 等区块链浏览器验证智能合约的源代码,确保其透明性和安全性。

升级智能合约

智能合约一旦部署到区块链上,其代码就不可更改。这种不可篡改性虽然保证了合约的透明性和安全性,但也带来了一个问题:如果合约中存在漏洞,或者需要添加新功能,该怎么办?

这时候就需要智能合约的升级机制。通过合理的设计,开发者可以在不破坏原有合约逻辑和数据的情况下,实现对合约的升级。

代理模式

代理模式是智能合约升级中最常用的方法。它的核心思想是将合约逻辑和合约数据分离:

  • 代理合约(Proxy Contract):负责存储数据和转发用户请求。
  • 逻辑合约(Logic Contract):负责实现具体的业务逻辑。

当需要升级时,只需部署一个新的逻辑合约,并将代理合约指向新的逻辑合约地址即可。这样,用户始终与代理合约交互,而代理合约会将请求转发给最新的逻辑合约。

以下是一个简单的透明代理模式(代理合约会检查调用者是否为管理员。如果是管理员,则调用升级函数;否则,转发给逻辑合约)实现:

// 代理合约
contract Proxy {
    address public implementation; // 逻辑合约地址
    address public admin; // 管理员地址

    constructor(address _implementation) {
        implementation = _implementation;
        admin = msg.sender;
    }

    // 升级逻辑合约
    function upgrade(address _newImplementation) external {
        require(msg.sender == admin, "Only admin can upgrade");
        implementation = _newImplementation;
    }

    // 转发用户请求
    // 这是一个特殊的函数,当用户调用的函数在合约中不存在时,会自动触发fallback函数。
    fallback() external payable {
        // 将implementation的值赋给局部变量_impl,以便在汇编代码中使用
        address _impl = implementation;
        // assembly 是Solidity中的内联汇编,允许开发者直接编写EVM(以太坊虚拟机)级别的代码
        assembly {
            // 这是一个EVM指令,用于将调用数据(calldata)复制到内存中
            calldatacopy(0, 0, calldatasize())
            // 这是一个EVM指令,用于调用另一个合约的代码,但保持当前合约的上下文(包括存储、余额等)
            let result := delegatecall(gas(), _impl, 0, calldatasize(), 0, 0)
            // 这是一个EVM指令,用于将调用外部合约后的返回数据复制到内存中
            returndatacopy(0, 0, returndatasize())
            switch result
            case 0 { revert(0, returndatasize()) }
            default { return(0, returndatasize()) }
        }
    }
}

// 逻辑合约
contract LogicV1 {
    uint256 public value;

    function setValue(uint256 _value) public {
        value = _value;
    }
}

// 新版本逻辑合约
contract LogicV2 {
    uint256 public value;

    function setValue(uint256 _value) public {
        value = _value * 2; // 新功能:将值翻倍
    }
}

模块化设计

在这种模式下,合约的功能被拆分为多个模块,每个模块负责实现特定的功能。当需要升级时,只需替换或添加新的模块即可。

// 基础合约
contract Base {
    uint256 public value;

    function setValue(uint256 _value) public virtual {
        value = _value;
    }
}

// 模块合约V1
contract ModuleV1 is Base {
    function setValue(uint256 _value) public override {
        value = _value + 10; // 新功能:加10
    }
}

// 模块合约V2
contract ModuleV2 is Base {
    function setValue(uint256 _value) public override {
        value = _value * 2; // 新功能:将值翻倍
    }
}

部署Base合约:

  1. 部署ModuleV1合约,并继承Base合约。
  2. 用户通过ModuleV1合约与Base交互。
  3. 当需要升级时,部署ModuleV2合约,并继承Base合约。
  4. 用户通过ModuleV2合约与Base交互,原有数据保持不变。

以太坊客户端API

以太坊提供了丰富的API接口,允许开发者与区块链进行交互。常用的API包括:

  • Web3.js:JavaScript库,用于与以太坊节点通信。
  • Ethers.js:另一个流行的JavaScript库,功能更强大且易于使用。
  • Infura:提供以太坊节点的API服务,无需自己运行节点。

以太坊的存储

以太坊的存储分为两种:

  1. 链上存储:数据直接存储在区块链上,具有不可篡改性,但成本较高。
  2. 链下存储:数据存储在去中心化存储网络(如IPFS或Arweave)中,成本较低,但需要通过哈希值链接到区块链。

结语

通过这篇文章,我们不仅了解了智能合约的神奇之处,还深入探讨了以太坊的账号系统、钱包使用、ETH面额、Gas费用、节点网络和共识机制等等。这些知识可以帮你更好地理解以太坊的运作原理。

接下来的文章,我打算讲清楚智能合约的编程语言 Solidity 的语法。敬请期待!

链上验证

此文章已被永久存储在区块链上,并由其创作者进行了签名验证。您可以查看相关证明,也可以将其铸造为 NFT 收藏。

创作者地址
0x16572b97410200e79AB6c9423F8d9778F0Fb9C54
Arweave 交易
mBOgbODkgsFpSzfgTnIAQuUuAAfkegptCwfX3gcVh0Q
NFT 合约
0x903e48Ca585dBF4dFeb74f2864501feB6f0dF369
内容哈希
0x185434077436d61b120f7f5e733e1a98d64a0db27e5dfb6f597d9c260d2dde5d1.0.0

NFT 详情

铸造价格
0 TLOS
最大供应量
9999
Chain ID
41
合约版本
v1.0.0
每地址限制
1 枚

探索Web3世界

您正在阅读 探索Web3世界 系列的第 5 篇文章
查看系列全部文章

分享文章