本文是作者在学习Web3Bridge区块链课程第三周的学习笔记,主要介绍了Web3架构、Solidity编程语言、工厂合约以及Solidity中的继承等概念。内容涵盖了Web3应用架构的核心组件、Solidity的基础知识(包括变量作用域、可见性、数据类型、函数修饰符、错误处理)、数据存储位置(Storage、Memory、Stack)、工厂模式的实现方式,以及Solidity中继承的优点。
在 Web3Bridge 学习区块链的第三周,我们学习了 Web3 架构、Solidity、工厂合约以及 Solidity 中的继承。
核心架构差异:
关键组件:
前端
区块链层
Web3 应用中的基础设施
数据读取方法
扩展解决方案
ABI 充当接口,使外部应用程序能够与区块链上的智能合约进行通信。它类似于 Web 开发中的 API,但可将高级语言调用转换为 EVM 可读的字节码。它通常是一个 JSON RPC 文件,其中包含方法签名和数据类型。
Solidity 是一种面向对象的编程语言,受 C++、JavaScript 和 Python 的影响。Solidity 通常将人类可读的代码编译为机器可读的代码,称为字节码,该字节码在以太坊虚拟机 (EVM) 上运行。此字节码将被部署并存储在 EVM 或其他与 EVM 兼容的机器上。Solidity 用于编写智能合约。
Solidity 的组成部分
- 第一条注释,它是一条机器可读的行(// SPDX-License-Identifier: MIT),用于指定涵盖该代码的许可。
- pragma 指令通常是任何 Solidity 文件中的第一行代码。Pragma 是一条指令,它告诉编译器应使用哪个编译器版本将人类可读的 Solidity 代码转换为机器可读的字节码。
- 分号在 Solidity 中必不可少。
- 合约
- 函数,即可执行代码。
智能合约中的变量作用域
智能合约中有三个变量作用域
- 状态变量:这些变量在智能合约中存储永久数据。它们位于合约内部但函数外部
- 局部变量:这些变量保存数据的时间非常短,通常在计算期间。它们位于函数内部,无法在函数外部访问
- 全局变量:这些变量和函数由 Solidity“注入”到你的代码中,无需从任何地方专门创建或导入它们即可使用。它们提供有关代码运行的区块链环境的信息,还包括用于程序中一般用途的实用程序函数。
可见性类型
- 公共函数和变量可以在合约内部、外部、其他智能合约和外部帐户中访问。
- 私有函数和变量只能在其声明的智能合约中访问。
- 内部可见性类似于私有可见性,因为内部函数和变量只能从声明它们的合约中访问。
- 外部可见性说明符不适用于变量——只有函数可以指定为外部。
构造函数
它是一种特殊类型的函数,仅在合约创建时执行一次。它不包含在最终部署的字节码中。
免费加入 Medium 以获取这位作者的更新。
存在抽象合约和接口合约
Solidity 数据类型
- 值类型:包括 uint、int、addresses、booleans、fixed size bytes
- 引用类型: 包括固定大小数组、动态大小数组、字节数组、复合结构和映射。
结构体 是具有一个或多个属性或属性的数据片段,用于指定每个属性的数据类型和名称。
函数修饰符
修饰符是一段代码,可以在运行主函数之前或之后自动运行。修饰符也可以从父合约继承。
Solidity 中的错误处理
Solidity 中有三种处理错误的方法
- require() 函数 用于验证输入、验证返回值以及在继续执行代码逻辑之前检查其他条件。
- assert() 函数 与 require() 非常相似,只不过它抛出类型为 Panic(uint256) 的错误,而不是 Error(string)。
- revert() 调用 的使用情况与 require() 相同,但当条件逻辑更加复杂时。
它是用于状态变量的永久区块链存储。它具有一个键值存储,其中包含 256 位键和值。由于网络共识要求,它是最昂贵的。它是一个合约状态,必须在函数调用之间保持不变
这是函数执行期间的临时存储。它在函数启动时创建,在函数结束时销毁。它比存储便宜。它用于临时变量和函数参数。
它是 EVM 计算区域。它具有 1024 个项目的容量,每个项目 256 位。它是一种基于堆栈的计算(不是基于寄存器的计算)。它用于在计算期间存储中间值。
工厂合约 是一种创建和管理其他合约的多个实例的合约。 它类似于传统编程中的工厂模式
优点
contract Factory {
address[] public deployedContracts;
function createContract() public {
address newContract = address(new ChildContract());
deployedContracts.push(newContract);
}
}
delegatecall
在主合约上下文中执行函数继承是面向对象编程 (OOP) 中的一个强大概念。推理编程中继承的最佳方式是将其视为代码片段通过导入和嵌入从其他代码片段“继承”数据和函数的方式。
Solidity 中的继承还允许开发人员访问、使用和修改从继承的合约的属性(数据)和函数(行为)。
继承的优点
代码重用:继承有助于方便和广泛的代码重用。想象一下,一系列应用程序代码从其他代码继承,而这些代码又从其他代码继承,依此类推。
模块化:允许将复杂的合约分解为更小、更易于管理的组件
可升级性:为创建可升级的合约模式奠定了基础
DRY 原则:遵循“不要重复自己”的原则,允许将通用功能编写一次并继承
- 原文链接: blog.blockmagnates.com/w...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!