合约转账
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); // 自毁函数
}
}