solidity-2.數(shù)據(jù)類型

數(shù)據(jù)類型有Value Types值類型Reference Types引用類型

Value Types 值類型

Address 地址

長度:20 byte
注意:非address類型的數(shù)據(jù)也可以強(qiáng)制轉(zhuǎn)換成address
address的成員
balance變量氮块,獲取地址的eth余額(單位是wei)
transfer(uint256 amount)润歉,發(fā)送eth到一個(gè)地址洞慎,如果執(zhí)行失敗拋出異常糟趾,合約將停止執(zhí)行
send(uint256 amount)鸣皂,發(fā)送eth到一個(gè)地址滋早,如果執(zhí)行失敗返回false峡钓,合約繼續(xù)執(zhí)行
call, callcode and delegatecall 看不懂

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

Fixed-size byte arrays 固定大小字節(jié)數(shù)組

bytes1, bytes2, bytes3, …, bytes32

Enums 枚舉

Function Types 函數(shù)類型

函數(shù)類型定義如下:

function (<parameter types>) {internal|external} [pure|constant|view|payable] [returns (<return types>)]

函數(shù)類型即是函數(shù)這種特殊的類型巾遭。

  • 可以將一個(gè)函數(shù)賦值給一個(gè)變量,一個(gè)函數(shù)類型的變量平道。
  • 還可以將一個(gè)函數(shù)作為參數(shù)進(jìn)行傳遞睹欲。
  • 也可以在函數(shù)調(diào)用中返回一個(gè)函數(shù)。

函數(shù)類型有兩類;可分為internalexternal函數(shù)一屋。
若不寫類型窘疮,默認(rèn)的函數(shù)類型是internal的。

注意:
this.f 訪問外部函數(shù)
f 訪問內(nèi)部函數(shù)

內(nèi)部函數(shù)的調(diào)用:在EVM會(huì)翻譯成簡單的跳轉(zhuǎn)指令冀墨。
外部函數(shù)的調(diào)用:不是EVM的跳轉(zhuǎn)指令闸衫,而是發(fā)起一個(gè)消息調(diào)用

內(nèi)部函數(shù)例子

pragma solidity ^0.4.16;

library ArrayUtils {
  // internal functions can be used in internal library functions because
  // they will be part of the same code context
  function map(uint[] memory self, function (uint) pure returns (uint) f)
    internal
    pure
    returns (uint[] memory r)
  {
    r = new uint[](self.length);
    for (uint i = 0; i < self.length; i++) {
      r[i] = f(self[i]);
    }
  }
  function reduce(
    uint[] memory self,
    function (uint, uint) pure returns (uint) f
  )
    internal
    pure
    returns (uint r)
  {
    r = self[0];
    for (uint i = 1; i < self.length; i++) {
      r = f(r, self[i]);
    }
  }
  function range(uint length) internal pure returns (uint[] memory r) {
    r = new uint[](length);
    for (uint i = 0; i < r.length; i++) {
      r[i] = i;
    }
  }
}

contract Pyramid {
  using ArrayUtils for *;
  function pyramid(uint l) public pure returns (uint) {
    return ArrayUtils.range(l).map(square).reduce(sum);
  }
  function square(uint x) internal pure returns (uint) {
    return x * x;
  }
  function sum(uint x, uint y) internal pure returns (uint) {
    return x + y;
  }
}

內(nèi)部函數(shù)例子

pragma solidity ^0.4.22;

contract Oracle {
  struct Request {
    bytes data;
    function(bytes memory) external callback;
  }
  Request[] requests;
  event NewRequest(uint);
  function query(bytes data, function(bytes memory) external callback) public {
    requests.push(Request(data, callback));
    emit NewRequest(requests.length - 1);
  }
  function reply(uint requestID, bytes response) public {
    // Here goes the check that the reply comes from a trusted source
    requests[requestID].callback(response);
  }
}

contract OracleUser {
  Oracle constant oracle = Oracle(0x1234567); // known contract
  function buySomething() {
    oracle.query("USD", this.oracleResponse);
  }
  function oracleResponse(bytes response) public {
    require(
        msg.sender == address(oracle),
        "Only oracle can call this."
    );
    // Use the data
  }
}

