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