1、以太坊地址的本质
1、address 其实是用uint160来存储的,而且他们之间可以相互强制转换
2、地址之间是可以进行比较大小的
2、使用钱包转移资金
合约账户也是账户,也可以存储以太币余额,那么怎么给合约账户发送以太币呢?
pragma solidity >=0.4.22 <0.6.0;
contract payableTest{
//payable关键字代表我们可以通过这个函数给我们的合约地址转账
// 任何一笔转账都需要使用payable关键字
function pay() payable public {
}
// 获取合约账户上的金额
//this 表示当前合约地址
function getBalance() public view returns(uint){
return address(this).balance;
}
//获取任意地址的金额
function getRandomBalance() view public returns(uint){
address account =0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C;
return account.balance;
}
//获取任意地址的金额
function getRandomBalance2(address account ) view public returns(uint){
return account.balance;
}
}
//transfer转移资金(外部地址之间转账),如下图
//如果我们函数里面没有任何操作,但是有payable属性,那么msg.value的值就会直接转给合约账户
function transferTest() payable public{
address payable account1 = 0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB;
account1.transfer(msg.value);
//这样也是转10个以太币
//account1.transfer(10 ether);
}
3、以太坊中的全局属性
pragma solidity >=0.4.22 <0.6.0;
contract grobal{
function getGrobal1() view public returns(address) {
return msg.sender;
}
function getGrobal2() view public returns(uint) {
return block.difficulty;
}
function getGrobal3() view public returns(uint) {
return block.number;
}
function getGrobal4() view public returns(address) {
return block.coinbase;
}
}
4、底层send方法
send()是区块链底层的一个方法,执行时有一些风险:
- 调用递归深度不能超过1024
- 如果gas不够,执行会失败
- 返回值是bool类型,所以使用时要检查成功与否
- transfer相对send较安全
function sendTest() payable public returns(bool){
address payable account1 = 0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C;
return account1.send(msg.value);
}