Solidity编程语言完整指南

  • cyfrin
  • 发布于 2024-08-23 17:28
  • 阅读 19

Solidity是一种高阶编程语言,用于在以太坊和许多EVM兼容区块链上编写智能合约。本文深入探讨了Solidity的背景、工作原理以及其关键特性、应用和开发工具,旨在帮助开发者掌握Solidity编程技能,并指出学习资源以支持他们的学习。

什么是Solidity编程语言:完整指南

Solidity是一种高级编程语言,用于在以太坊和大多数EVM兼容区块链上编写智能合约。想了解更多详情,请查看Cyfrin的深入探讨。

掌握Solidity编程语言的开发者,平均年薪可达$105,000。对此专业的需求正在增长。让我们来看看原因。

程序员专门使用Solidity来编写以太坊的智能合约。智能合约是自执行程序,定义并执行区块链上账户的规则和行为。

自其推出以来,它已经成为智能合约开发的默认选择。Solidity是大多数EVM兼容区块链网络的标准,包括以太坊AvalanchePolygonBinance Smart Chain

在这篇文章中,我们将探讨Solidity及其背景以及工作原理。我们还将研究其各种框架和可用学习资源,以帮助你成为Solidity开发者。

Solidity概述

Solidity是一种静态类型的高级编程语言。它的设计允许在以太坊虚拟机(EVM)上编写和部署智能合约。然而,它也可以在其他兼容的区块链平台上运行。

Solidity对于构建需要安全和透明操作的去中心化应用程序(dApps)的开发者至关重要。

图灵完备性及其影响

Solidity是一种图灵完备语言。这意味着它可以模拟任何逻辑问题解决步骤,允许其表示和执行任何算法。它使开发者能够在智能合约中创建复杂的逻辑和功能。

Solidity的关键特性和设计

Solidity在易用性与强大能力之间取得了平衡,例如:

  • 面向合同的设计: 便于定义合约结构、状态变量和函数。

  • 静态类型: 在编译时强制进行类型检查,减少运行时错误,提高代码可靠性。

  • 支持继承: 允许开发者创建模块化和可重用的代码。

  • 库和接口: 支持定义和使用库和接口,促进代码的模块化和重用。

  • 事件和日志: 其事件处理能力使合约能够发出外部应用程序可以记录和跟踪的事件。

Solidity的语法和特性受现有语言的启发,使其对开发者而言更加易于访问:

  • Solidity借用其花括号语法和许多控制结构,如ifforwhile循环,来自JavaScript

  • Solidity使用C++的概念,如函数重载、继承和用户定义类型。变量声明和显式类型转换也让我们想起了C++。

  • Inspired by Python 的修饰符,Solidity的修饰符允许开发者更改函数行为。Python还影响了Solidity的多重继承和super关键字。

但这一切是怎么开始的呢?

Solidity编程语言的历史

起源和初始开发

以太坊的联合创始人Gavin Wood于2014年推出Solidity。随后,由Christian Reitwiessner领导的几位核心贡献者进一步开发了该语言。

Solidity现在是一个开源的、社区驱动的项目,由以太坊基金会治理。正因此,它随着常规更新而持续发展,引入新特性和改善。

演变与当前状态

自推出以来,该语言经历了多次发展。持续的改进引入了新的且创新的特性。

2014年: Gavin Wood和Christian Reitwiessner开发了Solidity作为以太坊的智能合约编程语言。

2015年: Solidity的首次稳定版本与以太坊主网的推出同时发布。

2016-17年: 开发者快速采用。工具如Remix使智能合约的开发更加方便和高效。

2018年至今: 持续的更新和改进,包括安全性增强和优化特性。Solidity通过以太坊改进提案(EIPs)整合了新能力,使社区能够提议和实施更改。

Hardhat,全面的开发环境,也在此时推出。它简化了Solidity的智能合约构建和测试。

最近,Foundry的推出为开发和测试智能合约提供了快速且高效的框架。

现在,让我们探索它是如何工作的。

Solidity是如何工作的?

编写和编译Solidity代码

开发者使用Solidity的特定语法编写智能合约,以定义合约逻辑、状态变量和函数。

Solidity编译器生成两个输出:

  • 字节码是Solidity代码的编译版本或EVM执行的低级机器指令。
  • ABI(应用程序二进制接口)是一个JSON文件,描述了合约的函数、输入/输出类型和事件。ABI允许外部应用程序与合约进行交互。

与以太坊虚拟机(EVM)的交互

EVM是智能合约的运行环境。它执行编译后的字节码并管理其在这些网络上的状态。这确保了交易处理和合约逻辑的正确执行。

  • 当部署到任何EVM兼容网络时,Solidity合约会收到一个唯一地址。该地址在区块链上存储合约的字节码。

  • 用户通过向其地址发送交易与已部署的合约进行交互。这些交易可以调用函数,改变合约状态或执行特定逻辑。

  • EVM读取存储在合约地址处的字节码,并执行相应的指令。这可能涉及读取或写入合约的存储、进行计算或与其他合约进行交互。

  • EVM执行的每个操作都会消耗Gas费,以以太(ETH)支付,或特定链的原生货币。更复杂的操作需要更多计算,因此会使用更多Gas。

