以太坊solidity学习记录(四)地址与交易

个人目录

以太坊solidity学习记录(一)新版在线remix编译器的使用(2020.4.27)
以太坊solidity学习记录(二)基础操作整理
以太坊solidity学习记录(三)基础数据操作
以太坊solidity学习记录(四)地址与交易
以太坊solidity学习记录(五)函数入门
以太坊solidity学习记录(六)内存与结构体

1.以太坊中的地址

结论:
1.以太坊中的地址以40位的16进制表示,储存以uint160(40*4)进行数字存储
2.地址之间支持大小比较

pragma solidity ^0.4.0;
contract whatisaddress{
    //0x75e453B2039c8A168b8Dab1AA97F4735618559De
    address account1;
    address account2 = 0x75e453B2039c8A168b8Dab1AA97F4735618559De;
    function showaddress1() public view returns(address){
        return account1; //可以看到未赋值时,参数为0
    }
    
    function showaddress2() public view returns(uint160){
        return uint160(account2);//说明可以转化为uint160类型
    }
    
    function typechange(uint160 num) public view returns(address){
        return address(num);//可以互相转换
    }
    
    //0x76E67229eaE13967955cb972658ca33bAa36b696
    address account3 = 0x76E67229eaE13967955cb972658ca33bAa36b696;
    function largetest() public view returns(bool){
        return account3>account1;
    }
}

运行结果
以太坊solidity学习记录(四)地址与交易_第1张图片

2.转账操作与余额获取

结论:
1.可以通过地址.balance获取某个地址的余额
2.this指的是当前合约的地址,如此处就是paytest合约的地址
3.转账可以通过remix图形界面来进行转账数目的改变
4.对其他账户的转账需要使用账户名称.transfer(msg.value)或者账户名称.transfer(数量 单位,如1 ether)如果在输入value的同时又写的是数量 单位,那么多余的value就自动转账到合约地址里去
5.如果对当前合约使用transfer转账this.transfer(msg.value)则必须需要一个回滚函数。
6…如果函数含有payable而函数里面没有要求给某个账户转账的话,则会默认转账到合约当中
7.send和transfer的区别是,前者是底层函数,返回bool值;后者会直接在调用时报错。具体体现在如果转账金额为0是,send正常运行但是返回false 现在尝试了之后发现即使转账金额0,两者均都不报错,返回的为true,见测试5

contract  paytest{
    function payabletest() payable{
    }
    
    function getbalance(address account) public view returns(uint){
        return account.balance;
    }
    
    function thistest() public view returns(address){
        return this;
    }
    
    function transfertest1() payable public returns(uint){
        address account1=0xeb46e45709DE0b10AECa4A9C9D1800beB6a13C6C;//账户随意
        account1.transfer(msg.value);
        return account1.balance;
    }
    
    function transfertest2()  payable public  returns(uint){
        this.transfer(msg.value);
        return this.balance;
    }
    
    function () payable{       
    }
}

运行结果
1.先得到this的地址,再讲this的地址复制进去查看,可以知道此时合约的余额为0
以太坊solidity学习记录(四)地址与交易_第2张图片
2.修改remix界面中的value值然后点击我们payabletest,再调用之后就可以发现余额发生了变化
在这里插入图片描述
以太坊solidity学习记录(四)地址与交易_第3张图片

3.原本0xeb46e45709DE0b10AECa4A9C9D1800beB6a13C6C地址的余额是

以太坊solidity学习记录(四)地址与交易_第4张图片

PS.虽然显示是这个,但实际上是100eth,但这些先不追究
在这里插入图片描述

输入2之后点击transfertest1可以看到余额发生变化
以太坊solidity学习记录(四)地址与交易_第5张图片
4.转账8个,但是只接受4个,剩下的都到合约地址去了
在这里插入图片描述
以太坊solidity学习记录(四)地址与交易_第6张图片
5.value设置为0
调用sendtest,返回值为true
在这里插入图片描述
调用transfertest2,正常运行没有报错
在这里插入图片描述

3.全局变量

可见深入理解Solidity——全局变量

4.mapping映射

结论:
1.定义映射mapping(类型1 => 类型2) 映射名称
2.代码

contract mappingtest{
    mapping(address => uint) ATU;
    mapping(uint => string) UTS;
    uint sum=0;
    
    function test(string teststring) {
        address account=msg.sender;
        sum++;
        ATU[account]= sum;
        UTS[sum]= teststring;
    }
    
    function ATUtest() public view returns(uint){
        address account=msg.sender;
        return ATU[account];
    }
    
    function UTStest() public view returns(string){
        return UTS[sum];
    }

}

运行结果
以太坊solidity学习记录(四)地址与交易_第7张图片

本章全部代码

pragma solidity ^0.4.0;
contract whatisaddress{
    //0x75e453B2039c8A168b8Dab1AA97F4735618559De
    address account1;
    address account2 = 0x75e453B2039c8A168b8Dab1AA97F4735618559De;
    function showaddress1() public view returns(address){
        return account1;
    }
    
    function showaddress2() public view returns(uint160){
        return uint160(account2);
    }
    
    function typechange(uint160 num) public view returns(address){
        return address(num);
    }
    
    //0x76E67229eaE13967955cb972658ca33bAa36b696
    address account3 = 0x76E67229eaE13967955cb972658ca33bAa36b696;
    function largetest() public view returns(bool){
        return account3>account1;
    }
}

contract  paytest{
    function payabletest() payable{
    }
    
    function getbalance(address account) public view returns(uint){
        return account.balance;
    }
    
    function thistest() public view returns(address){
        return this;
    }
    
    function transfertest1() payable public returns(uint){
        address account1=0xeb46e45709DE0b10AECa4A9C9D1800beB6a13C6C;
        account1.transfer(msg.value);
        return account1.balance;
    }
    
    function transfertest2()  payable public  returns(uint){
        this.transfer(msg.value);
        return this.balance;
    }
    
   function transfertest3()  payable public  returns(uint){
       address account1=0xeb46e45709DE0b10AECa4A9C9D1800beB6a13C6C;
        account1.transfer(4 ether);
        return account1.balance;
    }
    
    function sendtest()  payable public  returns(bool){
       address account1=0xeb46e45709DE0b10AECa4A9C9D1800beB6a13C6C;
        account1.send(msg.value);
        return account1.send(msg.value);
    }
    
    function () payable{
    }
}

contract mappingtest{
    mapping(address => uint) ATU;
    mapping(uint => string) UTS;
    uint sum=0;
    
    function test(string teststring) {
        address account=msg.sender;
        sum++;
        ATU[account]= sum;
        UTS[sum]= teststring;
    }
    
    function ATUtest() public view returns(uint){
        address account=msg.sender;
        return ATU[account];
    }
    
    function UTStest() public view returns(string){
        return UTS[sum];
    }
}

你可能感兴趣的:(solidity)