:2026-03-07 0:36 点击:5
以太坊作为全球领先的智能合约平台,不仅仅是一种加密货币,更是一个去中心化的世界计算机,为构建去中心化应用(DApps)提供了强大的基础设施,而智能合约,正是以太坊生态系统的核心,本文将带你快速入门以太坊智能合约,从基本概念到动手实践,开启你的Web3之旅。
智能合约是运行在以太坊区块链上的、自动执行的程序,你可以把它理解为一个“数字合同”或“自动执行的协议”,它包含了双方或多方约定的规则和条款,当预设的条件被满足时,合约会自动执行约定的操作,无需任何中心化机构的干预。
智能合约的关键特性:
以太坊智能合约最常用的编程语言是 Solidity,它是一种静态类型、面向合约的高级编程语言,语法类似于 JavaScript、C++ 和 Python,专门为编写智能合约而设计。
在开始编写智能合约之前,你需要准备以下工具:
remix.ethereum.org 即可使用。
让我们通过一个简单的投票合约来学习 Solidity 的基本语法和合约结构。
步骤 1:在 Remix IDE 中创建新文件
打开 Remix IDE,在左侧文件面板中,点击 “Create New File”,命名为 Voting.sol。
步骤 2:编写合约代码
在 Voting.sol 文件中,输入以下代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**Voting
* @dev 一个简单的投票合约,允许对多个选项进行投票。
*/
contract Voting {
// 定义一个候选人结构体
struct Candidate {
uint id;
string name;
uint voteCount;
}
// 存储候选人数组
Candidate[] public candidates;
// 存储投票地址,防止重复投票
mapping(address => bool) public hasVoted;
// 构造函数,在合约部署时初始化候选人
constructor() {
addCandidate("Candidate 1");
addCandidate("Candidate 2");
addCandidate("Candidate 3");
}
// 添加候选人的内部函数
function addCandidate(string memory _name) private {
uint id = candidates.length + 1;
candidates.push(Candidate(id, _name, 0));
}
// 投票函数
function vote(uint _candidateId) public {
// 检查该地址是否已经投过票
require(!hasVoted[msg.sender], "You have already voted.");
// 检查候选人ID是否有效
require(_candidateId > 0 && _candidateId <= candidates.length, "Invalid candidate ID.");
// 标记为已投票
hasVoted[msg.sender] = true;
// 增加对应候选人的票数
candidates[_candidateId - 1].voteCount++;
}
// 获取候选人信息
function getCandidates() public view returns (uint[] memory, string[] memory, uint[] memory) {
uint[] memory candidateIds = new uint[](candidates.length);
string[] memory candidateNames = new string[](candidates.length);
uint[] memory voteCounts = new uint[](candidates.length);
for (uint i = 0; i < candidates.length; i++) {
candidateIds[i] = candidates[i].id;
candidateNames[i] = candidates[i].name;
voteCounts[i] = candidates[i].voteCount;
}
return (candidateIds, candidateNames, voteCounts);
}
}
代码解析:
SPDX-License-Identifier 和 pragma solidity:合约的标准头部,指定许可证和 Solidity 编译器版本。contract Voting {}:定义一个名为 Voting 的合约。struct Candidate:定义一个候选人结构体,包含 ID、姓名和票数。Candidate[] public candidates:一个动态数组,用于存储所有候选人,public 关键字会自动生成一个 getter 函数。mapping(address => bool) public hasVoted:一个映射,记录哪个地址已经投过票。constructor():合约的构造函数,在合约部署时执行一次,用于初始化候选人。function addCandidate():内部函数,用于添加候选人。function vote(uint _candidateId) public:核心投票函数。require():用于检查条件,如果不满足则回滚交易并报错。msg.sender:调用当前函数的地址。candidates[_candidateId - 1].voteCount++:增加对应候选人的票数。function getCandidates() public view:获取所有候选人信息及其票数的函数,view 表示读取数据,不修改状态。步骤 3:编译合约
pragma solidity 版本匹配(如 0.8.0)。步骤 4:部署合约
步骤 5:与合约交互
Voting 合约实例。vote(uint _candidateId) 函数,输入候选人 ID(如 1, 2, 3),然后点击 “transact”,在 MetaMask 中确认交易,完成投票。getCandidates() 函数,点击 “call”,可以看到所有候选人的 ID、姓名和当前票数。智能合约一旦部署,其漏洞可能造成不可挽回的损失,安全至关重要:
恭喜你,你已经完成了以太坊智能合约的快速入门!你可以:
本文由用户投稿上传,若侵权请提供版权资料并联系删除!