区块链学习笔记04-Solidity基础语法随手记

本文是学习solidity语法中随手记录的一些注意点,杂乱无章,不合适学习使用,仅供自己参考!

1.变量的定义和使用

区块链学习笔记04-Solidity基础语法随手记_第1张图片

区块链学习笔记04-Solidity基础语法随手记_第2张图片

区块链学习笔记04-Solidity基础语法随手记_第3张图片

2.Memory与storage存储数据的区别

memory:临时使用,超过作用域就会被系统回收。

storage:储存在区块链上,永久储存。

函数参数及其返回值默认在memory中,合约中的公有变量默认是在storage

区块链学习笔记04-Solidity基础语法随手记_第4张图片

区块链学习笔记04-Solidity基础语法随手记_第5张图片

区块链学习笔记04-Solidity基础语法随手记_第6张图片

3.函数的声明和使用

区块链学习笔记04-Solidity基础语法随手记_第7张图片

区块链学习笔记04-Solidity基础语法随手记_第8张图片

区块链学习笔记04-Solidity基础语法随手记_第9张图片

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 属性必须要写,否则报错!

4.Fallback函数(回退函数):

一个没有定义一个回退函数的合约。如果接收ether,会触发异常,并返还ether(solidity v0.4.0开始)。所以合约要接收ether,必须实现回退函数。

注意:必须制定类型为external !

5.内置函数

①错误处理尽量使用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)  新版本报错,不知何故!?

区块链学习笔记04-Solidity基础语法随手记_第10张图片

6.关于付款转账

①合约中必须有下面函数,否则报错

 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 类型才可。

7.事件 event

当定义的事件触发时,我们可以将事件存储到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的日志,过滤后的返回。

8.web3.js中send和call区别

记住:call是调用remix环境中红色函数的,send是调用remix环境中蓝色函数的!

获取返回值的时候用call,否则用send。send返回的是一个交易的hash。

9.internal、private、external、public区别

①public与private
对于public和private,相信学过其他主流语言的人都能明白:

  • public修饰的变量和函数,任何用户或者合约都能调用和访问。
  • private修饰的变量和函数,只能在其所在的合约中调用和访问,即使是其子合约也没有权限访问。

②external和internal
除 public 和 private 属性之外,Solidity 还使用了另外两个描述函数可见性的修饰词:internal(内部) 和 external(外部)。

  • internal private 类似,不过, 如果某个合约继承自其父合约,这个合约即可以访问父合约中定义的“内部”函数。
  • externalpublic 类似,用于接口。只不过这些函数只能在合约之外调用 - 它们不能被合约内的其他函数调用。

注意:internal、private、external、public这4种关键字都是可见性修饰符,互不共存

 

 

你可能感兴趣的:(区块链)