Reference Types 引用類型

引用類型的保存比值類型要昂貴的多。

Data location 數(shù)據(jù)存儲(chǔ)位置

  • storage 永久存儲(chǔ)
  • memory 內(nèi)存
  • calldata 內(nèi)存只讀

強(qiáng)制數(shù)據(jù)存儲(chǔ)位置:
沒有返回參數(shù)的外部函數(shù): calldata
合約的狀態(tài)變量: storage

默認(rèn)數(shù)據(jù)存儲(chǔ)位置:
有返回值的函數(shù): memory
局部變量: storage

arrays 數(shù)組類型

成員

length變量
push方法

  • structs 結(jié)構(gòu)類型
    案例如下:
pragma solidity ^0.4.11;

contract CrowdFunding {
    // Defines a new type with two fields.
    struct Funder {
        address addr;
        uint amount;
    }

    struct Campaign {
        address beneficiary;
        uint fundingGoal;
        uint numFunders;
        uint amount;
        mapping (uint => Funder) funders;
    }

    uint numCampaigns;
    mapping (uint => Campaign) campaigns;

    function newCampaign(address beneficiary, uint goal) public returns (uint campaignID) {
        campaignID = numCampaigns++; // campaignID is return variable
        // Creates new struct and saves in storage. We leave out the mapping type.
        campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
    }

    function contribute(uint campaignID) public payable {
        Campaign storage c = campaigns[campaignID];
        // Creates a new temporary memory struct, initialised with the given values
        // and copies it over to storage.
        // Note that you can also use Funder(msg.sender, msg.value) to initialise.
        c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
        c.amount += msg.value;
    }

    function checkGoalReached(uint campaignID) public returns (bool reached) {
        Campaign storage c = campaigns[campaignID];
        if (c.amount < c.fundingGoal)
            return false;
        uint amount = c.amount;
        c.amount = 0;
        c.beneficiary.transfer(amount);
        return true;
    }
}

Mappings 映射類型

pragma solidity ^0.4.0;

contract MappingExample {
    mapping(address => uint) public balances;

    function update(uint newBalance) public {
        balances[msg.sender] = newBalance;
    }
}

contract MappingUser {
    function f() public returns (uint) {
        MappingExample m = new MappingExample();
        m.update(100);
        return m.balances(this);
    }
}

Operators Involving LValues 運(yùn)算符

一般運(yùn)算符

a += e
-=, *=, /=, %=, |=, &= and ^=
a++ and a--

delete運(yùn)算符诽嘉,重置值/對(duì)象蔚出。

比如uint a = 10;delete a;
將a重置為0

pragma solidity ^0.4.0;

contract DeleteExample {
    uint data;
    uint[] dataArray;

    function f() public {
        uint x = data;
        delete x; // sets x to 0, does not affect data
        delete data; // sets data to 0, does not affect x which still holds a copy
        uint[] storage y = dataArray;
        delete dataArray; // this sets dataArray.length to zero, but as uint[] is a complex object, also
        // y is affected which is an alias to the storage object
        // On the other hand: "delete y" is not valid, as assignments to local variables
        // referencing storage objects can only be made from existing storage objects.
    }
}

Conversions between Elementary Types 數(shù)據(jù)類型轉(zhuǎn)換

Implicit Conversions 隱式轉(zhuǎn)換

address可以顯示轉(zhuǎn)為合約實(shí)例,同時(shí)合約實(shí)例也可以顯示轉(zhuǎn)換為address

MyContract contractInstance = MyContract(address mycontractAddress);
address mycontractAddress = address(contractInstance);

只能轉(zhuǎn)換成比自己位數(shù)大的數(shù)據(jù)類型虫腋,比如:
uint8 轉(zhuǎn) uint16
uint160轉(zhuǎn)address

Explicit Conversions 顯式轉(zhuǎn)換

int8 y = -3;
uint x = uint(y);

Type Deduction 未聲明類型

