真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Solidity地址類型有哪些

本篇內(nèi)容主要講解“Solidity地址類型有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Solidity地址類型有哪些”吧!

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營銷推廣、網(wǎng)站重做改版、召陵網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5響應(yīng)式網(wǎng)站、購物商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為召陵等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。

地址類型(Address)

地址類型address是一個值類型,

地址: 20字節(jié)(一個以太坊地址的長度),地址類型也有成員,地址是所有合約的基礎(chǔ) 支持的運(yùn)算符:

  • <=, <, ==, !=, >= 和 >

注意:從0.5.0開始,合約不再繼承自地址類型,但仍然可以顯式轉(zhuǎn)換為地址。

地址類型的成員

  • balance 屬性及transfer() 函數(shù) 這里是地址類型相關(guān)成員的快速索引 balance用來查詢賬戶余額,transfer()用來發(fā)送以太幣(以wei為單位)。 如:

    address x = 0x123;
    address myAddress = this;
    if (x.balance < 10 && myAddress.balance >= 10) x.transfer(10);

    注解:如果x是合約地址,合約的回退函數(shù)(fallback 函數(shù))會隨transfer調(diào)用一起執(zhí)行(這個是EVM特性),如果因gas耗光或其他原因失敗,轉(zhuǎn)移交易會還原并且合約會拋異常停止。

    關(guān)于回退函數(shù)(fallback 函數(shù)),簡單來說它是合約中無函數(shù)名函數(shù),下面代碼事例中,進(jìn)進(jìn)一步講解回退函數(shù)(fallback) 的使用。

  • send() 函數(shù) send 與transfer對應(yīng),但更底層。如果執(zhí)行失敗,transfer不會因異常停止,而send會返回false。

    警告:send() 執(zhí)行有一些風(fēng)險(xiǎn):如果調(diào)用棧的深度超過1024或gas耗光,交易都會失敗。因此,為了保證安全,必須檢查send的返回值,如果交易失敗,會回退以太幣。如果用transfer會更好。

  • call(), callcode() 和 delegatecall() 函數(shù) 為了和非ABI協(xié)議的合約進(jìn)行交互,可以使用call() 函數(shù), 它用來向另一個合約發(fā)送原始數(shù)據(jù),支持任何類型任意數(shù)量的參數(shù),每個參數(shù)會按規(guī)則(ABI協(xié)議)打包成32字節(jié)并一一拼接到一起。一個例外是:如果第一個參數(shù)恰好4個字節(jié),在這種情況下,會被認(rèn)為根據(jù)ABI協(xié)議定義的函數(shù)器指定的函數(shù)簽名而直接使用。如果僅想發(fā)送消息體,需要避免第一個參數(shù)是4個字節(jié)。如下面的例子:

    address nameReg = 0x72ba7d8e73fe8eb666ea66babc8116a41bfb10e2;
    nameReg.call("register", "MyName");
    nameReg.call(bytes4(keccak256("fun(uint256)")), a);

    call函數(shù)返回一個bool值,以表明執(zhí)行成功與否。正常結(jié)束返回true,異常終止返回false。但無法獲取到結(jié)果數(shù)據(jù),因?yàn)樾枰崆爸婪祷氐臄?shù)據(jù)的編碼和數(shù)據(jù)大小(因不知道對方使用的協(xié)議格式,所以也不會知道返回的結(jié)果如何解析)。 還可以提供**.gas()**修飾器進(jìn)行調(diào)用:

    namReg.call.gas(1000000)("register", "MyName");

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

    nameReg.call.value(1 ether)("register", "MyName");

    修飾器可以混合使用,修飾器調(diào)用順序無所謂。

    nameReg.call.gas(1000000).value(1 ether)("register", "MyName");

     

    注解:目前還不能在重載函數(shù)上使用gas或value修飾符,A workaround is to introduce a special case for gas and value and just re-check whether they are present at the point of overload resolution.(這句我怕翻譯的不準(zhǔn)確,引用原文)

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

    上面的這三個方法call(),delegatecall(),callcode()都是底層的消息傳遞調(diào)用,最好僅在萬不得已才進(jìn)行使用,因?yàn)樗麄兤茐牧薙olidity的類型安全。 .gas() 在call(), callcode() 和 delegatecall() 函數(shù)下都可以使用, delegatecall()不支持.value()

    注解:所有合約都繼承了address的成員,因此可以使用this.balance查詢余額。 callcode不鼓勵使用,以后會移除。

    警告:上述的函數(shù)都是底層的函數(shù),使用時(shí)要異常小心。當(dāng)調(diào)用一個未知的,可能是惡意的合約時(shí),當(dāng)你把控制權(quán)交給它,它可能回調(diào)回你的合約,所以要準(zhǔn)備好在調(diào)用返回時(shí),應(yīng)對你的狀態(tài)變量可能被惡意篡改的情況。

地址常量(Address Literals)

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

地址合法性檢查定義在EIP-55

合約事例講解

合約事例代碼

pragma solidity ^0.4.0;

contract AddrTest{
    event logdata(bytes data);
    function() payable {
        logdata(msg.data);
    }
    
    function getBalance() returns (uint) {
        return this.balance;
    }

    uint score = 0;
    function setScore(uint s) public {
        score = s;
    }
    
    function getScore() returns ( uint){
        return score;
    }
}

contract CallTest{
    function deposit() payable {
    }
    
    event logSendEvent(address to, uint value);
    function transferEther(address towho) payable {
        towho.transfer(10);
        logSendEvent(towho, 10);
    }
    
    function callNoFunc(address addr) returns (bool){
        return addr.call("tinyxiong", 1234);
    }
  
    function callfunc(address addr) returns (bool){
        bytes4 methodId = bytes4(keccak256("setScore(uint256)"));
        return addr.call(methodId, 100);
    }  
    
    function getBalance() returns (uint) {
        return this.balance;
    }  
}

到此,相信大家對“Solidity地址類型有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


文章標(biāo)題:Solidity地址類型有哪些
轉(zhuǎn)載源于:http://weahome.cn/article/iphecs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部