合約轉賬
address類型
注意在solidty0.5以後的版本,address已做了重大更新,普通的address不在支持轉賬功能,如需轉賬採用address payable 類型代替
- address:保存一個20字節的值(以太坊地址的大小)。
- address payable :可支付地址,與 address 相同,不過有成員函數 transfer 和 send
- 兩種類型轉化操作: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); // 自毀函數
}
}