有些時(shí)候骄酗,定義變量時(shí)沒有聲明數(shù)據(jù)類型,使用默認(rèn)的悦冀。比如:

uint24 x = 0x123;
var y = x;

在這里趋翻,y使用var定義,它的類型將與x一致盒蟆,是uint

timestamp

私有鏈區(qū)塊時(shí)間戳案例:

  • blockNumber: 0 timestamp: 0,
  • blockNumber: 1 timestamp: 1526613702,
  • blockNumber: 4993 timestamp: 1529483513,
  • blockNumber: 4994 timestamp: 1529483514,
  • blockNumber: 4995 timestamp: 1529544543,
  • blockNumber: 4996 timestamp: 1529544712,
  • blockNumber: 4997 timestamp: 1529544713,

block.timestamp (uint): 自 unix epoch 起始當(dāng)前區(qū)塊以秒計(jì)的時(shí)間戳

timestamp 以s為單位

  • 1天 = 24h = 2460m = 2460*60s = 86400s
  • 1小時(shí) = 3600s
  • 1分鐘 = 60s
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踏烙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子历等,更是在濱河造成了極大的恐慌宙帝,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件募闲,死亡現(xiàn)場(chǎng)離奇詭異步脓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門靴患,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仍侥,“玉大人,你說我怎么就攤上這事鸳君∨┰ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵或颊,是天一觀的道長砸紊。 經(jīng)常有香客問我,道長囱挑,這世上最難降的妖魔是什么醉顽? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮平挑,結(jié)果婚禮上游添,老公的妹妹穿的比我還像新娘。我一直安慰自己通熄,他們只是感情好唆涝,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著唇辨,像睡著了一般廊酣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赏枚,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天亡驰,我揣著相機(jī)與錄音,去河邊找鬼嗡贺。 笑死隐解,一個(gè)胖子當(dāng)著我的面吹牛鞍帝,可吹牛的內(nèi)容都是我干的诫睬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼帕涌,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摄凡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚓曼,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤亲澡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纫版,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體床绪,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癞己。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀斋。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖痹雅,靈堂內(nèi)的尸體忽然破棺而出仰担,到底是詐尸還是另有隱情,我是刑警寧澤绩社,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布摔蓝,位于F島的核電站,受9級(jí)特大地震影響愉耙,放射性物質(zhì)發(fā)生泄漏贮尉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一劲阎、第九天 我趴在偏房一處隱蔽的房頂上張望绘盟。 院中可真熱鬧,春花似錦悯仙、人聲如沸龄毡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽沦零。三九已至,卻和暖如春货岭,著一層夾襖步出監(jiān)牢的瞬間路操,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工千贯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屯仗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓搔谴,卻偏偏與公主長得像魁袜,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子敦第,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 1. Re-Entrancy重新入口 以太坊智能合約的一個(gè)特點(diǎn)是能夠調(diào)用和使用其他外部合約的代碼峰弹。合約也通常可以處...
    筆名輝哥閱讀 11,492評(píng)論 0 56
  • 通讀solidity官方文檔芜果,參考資料 Solidity是一種面向合同編寫的高級(jí)語言鞠呈,用于實(shí)現(xiàn)智能合同。它受到c+...
    蟲哥閱讀 1,483評(píng)論 0 0
  • 原文:Smart contracts 正如我們?cè)赱intro]中看到的那樣右钾,以太坊中有兩種不同類型的帳戶:外部擁有...
    Jisen閱讀 4,919評(píng)論 1 7
  • 我以為我是偉大的 你以為我是善良的 但其實(shí) 我是后悔的 我 不知道 我是不是對(duì)的 但 我希望 我是對(duì)的
    芮的小幸福噠閱讀 164評(píng)論 0 0
  • 周末是個(gè)值得期待的日子蚁吝,兒子會(huì)從學(xué)泻当回來。成人的世界窘茁,多了太多忙碌和身不由己疼鸟,孩子的世界,如同一股清流庙曙,慰籍燦爛陽...
    SarahHan閱讀 127評(píng)論 0 0