天天看點

solidity階段性總結

1、solidity中最好不要使用var,使用let,const進行代替。

2、msg.sender,msg.value

pragma solidity ^0.4.24;

contract Foo06{
    address public owner;
    uint256 a;
    
    constructor() public{
        owner=msg.sender;
    }
    
}      

由于構造函數隻執行一次,是以owner裡面的值隻會被指派一次,即owner裡面永遠都是第一次執行構造函數的時候的值,msg.sender就是owner的值。msg.sender任何人調用了合約的方法,這筆交易中的from就是msg.sender,并不一定是合約的創造者,即不一定是合約的管理者。在部署合約的時候,設定一個全局唯一的合約所有者,後面可使用權限控制。

合約可以通過payable接受錢,但是對錢進行限定,使用msg.value對合約接受到的錢進行控制,函數使用了msg.value,函數需要修飾為payable。

pragma solidity ^0.4.24;

contract Foo07{
    
    uint256 public money;
    
    function paly() public payable{
        money=msg.value;
    }
}      

=========================================

pragma solidity ^0.4.24;

contract Foo07{
    
    uint256 public money;
    
    function paly() public payable{
        money=msg.value;
    }
    
    function getBalance() public view returns(uint256){
        return address(this).balance;
    }
}      

===========================================

pragma solidity ^0.4.24;

contract Foo07{
    
    uint256 public money;
    
    function paly() public payable{
        require(msg.value>100);
        money=msg.value;
    }
    
    function getBalance() public view returns(uint256){
        return address(this).balance;
    }
}
//使用require進行錯誤處理      

===================================

pragma solidity ^0.4.24;

contract Foo07{
    
    uint256 public money;
    mapping(address=>uint256) public personToMoney;
    
    
    function paly() public payable{
        require(msg.value>100);
        personToMoney[msg.sender]=msg.value;
        money=msg.value;
    }
    
    function getBalance() public view returns(uint256){
        return address(this).balance;
    }
}      

同時使用msg.sender和msg.value

3.全局變量

使用ganache圖形化工具測試

pragma solidity ^0.4.24;

contract Foo08{
    byte public  blockhash1;
    address public coinbase;
    uint public difficulty;
    uint public gaslimit;
    uint public blockNum;
    uint public timestamp;
    bytes public calldata1;
    uint public gas;
    address public sender;
    bytes4 public sig;
    uint public msgValue;
    uint public now1;
    uint public gasPrice;
    address public txOrigin;
    
    
    constructor() payable {
        blockNum=block.number;
        coinbase=block.coinbase;
        difficulty=block.difficulty;
        gaslimit=block.gaslimit;
        
        timestamp=block.timestamp;
        calldata1=msg.data;
        gas=gasleft();
        sender=msg.sender;
        sig=msg.sig;
        msgValue=msg.value;
        now1=now;
        gasPrice=tx.gasprice;
        txOrigin=tx.origin;

        
    }
}      

4錯誤處理

require(<條件>) 進行錯誤處理

5修飾器

pragma solidity ^0.4.24;

contract Foo08{
    
    uint256 public money;
    
    constructor() ff() payable{
     
        money=msg.value;
    }
    
    modifier ff() {
       require(msg.value>100);
       _;
    }
}      

6事件

pragma solidity ^0.4.24;

contract Foo08{
    
    uint256 public money;
    
    event playEvent(uint256);
    
    constructor() ff() payable{
     
        money=msg.value;
        emit playEvent(money);
    }
    
    modifier ff() {
       require(msg.value>100);
       _;
    }
}      
solidity階段性總結

7 貨币機關

1ether=10**18wei

1ether=1000finney

1ether=1000000szabo

8通路函數

pragma solidity ^0.4.24;


contract Foo009{
    uint256 public  data=200;
    
    function getData() returns(uint256){
        return this.data();
    }
    
    
}      

this.後的狀态變量需要加括号()。

9合約建立

pragma solidity ^0.4.24;


contract Foo009{
    uint256 public  data=200;
    
    function getData() public view  returns(uint256){
        return this.data();
    }
    
    
}


contract Foo091{
    address public ct1;
    
    function getCt(uint256 addr) public view returns (uint256) {
        Foo009 f09=Foo009(addr);
        return f09.getData();
    }
    
}