现在我们知道它是如何工作的,接下来让我们探索Solidity的实际应用。

Solidity的应用

Solidity使开发者能够创建无限多的功能和dApp,涵盖以下用例:

去中心化金融(DeFi)

  • 去中心化交易所(DEX): 像Uniswap和SushiSwap的平台促进直接的加密交易。

  • 借贷协议: 像Aave和Compound的服务提供去中心化的借贷和借款。

  • 稳定币: 类似DAI和USDC的代币通过将其价值Hook于美元保持稳定价格。

非同质化代币(NFT)

  • 数字收藏品: 像CryptoPunks和Bored Ape Yacht Club这样的项目创造独特的数字艺术。

  • 虚拟世界和游戏: 像Decentraland和Axie Infinity的平台使用NFT作为游戏内资产。

供应链管理

  • 溯源: Everledger使用区块链追踪钻石的来源,确保符合道德标准。

  • 食品安全: 沃尔玛采用区块链跟踪农产品的流转,能够迅速响应事件。

医疗记录

  • 医疗数据管理: Medicalchain使用区块链让患者控制自己的医疗记录,使与医疗提供者的共享变得顺畅。

  • 处方追踪: MediLedger跟踪药物的分发,确保合规并减少欺诈。

现实世界资产(RWAs)

  • 房地产: Propy将房地产进行代币化,简化所有权转移,并支持全球参与。

  • 艺术和收藏品: Masterworks将艺术作品进行代币化,使高价值资产更易于被更广泛的受众所接触。

覆盖了Solidity在各个领域的深远影响后,让我们来探讨支持它的网络。

支持Solidity的区块链

虽然Solidity最初是为以太坊开发的,但它的流行性和多功能性使其被多个其他区块链网络采纳。这些区块链支持Solidity,允许开发者在多个平台上编写和部署智能合约:

ZKsync标志

ZKsync是一个以太坊的Layer 2扩展解决方案,利用零知识证明提供快速、低成本的交易。

Arbitrum标志与字样。

Arbitrum是一个支持EVM兼容智能合约的乐观Rollup。它通过启用更快、更便宜的交易同时保持安全性,提升以太坊的性能。

Optimism标志

Optimism也是一个以太坊的乐观Rollup,它使用欺诈证明来增加交易吞吐量和降低成本。

现在更实际一些。

Solidity框架和开发工具

以下框架和工具允许Solidity开发者安全高效地构建、测试和部署智能合约:

Remix IDE标志与字样

Remix是一个基于浏览器的集成开发环境(IDE),几乎无需设置,任何有兴趣实现智能合约的人都可以直接使用。这是许多新Solidity开发者的起点。

Remix包含各种开发工具,包括工作区、编译器和调试器。其配置可以部署到大多数主要的远程过程调用(RPC)服务。

除了在线版本,Remix还提供桌面IDE和Visual Studio Code插件。这些提供额外的功能和更安全的本地生命周期存储。

Hardhat标志

Hardhat是一个基于JavaScript的框架,用于管理和自动化智能合约开发。

它包含编译、部署、测试和调试工具。并提供本地以太坊网络用于测试,并支持各种插件。

Hardhat拥有许多开源插件,包括Gas分析器、单元测试覆盖报告,以及用于集成前端应用程序的工具。

Foundry标志

Foundry是一个快速增长的框架,以其速度和广泛的工具集合而闻名。

它简化并加速了智能合约的开发、测试和部署。它还帮助开发者管理整个Solidity智能合约的开发生命周期。其较其他框架更快的编译和测试时间也值得注意。

Foundry组件

  • Forge:用于合约编译、部署和测试。
  • Cast:方便交易创建、区块链交互和数据转换。
  • Anvil:用于测试和调试合约的本地以太坊网络。
  • Chisel: 一个读取-评估-打印循环(REPL)工具。它读取和评估输入,打印结果,并回到等待指令的状态。

Foundry还与以太坊之外的Layer 2解决方案和EVM链集成,如Starknet。这使得开发者可以以更快、更便宜的交易进行智能合约的部署和测试。

如果你是Foundry新手并想学习,可以从Cyfrin Updraft的Foundry基础课程开始。如果你更有经验,可以直接跳入高级Foundry

其他常见的Solidity工具

OpenZeppelin是一个库,提供如ERC-20ERC-721等标准的智能合约。它还提供用于升级智能合约的工具。

Cyfrin Aderyn 是一个基于rust的Solidity智能合约静态分析器。它帮助协议工程师和安全研究员发现Solidity代码中的漏洞。

Solidity VSCode扩展为Visual Studio添加了对Solidity的支持。它包括语法高亮、代码完成和内联编译。这些使开发者能够更轻松地在流行的IDE中编写和管理Solidity合约。

Solidity开发的其他工具

除了基本工具,额外的工具还用于部署和管理智能合约。

