First App

前文介绍了什么是 Solidity、Solidity 的合约结构以及如何使用Remix IDE开发和测试智能合约。

在前文的例子里,合约只是简单的输出“Hello, world!”,我们无法与合约进行更多的交互。现在我们编写一个稍微复杂的合约,该合约实现加减操作:

  • get():获取当前变量的值
  • addition():变量+1
  • subtraction():变量-1
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;

contract Counter{

    // 定义了一个状态变量,将会存储在链上
    // public表示该变量在合约外是看查看的
    int256 public count;

    // 查询链上当前的值
    // 因为需要从链上查询,所以需要使用 view
    // 如果不存链上查询,可以使用 pure 
    function get() public view returns(int256){
        return count;
    }

    // 每调用一次,count+1
    function addition() public {
        count += 1;         
    }

    // 每调用一次,count-1
    function subtraction() public {
        count -= 1;        
    }

}

合约说明:

  1. // SPDX-License-Identifier: MIT: 这不是Solidity的关键字,而是文件顶部的版权许可声明。它指定了使用哪个开源许可。在这个例子中,使用的是MIT许可。
  2. pragma solidity ^0.8.24;: pragma用来声明Solidity编译器的版本号。^表示适用指定发布版本及补丁版本。在这个例子中,编译器版本设定的是0.8.24。
  3. contract: 这是用来声明智能合约的关键字。所有在括号 {}中的代码组成了合约的主题。在这个例子中,合约的名字是Counter
  4. int256: 这是Solidity的一个数据类型,代表256位整数。在这个例子中,count被声明为int256类型。
  5. public: 这是一个可见性修饰符。在这个例子中,它表明count变量和下面的函数可以在合约外部被访问。
  6. function: 这是用来声明合约内的函数的关键字。在这个例子中,它被用来声明get, additionsubtraction函数。
  7. view: 这是一个函数状态修饰符,表示这个函数不会修改合约的状态变量。在这个例子中,它应用于get函数。
  8. returns: 这个关键字用于声明函数返回的变量类型。在这个例子中,get函数返回一个int256类型的数。
  9. +=-=: 这是算数运算符,用于增加或减少变量的值。在这个例子中,它们分别在additionsubtraction函数中被用来改变count值。

扩展知识

可见性修饰符

在Solidity中,有四种函数可见性修饰符:

  1. public :公开的,可以在合约内外部调用。这是默认的修饰符。
  2. private :私有的,只能在当前合约内部调用,不能通过其他合约或者transaction调用。
  3. internal :内部的,与 private 类似,只能在当前合约或继承此合约的合约中调用,但不能通过transaction调用。
  4. external :外部的,只能在合约外部(通过transaction或者使用this.function方式)调用。

选择合适的可见性修饰符可以帮助优化智能合约的gas消耗。具体来说,external修饰的变量比public更便宜,因为其跳过了一些可能导致的内部函数调用的复制操作。然而,如果一个函数被定义为external,那它不能在合约内被其他函数调用

此外,状态变量,示例中的count,也有其自己的可见性:

  • public :公开的。对于公开的状态变量,Solidity将自动创建一个getter函数,使得外部可以访问此状态变量的值。
  • private :私有的。只有当前合约可以访问该状态变量。
  • internal :内部的。只能在当前合约或继承此合约的合约中访问该状态变量。

这些可见性修饰符都可以帮助你更好地管理合约的权限和数据安全。

函数状态修饰符

在Solidity中,函数状态修饰符用于更改或调整函数的行为。以下是在Solidity中可用的状态修饰符:

  1. pure: 这种修饰符提醒读者该函数不会尝试读取或改变状态。也就是说,该函数不会读取或修改合约的状态。
  2. view: 这种修饰符告诉阅读者该函数不会尝试修改状态。也就是它不会修改合约的状态,但它可以读取当前合约的状态信息。
  3. payable: 这种修饰符允许函数接收以太币。如果一个函数被声明为可付费的,那么当调用它时可以附带以太币值。
  4. nonpayable: 这是默认的修饰符,表示函数不能接收以太币。
  5. revert: 此修饰符与assert类似,也会终止并回滚所有改变,但是,revert将不消耗所有剩余的gas,而assert会消耗所有的gas。

除了这些,还有一些自定义的状态修饰符可以用于实现特定的功能。比如,一些合约可能会定义一个只有所有者可以执行的状态修饰符,称为”onlyOwner”。这些自定义修饰符的用法可以根据具体的应用场景和需求来调整。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。

Author: mengbin

blog: mengbin

Github: mengbin92

cnblogs: 恋水无意

腾讯云开发者社区:孟斯特