:2026-02-16 2:24 点击:1
在区块链技术的浪潮中,以太坊(Ethereum)以其“可编程区块链”的定位,超越了单纯的数字货币功能,成为去中心化应用(DApps)的底层基础设施,而智能合约(Smart Contract)作为以太坊的灵魂,是一段部署在区块链上、自动执行合约条款的代码——它无需中介信任,一旦部署便不可篡改,彻底改变了传统合约的执行逻辑,本文将带你走进以太坊智能合约的世界,从核心概念到编写实践,一步步揭开“代码即法律”的神秘面纱。
比特币通过区块链实现了点对点的价值转移,而以太坊则通过引入“智能合约”功能,让区块链能够承载更复杂的逻辑,其核心创新在于“以太坊虚拟机”(EVM,Ethereum Virtual Machine)——一个全球分布的、图灵完备的虚拟机,任何开发者都能在EVM上运行智能合约,确保代码在以太坊网络中按规则执行,以太坊的原生加密货币“以太”(ETH)不仅作为交易媒介,更成为智能合约执行时的“燃料”(Gas),支付计算和存储成本。
智能合约的概念最早由密码学家尼克·萨博在1994年提出,而以太坊将其真正落地,智能合约是一段以代码形式存储在区块链上的协议,当预设条件被触发时,合约会自动执行约定的操作(如转账、数据存储、调用其他合约等),它的核心特性包括:自治性(无需人工干预)、不可篡改性(部署后代码固定)、透明性(所有交易公开可查)和自动执行(条件满足即触发)。
以太坊智能合约的编写主要基于Solidity语言——一种专为智能合约设计的、类似JavaScript的高级编程语言,

Hello.sol(Solidity文件后缀为.sol); 8.20); Solidity的语法借鉴了C++和JavaScript,但针对区块链特性进行了优化,以下为编写智能合约必须掌握的基础语法:
// SPDX-License-Identifier: MIT // 指定许可证,必填
pragma solidity ^0.8.20; // 指定Solidity版本
contract HelloWorld {
// 状态变量:存储在区块链上的数据,永久保存
string public greeting; // public关键字自动生成getter函数
uint256 public count; // uint256表示无符号256位整数
// 构造函数:合约部署时执行一次,用于初始化状态变量
constructor(string memory _greeting) {
greeting = _greeting;
count = 0;
}
}
函数是智能合约中执行操作的最小单元,可定义访问权限、修饰符和参数:
// 修改greeting
function setGreeting(string memory _newGreeting) public {
greeting = _newGreeting;
}
// 获取当前greeting(public已自动生成,此处可省略getter)
function getGreeting() public view returns (string memory) {
return greeting;
}
// 增加count
function increment() public {
count += 1;
}
// 函数修饰符:限制函数调用条件
modifier onlyOwner() {
require(msg.sender == owner, "Not the owner"); // 要求调用者为合约所有者
_; // 执行函数主体
}
// 带修饰符的函数:仅所有者可调用
function resetCount() public onlyOwner {
count = 0;
}
uint, int, bool, address等):直接存储数据,传递时复制副本; string, array, struct, mapping):存储数据指针,修改会影响原数据。 msg.sender:调用当前函数的地址; msg.value:调用时发送的ETH数量(单位:wei,1 ETH = 10^18 wei); address(this):当前合约地址。通过一个“投票合约”案例,巩固Solidity语法与合约逻辑设计,合约功能:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract Voting {
// 投票选项结构体
struct Option {
string name;
uint256 voteCount;
}
// 状态变量
Option[] public options; // 动态数组存储投票选项
mapping(address => bool) public hasVoted; // 记录地址是否已投票
bool public votingEnded = false; // 投票是否结束
// 构造函数:初始化投票选项
constructor(string[] memory _optionNames) {
for (uint256 i = 0; i < _optionNames.length; i++) {
options.push(Option({
name: _optionNames[i],
voteCount: 0
}));
}
}
// 投票函数
function vote(uint256 _optionIndex) public {
require(!votingEnded, "Voting has ended");
require(!hasVoted[msg.sender], "You have already voted");
require(_optionIndex < options.length, "Invalid option index");
hasVoted[msg.sender] = true;
options[_optionIndex].voteCount += 1;
}
// 结束投票(仅所有者可调用)
function endVoting() public {
require(!votingEnded, "Voting already ended");
votingEnded = true;
}
// 获取选项数量
function getOptionsCount() public view returns (uint256) {
return options.length;
}
}
getOptionsCount()查看选项数量; vote(0)为第一个选项投票(需确保未投票且投票未结束); options(0)查看第一个选项的得票数是否增加。智能合约的不可篡改性意味着一旦部署漏洞,损失难以挽回,历史上,The DAO事件(2016年,600万美元ETH被盗)、Parity钱包漏洞(2017年,1.5亿美元ETH被冻结)等事件,凸显了合约安全的重要性,编写安全合约需遵循以下原则:
mutex变量)。 本文由用户投稿上传,若侵权请提供版权资料并联系删除!