081-Solidity基础入门 (二)

 

 

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,
只有拥有者才有权利删除

    

    

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值