摘要:錯誤檢查拋出異常。用于檢查內(nèi)部錯誤,比如上溢和下溢。由于語言完善的問題,支持狀態(tài)變量之間的轉(zhuǎn)換,未來可能會取消該限制。注意,只能將變量賦值給狀態(tài)變量,而不是本地變量。因為我們只能在狀態(tài)變量中分配內(nèi)存空間。
錯誤檢查
throw: 拋出異常。已被廢棄。
revert(): 拋出異常,并回滾到調(diào)用前的狀態(tài)。
require(bool): require(false) 拋出異常,并回滾到調(diào)用前的狀態(tài),并返回剩余的 gas。用于檢查有效條件,比如檢查函數(shù)輸入和返回、檢查調(diào)用者(require(msg.sender == owner))。
assert(bool): 。assert(false) 拋出異常,并回滾到調(diào)用前的狀態(tài),并消耗掉所有的 gas。用于檢查內(nèi)部錯誤(internal errors),比如上溢和下溢??梢岳?strong>消耗掉所有的 gas的特性,防止或者懲罰惡意攻擊。
if(true){ // 拋出異常,不往下走 throw; } if(true){ // 拋出異常,不往下走 revert(); } // 拋出異常,不往下走 require(false); // 拋出異常,不往下走 assert(false);數(shù)組
數(shù)組(Arrays):相同類型的元素的集合所組成的數(shù)據(jù)結(jié)構(gòu)。
數(shù)組類型:
固定長度數(shù)組。 uint[5] dynamicArr
動態(tài)長度數(shù)組。 uint[] fixedArr
成員:
length 。 固定長度數(shù)組為聲明時的長度,動態(tài)長度數(shù)組為數(shù)組中含有多少元素。
push 。往動態(tài)長度數(shù)組中增加一個元素,固定長度數(shù)組沒有該方法。
// 聲明 uint[] dynamicArr; uint[3] fixedArr; // 創(chuàng)建數(shù)組 uint[] dynamicArr = new uint[](7); // 賦值長度為 7 的動態(tài)長度數(shù)組 uint[3] fixedArr = new uint[3](); // 報錯 uint[3] fixedArr = [1, 2, 3]; // 賦值長度為 3 的固定長度數(shù)組 // 成員賦值 dynamicArr[0] = 1; fixedArr[0] = 1; fixedArr[3] = 1; // 報錯 // push 新元素 dynamicArr.push(1); // 正確 fixedArr.push(1); // 報錯。fixedArr 沒有 push 屬性。 // 訪問元素 dynamicArr[1]; // 0 fixedArr[1]; // 2 // 獲取數(shù)組長度 dynamicArr.length; // push 新元素后,長度為 7+1。 fixedArr.length // 3 // 改變數(shù)組長度 dynamicArr.length = dynamicArr.length - 1; // 正確 fixedArr.length = fixedArr.length - 1; // 報錯。不能改變固定長度數(shù)組的長度 // 遍歷數(shù)組 for(uint i; i < dynamicArr.length; i++){} for(uint i; i < fixedArr.length; i++){}
// 固定長度數(shù)組轉(zhuǎn)換為動態(tài)長度數(shù)組。由于語言完善的問題,支持狀態(tài)變量之間的轉(zhuǎn)換,未來可能會取消該限制。 uint[] x = [1, 3, 4]; // 正確。 uint[] memory x = [1, 3, 4]; // 報錯。固定長度 memory 的數(shù)組,不能轉(zhuǎn)換為動態(tài)長度 memory 的數(shù)組。結(jié)構(gòu)體
結(jié)構(gòu)體(Structs): 結(jié)構(gòu)體是一些元素的集合。合法元素類型包括:值類型、數(shù)組和映射等,不包括:結(jié)構(gòu)體。
// 聲明 struc Employee{ // 大寫 E address id; uint salary; uint lastPayDay; } // 創(chuàng)建結(jié)構(gòu)體 Employee employee = Employee(0x1, 0, 0); // 訪問成員 employee.id數(shù)據(jù)存儲
storage 持久性
memory 臨時空間
calldata 類似 memory,執(zhí)行完后被抹除
相同存儲空間賦值
傳遞引用 reference(EVM 上的內(nèi)存地址)。 storage = storage
不同存儲空間變量賦值
拷貝
memory a = storage ,b 在 memory 內(nèi)存中重新開辟一個空間給 employee 類型,并且將 employee 這個值拷貝到 memory 內(nèi)存空間中。將 memory 內(nèi)存地址賦值給 memory 變量。所以 memory 變量內(nèi)存地址并不是指向 storage 內(nèi)存地址,而是一個 memory 變量的全新的地址。同樣的將 memory 賦值給 storage 變量,也會進(jìn)行一個拷貝。注意,只能將 memory 變量賦值給狀態(tài)變量,而不是本地 storage 變量。因為我們只能在狀態(tài)變量中分配內(nèi)存空間。
delete 初始化變量、刪除數(shù)組中的內(nèi)容
http://www.tryblockchain.org/...
@黃敏之-助教; EVM的定義就是0值等同于回收,把一個storage設(shè)為0是消耗負(fù)值的gas
實驗結(jié)果: remove約等于remove2,同時遠(yuǎn)遠(yuǎn)小于remove3和4。且執(zhí)行完remove12后下次remove34的gas消耗大大增加。這個很有意思。1和2做的都是釋放內(nèi)存的操作,所以有負(fù)gas的福利;釋放內(nèi)存后如果要再賦值,需要重新申請內(nèi)存,所以這樣會消耗更多的gas。
delete owner delete arr 初始化arr length =0 delete arr[i] 初始化 arr 的某個元素,但此時 arr[i] 還占據(jù)空間,length 也沒有變。 // 因此需要以下兩步,真正的刪除元素 arr[i] = arr[arr.length - 1] arr.lenght -= 1;
未完成,待更新...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/23998.html
摘要:和比特幣協(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); 從比特幣開始 一個故事告訴你比特幣的原理及運(yùn)作機(jī)制 這篇文章的定位會比較科普,盡量用類比的方法將比特幣的基本原理講出來...
摘要:舍去小數(shù)位在以太坊中賬戶有兩種類型普通賬戶和智能合約賬戶。報酬是小額的以太幣,想要運(yùn)行智能合約的人的需要支付報酬來使合約工作。涉及到以太坊智能合約的攻擊的問題。 智能合約可以簡單的理解為一段可執(zhí)行的程序片段,具體的代碼經(jīng)過 Solidity 編寫之后,發(fā)布到區(qū)塊鏈上。而以太坊的智能合約也可以理解為一個特殊的交易(包括可執(zhí)行代碼的),被發(fā)送出去后會被礦工打包記錄在某一個區(qū)塊中,當(dāng)需要調(diào)用...
摘要:另外只能做狀態(tài)變量,不能做本地局部變量。語法聲明映射類型包括類型包括狀態(tài)變量報錯。可視度指的是,決定函數(shù)或者狀態(tài)變量的可以被哪些智能合約可見和調(diào)用。狀態(tài)變量可見性沒有。在中,通過來抽象出狀態(tài)變量自增的代碼,并修飾。 Mapping 映射(Mappings):類似于哈希表。mapping 中任何一個可能的 key 都對應(yīng)著一個 value,它的默認(rèn)值是default-value 。底層用...
摘要:引言給迷失在如何學(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è)...
摘要:原文發(fā)表于以太坊智能合約開發(fā)第二篇理解以太坊相關(guān)概念很多人都說比特幣是區(qū)塊鏈,以太坊是區(qū)塊鏈。它是以太坊智能合約的運(yùn)行環(huán)境。是由以太坊節(jié)點(diǎn)提供。以太坊社區(qū)把基于智能合約的應(yīng)用稱為去中心化的應(yīng)用。 原文發(fā)表于:以太坊智能合約開發(fā)第二篇:理解以太坊相關(guān)概念 很多人都說比特幣是區(qū)塊鏈1.0,以太坊是區(qū)塊鏈2.0。在以太坊平臺上,可以開發(fā)各種各樣的去中心化應(yīng)用,這些應(yīng)用構(gòu)成了以太坊的整個生態(tài)...
閱讀 1343·2021-10-08 10:05
閱讀 4170·2021-09-22 15:54
閱讀 3131·2021-08-27 16:18
閱讀 3134·2019-08-30 15:55
閱讀 1476·2019-08-29 12:54
閱讀 2777·2019-08-26 11:42
閱讀 579·2019-08-26 11:39
閱讀 2158·2019-08-26 10:11