水龙头(Faucets)提供免费的测试网ETH或其他代币。这使得开发者能够在测试网络上部署和与智能合约交互,而无需使用真实资金。Sepolia水龙头是以太坊生态系统中流行的选择。

节点提供商像Infura、Alchemy和QuickNode为与区块链交互提供可扩展的基础设施。这些服务提供对区块链网络的快速访问,使开发者可以部署合约、读取数据和发送交易。

Ankr的分布式网络是一个去中心化的替代方案,提供类似功能而具有更高的健壮性和独立于集中控制的特性。

现在,是时候通过一个示例深入探讨了。

智能合约示例

这个合约允许创建者铸造新代币,并允许用户相互发送代币。

注意: 这是一个简化示例;请勿在生产中使用。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

contract Coin {
    // 关键词"public"使变量可被其他合约访问
    address public minter;
    mapping(address => uint) public balances;

    // 事件允许客户端响应特定的合约状态变化
    event Sent(address from, address to, uint amount);

    // 错误允许你提供有关操作失败原因的信息
    error InsufficientBalance(uint requested, uint available);

    // 构造函数代码仅在合约创建时执行
    constructor() {
        minter = msg.sender;
    }

    // 将新创建的代币发送到一个地址
    // 只能由合约创建者调用
    function mint(address receiver, uint amount) public {
        require(msg.sender == minter);
        balances[receiver] += amount;
    }

    // 从任何调用者向一个地址发送已存在的代币
    function send(address receiver, uint amount) public {
        if (amount > balances[msg.sender])
            revert InsufficientBalance({
                requested: amount,
                available: balances[msg.sender]
            });

        balances[msg.sender] -= amount;
        balances[receiver] += amount;
        emit Sent(msg.sender, receiver, amount);
    }
}

Solidity智能合约的解释

  • Minter: 合约创建者的地址,可以铸造新代币。
  • Balances: 一个映射,用于跟踪所有用户的余额。
  • 事件: Sent事件记录代币转账的详细信息。
  • 构造函数: 一个特殊函数,仅在部署合约时执行一次。构造函数将minter设置为部署合约的地址。
  • 铸造函数: mint允许minter创建新代币并更新特定地址的余额。
  • 错误处理: InsufficientBalance错误处理用户试图发送超过其余额的代币的情况。
  • 发送函数: send使用户能够将代币转账到另一个地址,前提是他们有足够的余额。

工作流

  1. 将合约部署到EVM兼容的网络;部署者成为minter。
  2. minter通过mint函数创建并分发新代币给特定地址。
  3. 用户通过send函数将代币转账给其他人,该函数触发Sent事件以记录交易。

现在,你已经看到了一个Solidity的智能合约示例,让我们研究如何保护它。

安全考虑

智能合约是不可变的。这增加了信任,但也使它们在存在错误或漏洞的情况下容易遭受永久性损失或攻击。

例如,2016年的DAO漏洞导致以太坊区块链的硬分叉。因此,在部署之前,确保智能合约的安全性和正确性通过代码审计至关重要。以下是一些考虑和选项:

  • 整合常规测试、使用最新库、并参考已知漏洞的数据库,如Solodit非常重要。
  • 聘请私人审计机构,如Cyfrin、OpenZeppelin、Trail of Bits和Guardian Audits提供深入的评估。
  • 利用平台如CodeHawks、Code4rena和Cantina进行竞技审计,以识别漏洞。

私人审计是需要详细分析的项目的理想选择。竞赛审计提供多元化的输入以及更快、成本效益高的结果。两者结合可确保全面的安全性。

涵盖了理论基础后,让我们来看开发者如何学习Solidity。

如何学习Solidity

任何有兴趣在EVM兼容区块链上开发dApp和智能合约的人,都必须学习Solidity。以下是一些最佳资源以开始学习:

1. Cyfrin Updraft

Cyfrin Updraft提供免费的全面课程,涵盖智能合约开发和安全的各个方面。其课程内容从Solidity智能合约开发等基础主题逐步深入到中级技能,如Foundry、Assembly和形式验证。高级模块则专注于智能合约安全、DevOps,以及DeFi平台如Curve和Uniswap。

2. Solidity示例

Solidity示例是一个简洁、易于理解的代码示例集合。它非常适合喜欢通过代码片段工作并查看实际实现的开发者。

3. CryptoZombies

CryptoZombies是一个游戏化的指南,提供逐步说明和实际编程练习,以帮助你学习Solidity。

4. 文档和指南

官方的Solidity文档深入解释了语法和常见模式。它提供了全面的参考材料和示例。

以太坊的官方网站提供工具、教程、文档、开发者资源和社区支持。

结论

学习Solidity编程对区块链开发者来说是一项关键技能。随着使用它的区块链生态系统的日益增长,对Solidity开发者的需求也在增加。

为了增强你的Solidity技能,可以尽快加入区块链集训营的课程。这将为你在区块链开发中开启职业生涯。

  • 原文链接: cyfrin.io/blog/what-is-s...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
cyfrin
cyfrin
Securing the blockchain and its users. Industry-leading smart contract audits, tools, and education.