本文是学习solidity语法中随手记录的一些注意点,杂乱无章,不合适学习使用,仅供自己参考!
memory:临时使用,超过作用域就会被系统回收。
storage:储存在区块链上,永久储存。
函数参数及其返回值默认在memory中,合约中的公有变量默认是在storage
pragma solidity >=0.4.22 <0.6.0;
contract constantViewPure{
string name;
uint public age;
constructor() public{
name = "liushiming";
age = 29;
}
function getAgeBy() public returns(uint){
age += 1; //可以通过
return age; // return 30,但是!状态变量age的值不会改变,仍然为29!
}
function getAgeByView() public view returns(uint){
age += 1; //报错,并不能通过
return age; // return 30,但是!状态变量age的值不会改变,仍然为29!
}
function getAgeByPure() public pure returns(uint){
return age; //编译报错!pure比view还要严格,pure完全禁止读写状态变量!
}
}
注意:新语法中public或private 属性必须要写,否则报错!
一个没有定义一个回退函数的合约。如果接收ether,会触发异常,并返还ether(solidity v0.4.0开始)。所以合约要接收ether,必须实现回退函数。
注意:必须制定类型为external !
①错误处理尽量使用requite,失败会返回gas。
function getUser()public view returns(string){
// 错误处理
// assert(bool condition): 如果条件不满足,则抛出 - 用于内部错误。
// require(bool condition): 如果条件不满足,则抛出 - 用于输入或外部组件中的错误。
// revert(): 中止执行并恢复状态更改
//方法一:(这种会消耗gas)
// if(msg.sender!=manager){
// throw;
// }
//方法二:require 一般地,尽量使用 require 函数
require(msg.sender==manager);
//方法三:assert(这种会消耗gas)
//assert(msg.sender==manager);
//方法四:revert
if(msg.sender!=manager){
revert();
}
return "我们3213665";
}
②this:
需要显示调用: address(this) ,当前合约地址。
address(this) .balance 余额。
③销毁合约:selfdestruct(msg.sender)
④数学计算:
addmod(int a,int b,int c): 计算(a+b)%c 的值。(%是取模)
mulmod(int a,int b,int c): 计算(a*b)%c 的值。(%是取模)
keccak256:散列运算。用来获取随机数.
(keccak256(now,msg.sender,a) 新版本报错,不知何故!?
①合约中必须有下面函数,否则报错
function()external payable{
}
②通过合约地址转账
The address type was split into address and address payable, where only address payable provides the transfer function.
大意是:address类型包括 into address和 address payable类型,只有address payable类型可以完成transfer或send操作。
因此,需要声明成 address payable 类型才可。
当定义的事件触发时,我们可以将事件存储到EVM的交易日志中,日志是区块链中的一种特殊数据结构。日志与合约关联,与合约的存储合并存入区块链中。只要某个区块可以访问,其相关的日志就可以访问。
event transfer(address indexed _from, address indexed _to, uint indexed value);
Indexed属性
可以在事件参数上增加indexed
属性,最多可以对三个参数增加这样的属性。加上这个属性,可以允许你在web3.js中通过对加了这个属性的参数进行值过滤,方式如下[event]:
var event = myContract.transfer({value: "100"});
上面实现的是对value
值为100
的日志,过滤后的返回。
记住:call是调用remix环境中红色函数的,send是调用remix环境中蓝色函数的!
获取返回值的时候用call,否则用send。send返回的是一个交易的hash。
①public与private
对于public和private,相信学过其他主流语言的人都能明白:
②external和internal
除 public 和 private 属性之外,Solidity 还使用了另外两个描述函数可见性的修饰词:internal(内部) 和 external(外部)。
注意:internal、private、external、public这4种关键字都是可见性修饰符,互不共存