罗韭菜的solidity学习(五)地址Address
2018-04-09 本文已影响0人
罗雪Melody
基本常识
- 钱包地址就是个160位的整数,恰好能能通过uint160存储。
- 以太坊地址长度为20字节,1byte=8bit, 因此共160bit。
//0x(十六进制)+ 40个数字, 由于十六位,一个数字=二进制4个数字 所以正好是160位。 - 用uint160(address)可以转换成十进制整数。
合约相关
-
合约拥有者
msg.sender就是当前调用方法时的发起人
而第一次部署合约时,花费gas的人即合约拥有者
默认属性里的_owner就是合约拥有者,可以用以下代码保存合约拥有者,并且在if _owner==msg.sender里写一些只属于合约拥有者的骚操作。
会根据字节码(input)判断大概需要花费多少gas
from 地址 即 msg.sender
image.png
pragma solidity ^0.4.4;
contract Test {
address public _owner;
uint public _number;
function Test() {
_owner = msg.sender;
_number = 100;
}
function msgSenderAddress() constant returns (address) {
return msg.sender;
}
function setNumberAdd1() {
_number = _number + 5;
}
function setNumberAdd2() {
if (_owner == msg.sender) {
_number = _number + 10;
}
}
}
// 0xca35b7d915458ef540ade6068dfe2f44e8fa733c
- 合约地址
部署合约后产生了合约地址,用于之后利用这个地址来调用合约的api
重新部署一次(create一次)就会重新产生一个合约对象,重新产生一个新的合约地址
this 指的是当前合约对象的地址
合约地址支持的运算符
<= < == != >= >
成员变量和函数
1. balance
pragma solidity ^0.4.4;
contract addressBalance{
function getBalance(address addr) constant returns (uint){
return addr.balance;
}
// this is current contract address
function getCurrentAddressBalance()constant returns(uint){
return this.balance;
}
}
合约地址也是合法的钱包地址,所以用.balance也可以查看该合约的余额
2. transfer
- msg.value指的是当前部署合约的钱包的要填入的value
- 凡是关于转账相关的需要在函数名后面加payble
pragma solidity ^0.4.4;
contract PayableKeyword{
// 从合约发起方向 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址转入 msg.value 个以太币,单位是 wei
function deposit() payable{
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
Account2.transfer(msg.value);
}
// 读取 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c 地址的余额
function getAccount2Balance() constant returns (uint) {
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.balance;
}
// 读取合约发起方的余额
function getOwnerBalance() constant returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}
3.send方法转账
- transfer 当发起方余额不足时会抛出异常,但是send只返回false
- 代码类似,需要return
pragma solidity ^0.4.4;
contract PayableKeyword{
function deposit() payable returns (bool){
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.send(msg.value);
}
function getAccount2Balance() constant returns (uint) {
address Account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;
return Account2.balance;
}
function getOwnerBalance() constant returns (uint) {
address Owner = msg.sender;
return Owner.balance;
}
}
注意:
- send调用递归深度不能超过1024
- 如果gas不够,执行会失败
- 所以使用这个方法要检查成功与否
- transfer相对send 较安全