081-Solidity基础入门 (二)
现在正是开始和以太坊相关的东西了
地址
地址
int与address的转换
一个地址比如 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
这样一共是40个字符
一个字符是占4位,所以2个字符是1个字节
所以,这里一共是160位,也就是20个字节.
所以address可以和uint160进行转换
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
//0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
address account=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
function addressToUint160() public view returns(uint160){
return uint160(account);
}
function uint160ToAddress() public view returns(address){
return address(1154414090619811796818182302139415280051214250812);
}
}
两个地址进行比较
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
//0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
//0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
address a1=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
address a2=0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C;
function check1() public view returns(bool){
return a1>a2;
}
function check2() public view returns(bool){
return a1<a2;
}
function check3() public view returns(bool){
return a1==a2;
}
function check4() public view returns(bool){
return a1!=a2;
}
}
获取余额以及转账
我们来看一下这个例子
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
//0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
//0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
address a1=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
address a2=0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C;
function pay() public payable{
}
function getContractBalance() public view returns(uint256){
return address(this).balance;
}
function getSenderBalance() public view returns(uint256){
return msg.sender.balance;
}
}
这个例子中,pay()方法是用来转账的
address(this)是来获取现在这个合约中的余额
msg.sender.balance是来获取调用这个方法的人的余额
获取合同的地址和调用者的地址
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
//0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
//0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
address a1=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
address a2=0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C;
function pay() public payable{
}
function getAccountAddress() public view returns(address){
return msg.sender;
}
function getContractAddress() public view returns(address){
return address(this);
}
}
转账
账户和账户的转账
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
//0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
//0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
address a1=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
address payable a2=0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C;
function transfer() public payable{
a2.transfer(msg.value);
}
}
获取当前区块的相关信息
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
//0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c
//0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C
address a1=0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
address payable a2=0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C;
function getDifficulty() public view returns(uint256){
return block.difficulty;
}
function getNumber() public view returns(uint256){
return block.number;
}
function getCoinbase() public view returns(address){
return block.coinbase;
}
}
mapping
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
mapping(address=>uint256) idMap;
mapping(address=>string) nameMap;
uint256 num=0;
function setId() public{
num++;
idMap[msg.sender]=num;
}
function setName(string memory name) public{
nameMap[msg.sender]=name;
}
function getId(address a) public view returns(uint256){
return idMap[a];
}
function getName(address a) public view returns(string memory){
return nameMap[a];
}
}
同时返回多个返回值
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
function addAndSub(uint256 a,uint256 b) public pure returns(uint256,uint256){
return (a+b,a-b);
}
}
合约的继承
pragma solidity >=0.4.22 <0.7.0;
contract Person{
string name;
function sayHello() public pure returns(string memory){
return "hello";
}
function sayName() public view returns(string memory){
return name;
}
}
contract Teacher is Person{
function setName(string memory _name) public {
name=_name;
}
}
创建合约对象然后调用方法
pragma solidity >=0.4.22 <0.7.0;
contract Person{
function playComputer() public returns(string memory){
Computer c=new Computer();
return c.play();
}
}
contract Computer{
function play() public pure returns(string memory){
return "play";
}
}
我们来看一下一个方法的所有属性
1.pure
2.constant
3.view
4.payable
constant这个东西已经在0.5.0版本被移除了
所以只要用pure或者view就行了
modifier
什么是modifier
modifier是一个函数修饰符,
当modifier修饰了一个函数的时候,这个函数必须要满足指定的条件才会执行,举个例子
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
address owner;
uint256 num;
constructor() public{
owner=msg.sender;
}
modifier onlyOwner{
require (msg.sender==owner);
_;
}
function changeNum(uint256 _num) public onlyOwner{
num=_num;
}
}
在这个例子中,我们写了一个onlyOwner的modifier
然后用onlyOwner修饰了 changeNum这个方法
所以changeNum这个方法必须要满足onlyOwner的条件,才能顺利执行
销毁合约
pragma solidity >=0.4.22 <0.7.0;
contract Hello{
function deleteContract() public{
selfdestruct(msg.sender);
}
}
但是一般情况下,肯定要给出modifier,
只有拥有者才有权利删除