1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      solidity全局變量有哪些

      本篇內(nèi)容介紹了“solidity全局變量有哪些”的有關(guān)知識,在實(shí)際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

      創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供蕉嶺網(wǎng)站建設(shè)、蕉嶺做網(wǎng)站、蕉嶺網(wǎng)站設(shè)計(jì)、蕉嶺網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、蕉嶺企業(yè)網(wǎng)站模板建站服務(wù),十載蕉嶺做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

      雜項(xiàng)

      存儲中狀態(tài)變量的布局

      靜態(tài)尺寸大小的變量(除了映射和動態(tài)尺寸大小的數(shù)組類型(的其他類型變量))在存儲中,是從位置0連續(xù)存儲。如果可能的話,不足32個字節(jié)的多個條目被緊湊排列在一個單一的存儲塊,參見以下規(guī)則:

      • 在存儲塊中的第一項(xiàng)是存儲低階對齊的。

      • 基本類型只使用了正好存儲它們的字節(jié)數(shù)。

      • 如果一個基本類型不適合存儲塊的剩余部分,則移動到下一個存儲塊中。

      • 結(jié)構(gòu)和數(shù)組的數(shù)據(jù)總是開始一個新的塊并且占整個塊(根據(jù)這些規(guī)則,結(jié)構(gòu)或數(shù)組項(xiàng)都是緊湊排列的)。

      結(jié)構(gòu)和數(shù)組元素是一個接著一個存儲排列的,就如當(dāng)初它們被聲明的次序。

      由于無法預(yù)知的分配的大小,映射和動態(tài)尺寸大小的數(shù)組類型(這兩種類型)是使用sha3 計(jì)算來找到新的起始位置,來存放值或者數(shù)組數(shù)據(jù)。這些起始位置總是滿棧塊。

      根據(jù)上述規(guī)則,映射或動態(tài)數(shù)組本身存放在(沒有填滿)的存儲塊位置p(或從映射到映射或數(shù)組遞歸應(yīng)用此規(guī)則)。對于一個動態(tài)數(shù)組,存儲塊存儲了數(shù)組元素的數(shù)目(字節(jié)數(shù)組和字符串是一個例外,見下文)。對于映射,存儲塊是未使用的(但它是需要的,因此,前后相鄰的兩個相同的映射,將使用一個不同的hash分布)。數(shù)組數(shù)據(jù)位于sha3(p), 對應(yīng)于一個映射key值k位于 sha3(k . p)  (這里 . 是連接符)。如果該值又是一個非基本類型,位置的偏移量是sha3(k . p)。

      如果bytes 和 string是短類型的,它們將和其長度存儲在同一個存儲塊里。特別是:如果數(shù)據(jù)最長31字節(jié),它被存儲在高階字節(jié)(左對齊), 低字節(jié)存儲length* 2。 如果是長類型,主存儲塊存儲 length* 2 + 1,  數(shù)據(jù)存儲在sha3(shot)。

      因此,本合約片段如下:

      contract c {
      
        struct S { uint a; uint b; }
      
        uint x;
      
        mapping(uint => mapping(uint => S)) data;
      
      }

      深奧的特點(diǎn)

      在Solidity的類型系統(tǒng)中,有一些在語法中沒有對應(yīng)的類型。其中就有函數(shù)的類型。但若使用 var (這個關(guān)鍵字),該函數(shù)就被認(rèn)為是這個類型的局部變量:

      contract FunctionSelector {
      
        function select(bool useB, uint x) returns (uint z) {
      
          var f = a;
      
          if (useB) f = b;
      
          return f(x);
      
        }
      
        function a(uint x) returns (uint z) {
      
          return x * x;
      
        }
      
        function b(uint x) returns (uint z) {
      
          return 2 * x;
      
        }
      
      }

      (在上面的程序片段中)

      若調(diào)用select(false, x),  就會計(jì)算 x * x 。若調(diào)用select(true, x))就會計(jì)算 2 * x。

      內(nèi)部-優(yōu)化器

      Solidity 優(yōu)化器是在匯編級別上的操作,所以它也可以同時被其他語言所使用。它將指令的(執(zhí)行)次序,在JUMP 和 JUMPDEST上分成基本的塊。在這些塊中,指令被解析 。 堆棧、內(nèi)存或存儲上的每一次修改,都將作為表達(dá)式被記錄。該表達(dá)式包括一條指令以及指向其他表達(dá)式的一系列參數(shù)的一個指針。現(xiàn)在的主要意思是要找到相等的表達(dá)式(在每次輸入),做成了表達(dá)式的類。優(yōu)化器首先在已知的表達(dá)式列表里找,若找不到的話,就根據(jù)constant + constant = sum_of_constants  或 X * 1 = X  來簡化。 因?yàn)檫@樣做是遞歸的,如果第二個因子是一個更復(fù)雜的表達(dá)式,我們也可以應(yīng)用latter規(guī)則來計(jì)算。存儲和內(nèi)存位置的修改,是不知道存儲和內(nèi)存的位置的區(qū)別。如果我們先寫到的位置x,再寫到位置y , x,y均是輸入變量。第二個可以覆寫第一個,所以我們不知道x是存放在y之后的。另一方面,如果一個簡化的表達(dá)式 x-y 能計(jì)算出一個非零常數(shù),我們就知道x存放的內(nèi)容。

      在這個過程結(jié)束時,我們知道,表達(dá)式必須在堆棧中結(jié)尾,并有一系列對內(nèi)存和存儲的修改。這些信息存儲在block上,并鏈接這些block。此外,有關(guān)堆棧,存儲和內(nèi)存配置的信息會轉(zhuǎn)發(fā)到下一個block。如果我們知道所有的 JUMP 和 JUMPI 指令,我們可以建立一個完整的程序控制流圖。如果我們不知道目標(biāo)塊(原則上,跳轉(zhuǎn)目標(biāo)是從輸入里得到的),我們必須清除所有輸入狀態(tài)的存儲塊上的信息,(因?yàn)樗哪繕?biāo)塊未知)。如果條件計(jì)算的結(jié)果為一個常量,它轉(zhuǎn)化為一個無條件jump。

      作為最后一步,在每個塊中的代碼完全可以重新生成。從堆棧里block的結(jié)尾表達(dá)式開始,創(chuàng)建一個依賴關(guān)系圖。每個不是這個圖上的操作將舍棄。現(xiàn)在能按照原來代碼的順序,生成對存儲和內(nèi)存修改的代碼(舍棄不必要的修改)。最后,在正確位置的堆棧上,生成所有的值。

      這些步驟適用于每一個基本塊, 如果它是較小的,用新生成的代碼來替換。如果一個基本塊在JUMPI上進(jìn)行分割,在分析過程中,條件表達(dá)式的結(jié)果計(jì)算為一個常數(shù),JUMP就用常量值進(jìn)行替換。代碼如下

      var x = 7;
      
      data[7] = 9;
      
      if (data[x] != x + 2)
      
        return 2;
      
      else
      
        return 1;

      簡化成下面可以編譯的形式

      data[7] = 9;
      
      return 1;

      即使在開始處包含有jump指令

      使用命令行編譯器

      一個 Solidity 庫構(gòu)建的目標(biāo)是solc, Solidity命令行編譯器。使用solc –help  為您提供所有選項(xiàng)的解釋。編譯器可以產(chǎn)生不同的輸出,從簡單的二進(jìn)制文件,程序集的抽象語法樹(解析樹)到gas使用的估量。如果你只想編譯一個文件,你運(yùn)行solc –bin sourceFile.sol , 將會打印出二進(jìn)制。你部署你的合約之前,使用solc –optimize –bin sourceFile.sol 來激活優(yōu)化器。如果你想獲得一些solc更進(jìn)一步的輸出變量,可以使用solc -o outputDirectory –bin –ast –asm sourceFile.sol,(這條命令)將通知編譯器輸出結(jié)果到單獨(dú)的文件中。

      命令行編譯器會自動從文件系統(tǒng)中讀取輸入文件,但也可以如下列方法,提供重定向路徑prefix=path :

      solc github.com/ethereum/dapp-bin/=/usr/local/lib/dapp-bin/ =/usr/local/lib/fallback file.sol

      該命令告訴編譯器在/usr/local/lib/dapp-bin目錄下,尋找以github.com/ethereum/dapp-bin/  開頭的文件,如果找不到的話,到usr/local/lib/fallback目錄下找(空前綴總是匹配)。

      solc不會從remapping目標(biāo)的外部,或者顯式定義的源文件的外部文件系統(tǒng)讀取文件,所以要寫成 import “/etc/passwd”;     只有增加 =/ 作為remapping,程序才能工作。

      如果remapping里找到了多個匹配,則選擇有共同的前綴最長的那個匹配。

      如果你的合約使用了  libraries ,你會注意到字節(jié)碼中包含了 form LibraryName 這樣的子字符串。你可以在這些地方使用solc 作為鏈接器,來插入庫地址 :

      Either add –libraries “Math:0x12345678901234567890 Heap:0xabcdef0123456”    提供每個庫的地址, 或者在文件中存放字符串(每行一個庫)

      然后運(yùn)行solc,后面寫 –libraries fileName.

      如果solc后面接著 –link 選項(xiàng),所有輸入文件將被解釋為未鏈接的二進(jìn)制文件(十六進(jìn)制編碼), LibraryName形式如前所述, 庫此時被鏈接(從stdin讀取輸入,從stdout輸出)。在這種情況下,除了–libraries,其他所有的選項(xiàng)都將被忽略(包括 -o)

      提示和技巧

      • 在數(shù)組中使用delete,就是刪除數(shù)組中的所有元素。

      • 使用較短的類型和結(jié)構(gòu)元素,短類型分組在一起進(jìn)行排序。sstore操作可能合并成一個單一的sstore,這可以降低gas的成本(sstore消耗5000或20000 gas,所以這是你必須優(yōu)化的原因)。使用天gas的價格估算功能(優(yōu)化器 enable)進(jìn)行檢查!

      • 讓你的狀態(tài)變量公開,編譯器會免費(fèi)創(chuàng)建 getters 。

      • 如果你結(jié)束了輸入或狀態(tài)的檢查條件,請嘗試使用函數(shù)修飾符。

      • 如果你的合約有一個功能send, 但你想使用內(nèi)置的send功能,請使用 address(contractVariable).send(amount)。

      • 如果你不想你的合約通過send接收ether,您可以添加一個拋出回退函數(shù) function() { throw; }.。

      • 用單條賦值語句初始化存儲結(jié)構(gòu):x = MyStruct({a: 1, b: 2});

      陷阱

      不幸的是,還有一些編譯器微妙的情況還沒有告訴你。

      • 在for (var i = 0; i < arrayName.length; i++) { ... },  i的類型是uint8,因?yàn)檫@是存放值0最小的類型。如果數(shù)組元素超過255個,則循環(huán)將不會終止。

      列表

      全局變量

      • block.coinbase (address):當(dāng)前塊的礦場的地址

      • block.difficulty (uint):當(dāng)前塊的難度

      • block.gaslimit (uint):當(dāng)前塊的gaslimit

      • block.number (uint):當(dāng)前塊的數(shù)量

      • block.blockhash (function(uint) returns (bytes32)):給定的塊的hash值, 只有最近工作的256個塊的hash值

      • block.timestamp (uint):當(dāng)前塊的時間戳

      • msg.data (bytes):完整的calldata

      • msg.gas (uint): 剩余gas

      • msg.sender (address):消息的發(fā)送者(當(dāng)前調(diào)用)

      • msg.value (uint):和消息一起發(fā)送的wei的數(shù)量

      • now (uint):當(dāng)前塊的時間戳(block.timestamp的別名)

      • tx.gasprice (uint):交易的gas價格

      • tx.origin (address):交易的發(fā)送者(全調(diào)用鏈)

      • sha3(...) returns (bytes32):計(jì)算(緊湊排列的)參數(shù)的 Ethereum-SHA3  hash值 

      • sha256(...) returns (bytes32)計(jì)算(緊湊排列的)參數(shù)的SHA256 hash值 

      • ripemd160(...) returns (bytes20):計(jì)算 256個(緊湊排列的)參數(shù)的RIPEMD

      • ecrecover(bytes32, uint8, bytes32, bytes32) returns (address):橢圓曲線簽名公鑰恢復(fù)

      • addmod(uint x, uint y, uint k) returns (uint):計(jì)算(x + y)K,加法為任意精度,不以2 ** 256取余

      • mulmod(uint x, uint y, uint k) returns (uint):計(jì)算(XY)K,乘法為任意精度,不以2 * 256取余

      • this (current contract’s type): 當(dāng)前合約,在地址上顯式轉(zhuǎn)換

      • super:在層次關(guān)系上一層的合約

      • selfdestruct(address):銷毀當(dāng)前的合同,將其資金發(fā)送到指定address地址

      • .balance:address地址中的賬戶余額(以wei為單位)

      • .send(uint256) returns (bool):將一定量wei發(fā)送給address地址,若失敗返回false。

      函數(shù)可見性定義符

      function myFunction()  returns (bool) {
      
          return true;
      
      }
      • public:在外部和內(nèi)部均可見(創(chuàng)建存儲/狀態(tài)變量的訪問者函數(shù))

      • private:僅在當(dāng)前合約中可見

      • external: 只有外部可見(僅對函數(shù))- 僅僅在消息調(diào)用中(通過this.fun)

      • internal: 只有內(nèi)部可見

      Modifiers

      • constant for state variables: Disallows assignment (except initialisation), does not occupy storage slot.

      • constant for functions: Disallows modification of state - this is not enforced yet.

      • anonymous for events: Does not store event signature as topic.

      • indexed for event parameters: Stores the parameter as topic.

      修飾符

      • constant for state variables: 不允許賦值(除了初始化),不占用存儲塊。

      • constant for functions:不允許改變狀態(tài)- 這個目前不是強(qiáng)制的。

      • anonymous for events:不能將topic作為事件指紋進(jìn)行存儲。

      • indexed for event parameters: 將topic作為參數(shù)存儲。

      “solidity全局變量有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!


      文章名稱:solidity全局變量有哪些
      當(dāng)前URL:http://www.ef60e0e.cn/article/pesopc.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        民权县| 桂林市| 乐安县| 扎囊县| 全椒县| 池州市| 东丽区| 清涧县| 五莲县| 益阳市| 绥芬河市| 宜城市| 凉城县| 禄丰县| 蒲城县| 神木县| 明溪县| 绥芬河市| 新乐市| 务川| 天峻县| 会同县| 溆浦县| 阜康市| 锡林郭勒盟| 新竹县| 营口市| 遂溪县| 宁波市| 海晏县| 宽城| 博罗县| 民丰县| 浠水县| 阿拉善左旗| 六枝特区| 房产| 望江县| 江都市| 安新县| 墨竹工卡县|