07_智能合約轉賬實現

在這裏插入圖片描述


合約轉賬

address類型

注意在solidty0.5以後的版本,address已做了重大更新,普通的address不在支持轉賬功能,如需轉賬採用address payable 類型代替

  1. address:保存一個20字節的值(以太坊地址的大小)。
  2. address payable :可支付地址,與 address 相同,不過有成員函數 transfer 和 send
  3. 兩種類型轉化操作:address payable ap = address(uint160(addr));

全局變量

在全局命名空間中已經存在了(預設了)一些特殊的變量和函數,他們主要用來提供關於區塊鏈的信息或一些通用的工具函數。

在這裏插入圖片描述

轉賬代碼實現

pragma solidity >=0.6.0 <0.7.0;

contract PayableDemo{
    // 地址類型,保存一個20字節的值,以太坊中所有的地址都是40長度
    address payable public _owner;  // 合約的所有者(創建者)
    // request session 內置對象
    constructor() public{
        _owner = msg.sender;  // 獲取函數調用者的地址
    }
    
    // 創建一個函數實現轉賬的功能
    function transfer()public payable{
        // _owner.transfer 接收方的地址
        _owner.transfer(msg.value);
    }
    // 顯示調用者,和合約所有的這的金額信息
    function showBalance() public view returns(uint256,uint256){
        address _account = msg.sender;
        // balance 屬性來查詢一個地址的餘額
        return (_account.balance,_owner.balance);
    }
}

合約銷燬

修飾器

使用修飾器可以輕鬆改變函數的行爲。它們可以在執行函數之前自動檢查某個條件。 修飾器是合約的可繼承屬性, 並可能被派生合約覆蓋

pragma solidity >=0.5.0 <0.7.0;

contract owned {
    function owned() public { owner = msg.sender; }
    address owner;

    // 這個合約只定義一個修飾器,但並未使用: 它將會在派生合約中用到。
    // 修飾器所修飾的函數體會被插入到特殊符號 _; 的位置。
    // 這意味着如果是 owner 調用這個函數,則函數會被執行,否則會拋出異常。
    modifier onlyOwner {
        require(
            msg.sender == owner,
            "Only owner can call this function."
        );
        _;
    }
}

完整代碼如下

pragma solidity >=0.6.0 <0.7.0;

contract PayableDemo{
    // 地址類型,保存一個20字節的值,以太坊中所有的地址都是40長度
    address payable public _owner;  // 合約的所有者(創建者)
    // uint256 public _money;  // 存儲合約金額
    // request session 內置對象
    constructor() public payable{
        _owner = msg.sender;  // 獲取函數調用者的地址
        // 所有者先給合約轉入基本金額
        msg.value;  // 調用此函數時傳入的value值
    }
    
    // 創建一個函數實現轉賬的功能
    function transfer()public payable{
        // _owner.transfer 接收方的地址
        msg.value;
    }
    // 顯示調用者,和合約所有的這的金額信息
    function showBalance() public view returns(uint256,uint256){
        address _account = msg.sender;
        // balance 屬性來查詢一個地址的餘額
        return (_account.balance,_owner.balance);
    }
    
    // 定義一個修飾器,完成所有者的判斷
    modifier onlyOwner{
        if (msg.sender != _owner){
            revert();
        }
        _;  // 代表執行真實的函數
    }
    
    // 合約自毀並且把金額傳到指定賬戶
    function kill(address payable addr)public onlyOwner{
        selfdestruct(addr); // 自毀函數
    }
    
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章