成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

智能合約語言Solidity教程系列2 - 地址類型介紹

binaryTree / 3299人閱讀

摘要:地址類型的成員屬性及函數(shù)這里是地址類型相關(guān)成員的快速索引用來查詢賬戶余額,用來發(fā)送以太幣以為單位。因此,為了保證安全,必須檢查的返回值,如果交易失敗,會(huì)回退以太幣。

本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)
原文鏈接:智能合約語言 Solidity 教程系列2 - 地址類型介紹原文已更新,請讀者前往原文閱讀

Solidity教程系列第二篇 - Solidity地址類型介紹.
Solidity 系列完整的文章列表請查看分類-Solidity。

寫在前面

Solidity是以太坊智能合約編程語言,閱讀本文前,你應(yīng)該對以太坊、智能合約有所了解,如果你還不了解,建議你先看以太坊是什么

本文前半部分是參考Solidity官方文檔(當(dāng)前最新版本:0.4.20)進(jìn)行翻譯,后半部分是結(jié)合實(shí)際合約代碼實(shí)例說明類型的使用(僅針對專欄訂閱用戶)。

地址類型(Address)

地址類型address是一個(gè)值類型,

地址: 20字節(jié)(一個(gè)以太坊地址的長度),地址類型也有成員,地址是所有合約的基礎(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ù))會(huì)隨transfer調(diào)用一起執(zhí)行(這個(gè)是EVM特性),如果因gas耗光或其他原因失敗,轉(zhuǎn)移交易會(huì)還原并且合約會(huì)拋異常停止。

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

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

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

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

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

call函數(shù)返回一個(gè)bool值,以表明執(zhí)行成功與否。正常結(jié)束返回true,異常終止返回false。但無法獲取到結(jié)果數(shù)據(jù),因?yàn)樾枰崆爸婪祷氐臄?shù)據(jù)的編碼和數(shù)據(jù)大?。ㄒ虿恢缹Ψ绞褂玫膮f(xié)議格式,所以也不會(huì)知道返回的結(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ū)別在于,僅僅是代碼會(huì)執(zhí)行,而其它方面,如(存儲(chǔ),余額等)都是用的當(dāng)前的合約的數(shù)據(jù)。delegatecall()方法的目的是用來執(zhí)行另一個(gè)合約中的庫代碼。所以開發(fā)者需要保證兩個(gè)合約中的存儲(chǔ)變量能兼容,來保證delegatecall()能順利執(zhí)行。在homestead階段之前,僅有一個(gè)受限的callcode()方法可用,但callcode未提供對msg.sender,msg.value的訪問權(quán)限。

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

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

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

地址常量(Address Literals)

一個(gè)能通過地址合法性檢查(address checksum test)十六進(jìn)制常量就會(huì)被認(rèn)為是地址,如0xdCad3a6d3569DF655070DEd06cb7A1b2Ccd1D3AF。而不能通過地址合法性檢查的39到41位長的十六進(jìn)制常量,會(huì)提示一個(gè)警告,被視為普通的有理數(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;
    }  
}
代碼運(yùn)行及講解

代碼運(yùn)行及講解,請訂閱區(qū)塊鏈技術(shù)查看。

參考視頻

我們也推出了目前市面上最全的視頻教程:深入詳解以太坊智能合約語言Solidity
目前我們也在招募體驗(yàn)師,可以點(diǎn)擊鏈接了解。

參考文檔

Solidity官方文檔-類型

? 深入淺出區(qū)塊鏈 - 系統(tǒng)學(xué)習(xí)區(qū)塊鏈,打造最好的區(qū)塊鏈技術(shù)博客。

? 我的知識星球為各位解答區(qū)塊鏈技術(shù)問題,歡迎加入討論。

? 關(guān)注公眾號“深入淺出區(qū)塊鏈技術(shù)”第一時(shí)間獲取區(qū)塊鏈技術(shù)信息。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/24114.html

相關(guān)文章

  • 智能合約語言Solidity教程系列1 - 類型介紹

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列地址類型介紹原文已更新,請讀者前往原文閱讀現(xiàn)在的中文文檔,要么翻譯的太爛,要么太舊,決定重新翻譯下。枚舉類型應(yīng)至少有一名成員。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列2 - 地址類型介紹原文已更新,請讀者前往原文閱讀 現(xiàn)在的Solidity中文文檔,要么翻譯的太爛,要么太舊,決定重新翻譯下。...

    andycall 評論0 收藏0
  • 區(qū)塊鏈技術(shù)學(xué)習(xí)指引

    摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請讀者前往原文閱讀 本章的文章越來越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...

    Cristic 評論0 收藏0
  • 智能合約語言Solidity教程系列3 - 函數(shù)類型

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列函數(shù)類型原文已更新,請讀者前往原文閱讀教程系列第三篇函數(shù)類型介紹。函數(shù)類型函數(shù)也是一種類型,且屬于值類型。但以此相反,合約中函數(shù)本身默認(rèn)是的,僅僅是當(dāng)作類型名使用時(shí)默認(rèn)是的。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言Solidity教程系列3 - 函數(shù)類型原文已更新,請讀者前往原文閱讀 Solidity 教程系列第三篇 ...

    qylost 評論0 收藏0
  • 智能合約語言 Solidity 教程系列9 - 錯(cuò)誤處理

    摘要:本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接智能合約語言教程系列錯(cuò)誤處理原文已更新,請讀者前往原文閱讀這是教程系列文章第篇介紹錯(cuò)誤處理。如果合約沒有修飾符的的函數(shù)在接收以太幣時(shí)包括構(gòu)造函數(shù),和回退函數(shù)。如果合約通過一個(gè)的函數(shù)接收以太幣。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列9 - 錯(cuò)誤處理原文已更新,請讀者前往原文閱讀 這是Solidity教程系列文章...

    xialong 評論0 收藏0
  • 智能合約語言 Solidity 教程系列4 - 數(shù)據(jù)存儲(chǔ)位置分析

    摘要:狀態(tài)變量合約內(nèi)聲明的公有變量還有一個(gè)存儲(chǔ)位置是,用來存儲(chǔ)函數(shù)參數(shù),是只讀的,不會(huì)永久存儲(chǔ)的一個(gè)數(shù)據(jù)位置。稱這個(gè)為狀態(tài)改變,這也是合約級變量稱為狀態(tài)變量的原因。 本文首發(fā)于深入淺出區(qū)塊鏈社區(qū)原文鏈接:智能合約語言 Solidity 教程系列4 - 數(shù)據(jù)存儲(chǔ)位置分析原文已更新,請讀者前往原文閱讀 Solidity教程系列第4篇 - Solidity數(shù)據(jù)位置分析。 寫在前面 Solidity...

    Galence 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<