函数(Function Types)
函数概念
- 在Solidity中函数是一种特殊数据类型(值类型)
- 还可以将一个函数作为参数进行传递。
- 也可以在函数调用中返回一个函数。
- 函数名本质就是这段语句块在内存中的地址。
函数格式定义 (重点)
function () {internal(默认)|external} [constant] [payable] [returns ()]
- 函数分为两大类:internal、external与Java的访问修饰符非常相似,其中private (当前函数内部调用)、internal (当前函数和子函数)、public (内外都可以调用)、external(仅仅外部调用)。
- 在5.0以后版本,函数必须要指定访问修饰符。
- 在5.0以后版本,contant已经被view、pure取代。
- 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合约
}
}
事件与日志 (重点)
事件与日志的意义
- 事件是以太坊EVM提供的一种基础设施,事件可以用来操作记录,存储为日志。
- 一种区块链中的特殊数据结构。 这些日志与地址相关联,被并入区块链中,(区块 --> 交易地址 --> 交易日志)。
- Solidity没有print,console.log方法,因此增加了调试的难度,我们可以采用实事件 + 日志来解决。
- 总的来说:事件强调功能,可以触发是一种行为,而日志强调存储。
创建事件且调用产生日志
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支持多态,且采用的是大驼峰命名法(第一个字母大写),而普通函数采用的是小驼峰命名法(第一个字母小写)