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{
//0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
address 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
}
//0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
address 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];
}
}

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/279319.html
標籤:區塊鏈
