合约语言 笔记合集

简介 本文件为 Code Language 的简要说明,面向 Web3 开发者与学习者,概述 Solana 与 Ethereum 两大生态中常见的合约语言及其基本用途与特点。内容以技术介绍为主,强调实际开发中的可理解性与参考价值,适合作为项目仓库或学习笔记中的快速查阅文档 Ethereum 以太坊生态的合约开发语言丰富,从高级语言到中间/低级语言都有对应工具链。下面按常见度与用途列出 Solidity 定位:以太坊主流高级语言(类似 JS/Java 风格),最广泛使用的智能合约语言 特点: 面向合约、支持继承、接口、事件、ABI 自动化 丰富生态(Truffle/Hardhat/Foundry 等工具链) 优点: 开发门槛低、资料与示例丰富、主网项目多 示例: // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Counter { uint256 public count; function inc() public { count += 1; } } Vyper 定位:以 Python 风格设计的以太坊合约语言,追求简洁与安全性(避免复杂特性) 特点: 语法更接近 Python,但只用于合约开发(不是通用 Python) 有意减少语言特性以降低易错面(例如限制继承、复杂抽象) 优点: 更可预测、审计面更小,适合对安全性要求高的合约。 示例(概念): count: public(uint256) @external def inc(): self.count += 1 Yul 👉 Yul 使用指南 定位:EVM 的中间表示(IR),Solidity 等编译器可输出 Yul,用于更精细的优化与跨 EVM 后端(例如 EVM + ewasm)。 特点: 更低级但仍比纯汇编更结构化,适合做跨编译器优化与手写热路径 用途: ...

January 16, 2024 · 2 min · 239 words · Guangyang Zhong

Huff CLI

简介 虽然多数时候您会在Foundry项目中使用foundry-huff库来编译Huff合约,但编译器自带的CLI提供了一些额外的配置选项和有用的工具 选项 `huffc 0.3.0` 用纯Rust构建的Huff语言编译器 使用格式: `huffc [选项] [路径] [子命令]` 参数: `<路径>` 要编译的合约(一个或多个) 选项: `-a`, `--artifacts` 是否生成产物文件 `-b`, `--bytecode` 生成并记录字节码 `-c`, `--constants <常量>...` 为编译环境覆盖/设置常量 `-d`, `--output-directory <输出目录>` 输出目录 [默认: ./artifacts] `-g`, `--interface [<接口>...]` 为Huff产物文件生成Solidity接口 `-h`, `--help` 打印帮助信息 `-i`, `--inputs <输入参数>...` 构造函数输入参数 `-n`, `--interactive` 交互式输入构造函数参数 `-o`, `--output <输出>` 输出文件路径 `-r`, `--bin-runtime` 生成并记录运行时字节码 `-s`, `--source-path <源路径>` 合约的源路径 [默认: ./contracts] `-v`, `--verbose` 详细输出 `-V`, `--version` 打印版本信息 `-z`, `--optimize` 优化编译 [开发中] 子命令: `help` 打印此信息或给定子命令的帮助信息 `test` 测试子命令 -a 生成产物文件 传递 -a 标志将在 ./artifacts 目录或 -d 标志指定的位置生成产物JSON文件。该JSON文件包含以下信息: File(文件名) Path(路径) Source(源代码) Dependencies(依赖项) Bytecode(字节码) Runtime Bytecode(运行时字节码) Contract ABI(合约ABI) 示例: ...

May 16, 2025 · 2 min · 235 words · Guangyang Zhong

Huff 使用指南

