国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

以太坊智能合約學(xué)習(xí)筆記(三)

mumumu / 3224人閱讀

摘要:另外只能做狀態(tài)變量,不能做本地局部變量。語法聲明映射類型包括類型包括狀態(tài)變量報錯。可視度指的是,決定函數(shù)或者狀態(tài)變量的可以被哪些智能合約可見和調(diào)用。狀態(tài)變量可見性沒有。在中,通過來抽象出狀態(tài)變量自增的代碼,并修飾。

Mapping

映射(Mappings):類似于哈希表。mapping 中任何一個可能的 key 都對應(yīng)著一個 value,它的默認(rèn)值是default-value 。底層用的不是使用鏈表 + 數(shù)組實現(xiàn)的,不需要擴(kuò)容。value 引用存儲在 keccak256(key) 表姐地址,在 storage 上存儲,理論無限大。這也導(dǎo)致了,無法原生地遍歷 mapping。另外 mapping 只能做狀態(tài)變量,不能做本地局部變量。

語法

// 聲明映射
// key 類型包括: bool, int/uint , address, string...
// value 類型包括: any type
mapping(address => uint) balances; // 狀態(tài)變量

function() {
    mapping(address => uint) balances; // 報錯。本地局部變量報錯。
}

// 成員賦值
balances[0x1] = 1;

// 成員取值
balances[0x1] // 1
balances[0x2] // 默認(rèn)值 0
balances[0x3] // 默認(rèn)值 0
可視度

可視度(Visibility): 可視度不是說別人無法用肉眼無法看到,智能合約部署在區(qū)塊鏈上,代碼任何人都可以看見。可視度指的是,決定函數(shù)或者狀態(tài)變量的可以被哪些智能合約可見和調(diào)用。

public: 所有智能合約可見

external: 只能被外部合約或者外部調(diào)用者可見

internal: 外部合約不可見,當(dāng)前合約內(nèi)部和子類合約可見

private: 只有當(dāng)前合約可見

可以用一個例子來解釋,什么是外部合約、外部調(diào)用者、當(dāng)前合約內(nèi)部、子類合約。

有三個合約,ChildParentOutSide。其中 Child 繼承 ParentOutSide 和另外兩個合約沒有直接關(guān)系。

- 外部合約可見: `Child` 的函數(shù)可以調(diào)用 `OutSide` 的函數(shù)。
- 外部調(diào)用者可見: 在 remix 的 run 面板中 create `Child` 合約后,可以調(diào)用。
- 當(dāng)前合約內(nèi)部可見: `Child` 的函數(shù)可以調(diào)用 `Child` 自身的其他函數(shù)。
- 子類合約可見:`Child` 的函數(shù)可以調(diào)用 `Parent` 的函數(shù)。

ChildParentOutSide 都有以下四個函數(shù):

function publicFunc() public {}

function externalFunc() external {}

function internalFunc() internal {} // 不可調(diào)用

function privateFunc() private {} // 不可調(diào)用

// `Child` 中的函數(shù)名都加了 `self` 前綴,和 Parent 中的函數(shù)做區(qū)分。

函數(shù)可見性public(default) , external , internal , private

具體示例代碼如下:

pragma solidity ^0.4.14;

import "./parent.sol";
import "./outside.sol";

contract Child is Parent{
        

    // 返回一個值
    function testOutside() {
        Outside o = new Outside();
        
        o.publicFunc();
        o.externalFunc();
        // o.internalFunc();  // 報錯。Child 不能調(diào)用 OutSide 的 internal 函數(shù)。
        // o.privateFunc();   // 報錯。Child 不能調(diào)用 OutSide 的 private 函數(shù)。
    }
    
    function testParent () {

        publicFunc();
        // externalFunc();   // 報錯。Child 不能調(diào)用 Parent 的 external 函數(shù)。
        internalFunc();
        // privateFunc();    // 報錯。Child 不能調(diào)用 Parent 的 private 函數(shù)。
    }
    
    function selfPublicFunc() public {}
    
    function selfExternalFunc() external {}
    
    function selfInternalFunc() internal {} // remix 不可見。外部調(diào)用者不能調(diào)用 internal 函數(shù)。
    
    function selfPrivateFunc() private {} // remix 不可見。外部調(diào)用者不能調(diào)用 private 函數(shù)。
}

狀態(tài)變量可見性public , internal(default) , private 沒有 external

狀態(tài)變量可見度和函數(shù)可見度非常相似,只有一點需要特殊說明。當(dāng)在狀態(tài)變量上添加可視度時,編譯器會給狀態(tài)變量添加個 getter 函數(shù),方便外部直接獲取。

使用 remix 創(chuàng)建以下合約時,會出現(xiàn)一個 data 函數(shù),點擊該函數(shù)就可以獲取到 data 的值。

<圖>

繼承(待補充...) 函數(shù)修飾器

函數(shù)修飾器(Function Modifiers): 函數(shù)修飾器可以改變函數(shù)的行為。可通過 _ 來控制修飾器的執(zhí)行時機(jī)。

在 Example1 中,通過 modifier 來抽象出檢查條件的代碼,并修飾 input2。讓 input2 實現(xiàn)和 inputs2 一樣的行為。其中 _ 可以簡單的理解為,do something 代碼在 modifier 之后執(zhí)行。

contract Example1 {
    address owner;

    function Example() public { owner = msg.sender; }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function inputs1() {
        require(msg.sender == owner);
        // do something...
    }

    function inputs2() onlyOwner {}
}

例如:函數(shù)修飾器可以在執(zhí)行自動執(zhí)行指定語句。inputs1inputs2 在行為上是等價的。

