03_函数、事件与日志

在这里插入图片描述


函数(Function Types)

函数概念

  1. 在Solidity中函数是一种特殊数据类型(值类型)
  2. 还可以将一个函数作为参数进行传递。
  3. 也可以在函数调用中返回一个函数。
  4. 函数名本质就是这段语句块在内存中的地址。

函数格式定义 (重点)

function () {internal(默认)|external} [constant] [payable] [returns ()]

  1. 函数分为两大类:internal、external与Java的访问修饰符非常相似,其中private (当前函数内部调用)、internal (当前函数和子函数)、public (内外都可以调用)、external(仅仅外部调用)。
  2. 在5.0以后版本,函数必须要指定访问修饰符。
  3. 在5.0以后版本,contant已经被view、pure取代。
  4. Solidity普通的函数支持多态,但构造函数不支持。

函数格式测试

pragma solidity >=0.6.1 <0.7.0;

// function (<parameter types>) {public private internal(默认)|external} [view|pure] [payable] [returns (<return types>)]
// 合约的函数支持多态(函数名称相同,参数类型或者数量不同)
contract FnDemo{
    
    string _name;  // 引用类型 + storage
    uint _age; // 值类型不存在Data Location
    
    // 构造函数,合约在部署时自动调用,一般用来初始化状态变量
    constructor(string memory name,uint age) public{
        _name = name;
        _age =age;
    }
   
    // private 仅仅在合约内部使用
    // constant 0.4的版本使用,没有修改状态变量时可以设置,0.5版本使用View,Pure代替
    // view: 对状态变量(storage),只读但是不能写
    function getAll() private view returns (string storage,uint){
        return (_name,_age);
    }
    
    // public: 公共函数(当前、其它、继承的子合约都能调用), 如果参数引用类型必须设置内存变量memory
    // pure: 对状态变量不可读也不可写
    function getAll(string memory name,uint age) public pure returns (string memory,uint){
         return (name,age+1);
    }
    
    // internal 受保护的函数,只能当前合约或者子合约调用
    // payable: 说明此方法有转账的操作
    function getAll(string storage name) internal{
         getAll();  // 调用自己的private合约
    } 
}

事件与日志 (重点)

事件与日志的意义

  1. 事件是以太坊EVM提供的一种基础设施,事件可以用来操作记录,存储为日志。
  2. 一种区块链中的特殊数据结构。 这些日志与地址相关联,被并入区块链中,(区块 --> 交易地址 --> 交易日志)。
  3. Solidity没有print,console.log方法,因此增加了调试的难度,我们可以采用实事件 + 日志来解决。
  4. 总的来说:事件强调功能,可以触发是一种行为,而日志强调存储。

创建事件且调用产生日志

pragma solidity >=0.6.1 <0.7.0;

contract LogTest{
    // 事件名称采用驼峰命名法
    event LogData(string,uint);
    
    event LogData(string,string);
    
    function show(string memory name,uint age) public{
        age = age + 1;// 此处实现业务操作
        emit LogData(name,age);
    }
    
    function show(string memory name,string memory age) public{
        emit LogData(name,age);
    }
}

查看控制台日志

Event支持多态,且采用的是大驼峰命名法(第一个字母大写),而普通函数采用的是小驼峰命名法(第一个字母小写)

在这里插入图片描述

发布了130 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/lsqzedu/article/details/104637727