简介 Huff 是一种低级编程语言,专为在以太坊虚拟机(EVM)上开发高性能、优化程度极高的智能合约而设计。Huff 不隐藏 EVM 的内部机制,而是将其编程堆栈暴露给开发者,以便进行手动操作和精细控制 Huff 最初由 Aztec Protocol 团队创建,用于编写 Weierstrudel,这是一个链上椭圆曲线算术库,要求代码极度优化,而 Solidity 和 Yul 都无法满足这种性能需求 虽然 EVM 专家可以使用 Huff 编写适用于生产环境的高效智能合约,但它也可以作为初学者学习 EVM 工作原理的一种方式 👉 Huff 详细使用示例 安装 Huff 编译器是用 Rust 开发的,旨在提供高性能的 Huff 代码编译体验 安装方式与 Foundry 类似 运行命令安装 Huffup: curl -L get.huff.sh | bash 注意事项: 该命令会安装 huffup 可执行文件,但不一定会自动添加到系统路径 如果出现以下错误: huffup: command not found 请执行: source ~/.bashrc # 或者 source ~/.zshrc 或者直接打开一个新的终端窗口 安装完成并在路径中可用后,运行: huffup 即可安装最新稳定版本的 huffc(Huff 编译器) Windows 用户:从源码构建 安装 Rust 工具链: 下载并运行 rustup-init 会在控制台启动安装 如果遇到错误,可能缺少 VS Build Tools,请下载安装 ...

May 16, 2025 · 2 min · 244 words · Guangyang Zhong

Huff 详细使用示例

简介 Huff by Example 旨在详细解释 Huff 语言的各项特性,并通过代码示例说明每个特性的使用方法、使用时机、使用场景以及设计目的。文中的代码片段附有丰富注释,但本节假设读者对 EVM 有一定基础 定义接口 (Defining your Interface) 在 Huff 中定义接口不是必需的步骤,但可以为以下两个目的使用: 作为 __FUNC_SIG 和 __EVENT_HASH 内置函数的参数 生成 Solidity 接口 / 合约 ABI 说明: 函数类型:可以是 view、pure、payable 或 nonpayable 函数接口:仅建议为外部可调用函数定义 事件(Events):可以包含索引值(indexed)和非索引值(non-indexed) 示例: #define function testFunction(uint256, bytes32) view returns (bytes memory) #define event TestEvent(address indexed, uint256) testFunction:定义了一个接受 uint256 和 bytes32 参数的只读函数,返回 bytes 类型 TestEvent:定义了一个事件,包含一个索引地址和一个 uint256 参数 常量 (Constants) 在 Huff 合约中,常量不会存储在合约的 storage 中,而是在编译时即可在合约内调用 常量可以是以下两种类型: 字节(bytes):最大 32 字节 FREE_STORAGE_POINTER:表示合约中未使用的存储槽(storage slot) 使用方法: ...

May 16, 2025 · 7 min · 1410 words · Guangyang Zhong

Yul 使用指南

简介 Yul(早期称为 JULIA 或 IULIA)是一种中间语言,可编译到多种后端,包括: Ethereum Virtual Machine (EVM) 1.0 EVM 1.5 计划支持的 eWASM 它旨在作为这些平台的通用标准。Yul 已经可以在 Solidity 中作为 内联汇编 使用,未来 Solidity 编译器甚至可能将 Yul 用作默认的中间语言。Yul 的设计也使得为其构建高级优化器变得容易 核心特性: 核心组件 函数(function) 代码块(block) 变量(variable) 字面量(literal) 循环(for) 条件语句(if / switch) 表达式与变量赋值 强类型系统 变量和字面量必须带类型前缀 支持类型:bool, u8, s8, u32, s32, u64, s64, u128, s128, u256, s256 操作符与内置函数 Yul 本身不提供操作符 对于 EVM,操作码(opcode)作为内置函数提供 如果后端平台不同,可以重新实现这些函数 示例: 递归实现 { function power(base:u256, exponent:u256) -> result:u256 { switch exponent case 0:u256 { result := 1:u256 } case 1:u256 { result := base } default: { result := power(mul(base, base), div(exponent, 2:u256)) switch mod(exponent, 2:u256) case 1:u256 { result := mul(base, result) } } } } 循环实现 { function power(base:u256, exponent:u256) -> result:u256 { result := 1:u256 for { let i := 0:u256 } lt(i, exponent) { i := add(i, 1:u256) } { result := mul(result, base) } } } 注:循环实现依赖 EVM 的 lt 和 add 操作码。 ...

February 16, 2025 · 8 min · 1552 words · Guangyang Zhong