在 Example2 中,通過 modifier 來抽象出狀態(tài)變量自增的代碼,并修飾 input2。讓 input2 實現(xiàn)和 inputs2 一樣的行為。其中 _ 可以簡單的理解為,do something(不包括 return) 代碼在其之前執(zhí)行。

contract Example2 {
    // 省略 ...
    uint output;

    modifier increase return(unit) {
        _;
        output++;
    }

    function change1() return(unit) {
        // do something...
        output++;
        return output;
    }

    function change2() increase {
        // do something...
        return output;
    }
}
Safe Math 和 Library(待完善...)

因為 Solidity 數(shù)字大多數(shù)是和錢有關(guān)的,所以在加減乘除的四則運算時,發(fā)生上溢或下溢是非常危險的。

contract Test {
    uint8 public a = 0;

    function set () {
        a -= 100;
    }


    function set2 () {
        unit8 c = a - 100;
        assert(c < a);
        a = c;
    }

}

-----

set() // a = 156 整型溢出
import "./SafeMath.sol"; // 引入 unit8

contract Test {
    uint8 public a = 0;

    function set () {
        a = SafeMath.sub(a, 100);
    }
}
import "./SafeMath.sol"; // 引入 unit8


contract Test {
    using SafeMath for uint8; // 將 SafeMath 庫里的方法,賦予了 uint8 類型。
    uint8 public a = 0;

    function set () {
        a = a.sub(100);
        // a = SafeMath.sub(a, 100);
    }
}
其他

函數(shù)(function)聲明:函數(shù)是合約內(nèi)代碼的可執(zhí)行單元。

contract SimpleStorage {
    function simpleFn() {
    }
}

函數(shù)返回值

返回一個或多個參數(shù)

直接賦值返回的命名參數(shù),并返回

    // 返回一個值
    function oneParameter() returns(uint){
        return 1;
    }
    
    // 返回多個返回值
    function twoParameters() returns(uint, uint) {
        return (1,2);
    }
    
    // 命名參數(shù)直接賦值
    function namedParameter() returns(uint foo, uint bar) {
        foo = 1;
        bar = 2;
    }
    
    // 獲取返回值 
    function get() {
        uint one = oneParameter();
        var (two1, two2) = twoParameters();
        var (named1, named2) = namedParameter();
    }

本文由【區(qū)塊鏈研習(xí)社】優(yōu)質(zhì)內(nèi)容計劃支持,更多關(guān)于區(qū)塊鏈的深度好文,請點擊【區(qū)塊鏈研習(xí)社】簡書專欄:區(qū)塊鏈研習(xí)社簡書專欄

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23995.html

相關(guān)文章

  • SegmentFault 技術(shù)周刊 Vol.41 - 深入學(xué)習(xí)區(qū)塊鏈

    摘要:和比特幣協(xié)議有所不同的是,以太坊的設(shè)計十分靈活,極具適應(yīng)性。超級賬本區(qū)塊鏈的商業(yè)應(yīng)用超級賬本超級賬本是基金會下的眾多項目中的一個。證書頒發(fā)機(jī)構(gòu)負(fù)責(zé)簽發(fā)撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個故事告訴你比特幣的原理及運作機(jī)制 這篇文章的定位會比較科普,盡量用類比的方法將比特幣的基本原理講出來...

    qianfeng 評論0 收藏0
  • 以太智能合約學(xué)習(xí)筆記(一)

    摘要:舍去小數(shù)位在以太坊中賬戶有兩種類型普通賬戶和智能合約賬戶。報酬是小額的以太幣,想要運行智能合約的人的需要支付報酬來使合約工作。涉及到以太坊智能合約的攻擊的問題。 智能合約可以簡單的理解為一段可執(zhí)行的程序片段,具體的代碼經(jīng)過 Solidity 編寫之后,發(fā)布到區(qū)塊鏈上。而以太坊的智能合約也可以理解為一個特殊的交易(包括可執(zhí)行代碼的),被發(fā)送出去后會被礦工打包記錄在某一個區(qū)塊中,當(dāng)需要調(diào)用...

    dadong 評論0 收藏0
  • 以太智能合約學(xué)習(xí)筆記(二)

    摘要:錯誤檢查拋出異常。用于檢查內(nèi)部錯誤,比如上溢和下溢。由于語言完善的問題,支持狀態(tài)變量之間的轉(zhuǎn)換,未來可能會取消該限制。注意,只能將變量賦值給狀態(tài)變量,而不是本地變量。因為我們只能在狀態(tài)變量中分配內(nèi)存空間。 錯誤檢查 throw: 拋出異常。已被廢棄。 revert(): 拋出異常,并回滾到調(diào)用前的狀態(tài)。 require(bool): require(false) 拋出異常,并回...

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

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

    Cristic 評論0 收藏0
  • 以太連載():Web 3:去中心化應(yīng)用平臺

    摘要:以太坊協(xié)議的目的是普遍化,以使其核心特征能夠以任意方式結(jié)合。稱以太坊為一個生態(tài)系統(tǒng)再合適不過了核心協(xié)議由不同的基礎(chǔ)設(shè)施編碼和社群支持,他們共同構(gòu)成了以太坊項目。 Web 3:去中心化應(yīng)用平臺很多人相信像以太坊這樣一個公開、無需信任的區(qū)塊鏈平臺十分適合作為Web 3.0的共享后端,像Web3.0這樣去中心化、安全的互聯(lián)網(wǎng),它的核心服務(wù),比如DNS和數(shù)字身份是去中心化的,個體可以參與到經(jīng)濟(jì)...

    lansheng228 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<