當前位置:
首頁 > 最新 > solidity之地址類型

solidity之地址類型

  • balance屬性以及transfer()函數

    這兩個是地址類型的快速索引,balance是查詢賬戶餘額,transfer()用來發送以太幣(以wei為單位)

  • 例如:

    address dz =0x2222222;

    address myAddress = this;

    if(dz.balance < 100 && myAddress.balance >= 100)dz.transfer(100);

    註: dz的地址為0x2222222,我的地址儲存為myAddress,判斷當dz地址中的餘額小於100且我的賬戶中餘額大於100時,則給dz發送100個以太幣。

    2.send()函數

    send與transfer對應,但是send更加底層,當執行失敗時transfer不會因為異常停止,而send()會返回false.

    註: send()執行具有一定的風險,如果調用棧的深度超過1024或者gas消耗完,交易都會失敗,所以為了保證安全必須檢查send的返回值,當交易失敗時返回以太幣,用transfer會更好。

    3.call(),callcode()和delegatecall()函數

    可以使用call()函數向另外一個合約發送原始資料庫(支持任何類型的參數),來和非ABI協議的合約進行交互,發送的時候每個參數都會按照ABI協議打包成32位元組然後拼接到一起。(例外:如果第一個參數正好是四個位元組,會被認為是根據ABI協議定義的函數器 指定的 函數簽名 來直接使用)。如果僅僅是要發送消息體,需要避免第一個參數是四位元組。

    例如:

    pragma solidity ^0.4.19;

    contract Person{

    bytes fail;

    function(){

    fail = msg.data;

    }

    function getFail() returns (bytes){

    return fail;

    }

    }

    contract CallTest{

    function callData(address addr) returns (bool){

    return addr.call("abc", 256);

    }

    }

    註:上面代碼我們可以看出,CallTest合約我們寫了一個發送信息的call函數,我每行解釋一下,function callData(address addr) returns (bool){}構造一個callData函數,內置的需要填寫的信息是(address addr /*輸入一個地址用addr存儲*/),發送成功或者失敗返回布爾值。

    效果如圖:

    當我們create創建後,下方會會出現我們的構造函數按鈕。

    再來看看我們的接受信息的合約Person合約:

    contract Person{

    bytes fail;

    function(){

    fail = msg.data;

    }

    function getFail() returns (bytes){

    return fail;

    }

    }

    bytes fail;創建一個fail用來儲存位元組

    function(){ fail = msg.data; }接收到的數據,存儲在fail裡面

    function getFail() returns (bytes){ }構造數據函數,列印出來fail的數據

    同樣創建如圖合約:

    我們把第二個合約的地址,填入到第一個需要發送的地址欄中,點擊callData發送信息,然後點擊第二個合約的getFail查看接收到的信息:

    可以看到輸出的這一欄里,位元組的字元串為:

    0x61626300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100

    這就是CallTest合約里call函數addr.call("abc", 256);前32位對應的abc的acii編碼值,後面32位對應256的編碼值。

    當然也可以通過.gas()修飾器進行調用:

    類似還可以提供附帶以太幣:

    且修飾器可以混合使用,修飾器調用順序無所謂:

    同樣我們也可以使用delegatecall(),它與call方法的區別在於,僅僅是代碼會執行,而其它方面,如(存儲,餘額等)都是用的當前的合約的數據。delegatecall()方法的目的是用來執行另一個合約中的庫代碼。所以開發者需要保證兩個合約中的存儲變數能兼容,來保證delegatecall()能順利執行。在homestead階段之前,僅有一個受限的callcode()方法可用,但callcode未提供對msg.sender,msg.value的訪問許可權。

    上面的這三個方法call(),delegatecall(),callcode()都是底層的消息傳遞調用,最好僅在萬不得已才進行使用,因為他們破壞了Solidity的類型安全。

    .gas() 在call(), callcode() 和 delegatecall() 函數下都可以使用, delegatecall()不支持.value()

    注釋:所有合約都繼承了address的成員,因此可以使用this.balance查詢餘額。callcode不鼓勵使用,以後會移除。上述的函數都是底層的函數,使用時要異常小心。當調用一個未知的,可能是惡意的合約時,當你把控制權交給它,它可能回調回你的合約,所以要準備好在調用返回時,應對你的狀態變數可能被惡意篡改的情況。

    4.地址常量:

    一個能通過地址合法性檢查(address checksum test)十六進位常量就會被認為是地址,如0x9605007403Aa35B0b8895ea70B047D84464548fd。而不能通過地址合法性檢查的39到41位長的十六進位常量,會提示一個警告,被視為普通的有理數常量。

    代碼示例:

    創建合約後,可以看到,AddrTest合約內沒有命令的函數,顯示fallback。

    AddrTest合約主要是用來說明轉入以太幣及調用函數式回退函數的調用情況,CallTest合約是作為AddrTest合約的調用者。

    CallTest合約的函數說明:

    存款:

    轉賬:


    喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

    本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


    請您繼續閱讀更多來自 半仙兒Saydiv 的精彩文章:

    TAG:半仙兒Saydiv |