レッスン3

编写基本智能合约

在第三课中,您将通过实践了解如何编写基本的智能合约。本课将涵盖变量、函数和修饰符等基本概念,并以实现一个简单的代币合约举例说明。

在本节中,我们将讨论如何使用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];
    }
}

该合约包含:

  • 状态变量ownerbalances,分别用于存储合约所有者的地址和所有地址的代币余额。
  • 一个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构建具有复杂逻辑的去中心化应用。

要点

  • 变量、函数和修饰符是Solidity智能合约的重要组成部分。
  • Solidity有两种类型的变量:状态变量和局部变量。
  • 函数用于执行任务,可以有输入参数和返回值。
  • 修饰符用于修改函数的行为,提高代码的可读性和可管理性。
  • SimpleToken合约允许用户转移代币并查看代币余额。
  • SimpleToken合约演示了状态变量、构造函数以及transfer和balanceOf等函数的使用。
  • VotingSystem合约允许用户为候选人投票并统计投票数。
  • VotingSystem合约展示了映射、数组和voteForCandidate、totalVotesFor和validCandidate等函数的使用方法。
免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。
カタログ
レッスン3

编写基本智能合约

在第三课中,您将通过实践了解如何编写基本的智能合约。本课将涵盖变量、函数和修饰符等基本概念,并以实现一个简单的代币合约举例说明。

在本节中,我们将讨论如何使用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];
    }
}

该合约包含:

  • 状态变量ownerbalances,分别用于存储合约所有者的地址和所有地址的代币余额。
  • 一个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构建具有复杂逻辑的去中心化应用。

要点

  • 变量、函数和修饰符是Solidity智能合约的重要组成部分。
  • Solidity有两种类型的变量:状态变量和局部变量。
  • 函数用于执行任务,可以有输入参数和返回值。
  • 修饰符用于修改函数的行为,提高代码的可读性和可管理性。
  • SimpleToken合约允许用户转移代币并查看代币余额。
  • SimpleToken合约演示了状态变量、构造函数以及transfer和balanceOf等函数的使用。
  • VotingSystem合约允许用户为候选人投票并统计投票数。
  • VotingSystem合约展示了映射、数组和voteForCandidate、totalVotesFor和validCandidate等函数的使用方法。
免責事項
* 暗号資産投資には重大なリスクが伴います。注意して進めてください。このコースは投資アドバイスを目的としたものではありません。
※ このコースはGate Learnに参加しているメンバーが作成したものです。作成者が共有した意見はGate Learnを代表するものではありません。