Solidity 从入门到实战(三)
注意:本专栏主要来自于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记以及https://blog.csdn.net/weixin_45067603/article/details/105751748
以太坊中的地址
1.以太坊中的地址以40位的16进制表示,储存以uint160进行存储
2.地址之间支持大小比较、
3.可以分为外部账户地址和合约地址
pragma solidity ^0.4.16;
contract myAddress{
//0x14723a09acff6d2a60dcdf7aa4aff308fddc160caddress account1;address account2 = 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c;//使用外部账户地址function showaddress1() public view returns(address){
return account1; //可以看到未赋值时,参数为0}function showaddress2() public view returns(uint160){
return uint160(account2);//说明可以转化为uint160类型 116727156174188091019688739584752390716576765452}function typechange(uint160 num) public view returns(address){
return address(num);//可以互相转换 116727156174188091019688739584752390716576765452}//0x14723a09acff6d2a60dcdf7aa4aff308fddc160caddress account3 = 0x76E67229eaE13967955cb972658ca33bAa36b696;function largetest() public view returns(bool){
return account3>account1;}
}
转账,查询当前账户余额
结论:
1.可以通过地址.balance获取某个地址的余额
2.this指的是当前合约的地址
3.转账金额可以通过remix进行输入
4.对其他账户的转账需要使用账户名称.transfer(msg.value),msg.value是通过remix界面输入的
5.如果对当前合约使用transfer转账this.transfer(msg.value)则必须需要一个回滚函数。
6.如果函数含有payable而函数里面没有要求给某个账户转账的话,则会默认转账到当前合约当中
7.send和transfer的区别是,前者是底层函数,使用的时候需要让它返回bool值;实际情况下尽量使用transfer
pragma solidity ^0.4.16;
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){
//如果函数含有payable而函数里面没有要求给某个账户转账的话,则会默认转账到当前合约当中//声明一个要转入的账户地址address account1=0xca35b7d915458ef540ade6068dfe2f44e8fa733c;//账户随意//将钱从当前账户转给accout1账户account1.transfer(msg.value);return account1.balance;}function transfertest2() payable public returns(uint){
this.transfer(msg.value);return this.balance;}function () payable{
}function thistest1() public view returns(uint){
return this.balance;}function thistest2() public view returns(uint){
return this.transfertest1();}function sendMoney() payable returns(bool){
//如果不在remix界面输入金额,则会转账失败,返回false;address account =0x4b0897b0513fdc7c541b6d9d7e929c4e5364d2db;return account.send(10 ether);}function getGolbal() view public returns(address){
return msg.sender;}}
使用全局变量
这里介绍两个比较重要的全局变量,详细内容请访问
https://blog.csdn.net/qq_33829547/article/details/80419296
pragma solidity ^0.4.16;
contract globalTest{
function getGolbal() view public returns(address){
//获取消息的发送者(当前调用),当前的外部账户地址return msg.sender;}function getValue() view public returns(uint){
//和消息一起发送的wei的数量return msg.value;}}
Mapping映射(很重要)
pragma solidity ^0.4.16;
contract mappingTest{
// 定义mapping idmapping 代表地址==》id映射到了一起,namemapping代表id==>名字映射到了一起mapping(address => uint) idmapping;mapping(uint => string) namemapping;//定义注册的总量uint public sum =0;//注册函数function register(string name){
//获取当前合约的调用者地址address account = msg.sender;sum++;//将合约的调用者的地址与注册总量id联系到一起idmapping[account]= sum;//将当前用户的id与用户的姓名绑定到一起namemapping[sum] =name;}//通过地址获取到用户绑定的id值function getIdByAddress(address are) view public returns(uint){
return idmapping[are];}//通过id值获取到它绑定的姓名function gerNameById(uint id) view public returns(string){
return namemapping[id];}
}