在本节中,我们将讨论如何使用Solidity编写基本的智能合约。课程将涵盖变量、函数和修饰符等基本内容,并以一个简单的代币合约示例来详细介绍实现过程。
变量、函数和修饰符
变量:Solidity包含两种类型的变量:状态变量和局部变量。状态变量永久存储在区块链上,局部变量则是临时的,只存在于函数的作用域内。
函数:函数是智能合约的构建块,用于执行特定任务,如创建交易和执行自定义逻辑。函数可以有输入参数和返回值,从而实现更大的自定义性和灵活性。
修饰符:修饰符是Solidity所独有的,用于修改函数的行为。修饰符可以提高代码的可读性和可管理性,并可用于验证传入值或有条件地执行被调用的函数。 示例1:实现一个简单的代币合约
我们用Solidity来创建一个简单的代币合约,允许用户在多个账户之间转移代币并查看任一账户的代币余额。
TypeScript
pragma solidity ^0.8.0;
contract SimpleToken {
// Declare state variables
address public owner;
mapping(address => uint256) public balances;
// Initialize the token contract
constructor(uint256 initialSupply) {
owner = msg.sender;
balances[owner] = initialSupply;
}
// Function to transfer tokens
function transfer(address to, uint256 amount) public {
require(balances[msg.sender] >= amount, "Insufficient balance");
balances[msg.sender] -= amount;
balances[to] += amount;
}
// Function to check the token balance of an account
function balanceOf(address account) public view returns (uint256) {
return balances[account];
}
}
该合约包含:
状态变量owner 和 balances,分别用于存储合约所有者的地址和所有地址的代币余额。
一个constructor构造函数,用于设置代币的初始供应并将其分配给合约所有者。
一个transfer函数,允许用户将代币转移到其他账户。它使用require语句来确保发送者有足够的代币可以转移。
一个balanceOf函数,用于返回指定帐户的代币余额。
这一基本的代币合约演示了如何在Solidity中使用变量、函数和修饰符来创建一个简单实用的智能合约。 示例2:实现简单的投票系统
TypeScript
pragma solidity ^0.8.0;
contract VotingSystem {
mapping (bytes32 => uint256) public votesReceived;
bytes32[] public candidateList;
constructor(bytes32[] memory candidateNames) {
candidateList = candidateNames;
}
function voteForCandidate(bytes32 candidate) public {
require(validCandidate(candidate), "Invalid candidate.");
votesReceived[candidate] += 1;
}
function totalVotesFor(bytes32 candidate) public view returns (uint256) {
require(validCandidate(candidate), "Invalid candidate.");
return votesReceived[candidate];
}
function validCandidate(bytes32 candidate) public view returns (bool) {
for (uint256 i = 0; i < candidateList.length; i++) {
if (candidateList[i] == candidate) {
return true;
}
}
return false;
}
}
在此示例中,VotingSystem合约允许用户通过调用voteForCandidate函数为候选人投票。合约使用voteForCandidate映射统计每个候选人收到的票数,统计基于候选人的名称,值则是票数。CandateList变量存储有效候选人列表。可以调用totalVotesFor函数来查看特定候选人获得的票数,并通过validCandidate函数检查候选人是否有效。通过这一示例,我们学习了如何使用Solidity构建具有复杂逻辑的去中心化应用。
要点
免责声明
* 投资有风险,入市须谨慎。本课程不作为投资理财建议。
* 本课程由入驻 Gate Learn 的作者创作,观点仅代表作者本人,绝不代表 Gate Learn 赞同其观点或证实其描述。