摘要:錯(cuò)誤檢查拋出異常。用于檢查內(nèi)部錯(cuò)誤,比如上溢和下溢。由于語(yǔ)言完善的問(wèn)題,支持狀態(tài)變量之間的轉(zhuǎn)換,未來(lái)可能會(huì)取消該限制。注意,只能將變量賦值給狀態(tài)變量,而不是本地變量。因?yàn)槲覀冎荒茉跔顟B(tài)變量中分配內(nèi)存空間。
錯(cuò)誤檢查
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)部錯(cuò)誤(internal errors),比如上溢和下溢。可以利用消耗掉所有的 gas的特性,防止或者懲罰惡意攻擊。
if(true){ // 拋出異常,不往下走 throw; } if(true){ // 拋出異常,不往下走 revert(); } // 拋出異常,不往下走 require(false); // 拋出異常,不往下走 assert(false);數(shù)組
數(shù)組(Arrays):相同類型的元素的集合所組成的數(shù)據(jù)結(jié)構(gòu)。
數(shù)組類型:
固定長(zhǎng)度數(shù)組。 uint[5] dynamicArr
動(dòng)態(tài)長(zhǎng)度數(shù)組。 uint[] fixedArr
成員:
length 。 固定長(zhǎng)度數(shù)組為聲明時(shí)的長(zhǎng)度,動(dòng)態(tài)長(zhǎng)度數(shù)組為數(shù)組中含有多少元素。
push 。往動(dòng)態(tài)長(zhǎng)度數(shù)組中增加一個(gè)元素,固定長(zhǎng)度數(shù)組沒(méi)有該方法。
// 聲明 uint[] dynamicArr; uint[3] fixedArr; // 創(chuàng)建數(shù)組 uint[] dynamicArr = new uint[](7); // 賦值長(zhǎng)度為 7 的動(dòng)態(tài)長(zhǎng)度數(shù)組 uint[3] fixedArr = new uint[3](); // 報(bào)錯(cuò) uint[3] fixedArr = [1, 2, 3]; // 賦值長(zhǎng)度為 3 的固定長(zhǎng)度數(shù)組 // 成員賦值 dynamicArr[0] = 1; fixedArr[0] = 1; fixedArr[3] = 1; // 報(bào)錯(cuò) // push 新元素 dynamicArr.push(1); // 正確 fixedArr.push(1); // 報(bào)錯(cuò)。fixedArr 沒(méi)有 push 屬性。 // 訪問(wèn)元素 dynamicArr[1]; // 0 fixedArr[1]; // 2 // 獲取數(shù)組長(zhǎng)度 dynamicArr.length; // push 新元素后,長(zhǎng)度為 7+1。 fixedArr.length // 3 // 改變數(shù)組長(zhǎng)度 dynamicArr.length = dynamicArr.length - 1; // 正確 fixedArr.length = fixedArr.length - 1; // 報(bào)錯(cuò)。不能改變固定長(zhǎng)度數(shù)組的長(zhǎng)度 // 遍歷數(shù)組 for(uint i; i < dynamicArr.length; i++){} for(uint i; i < fixedArr.length; i++){}
// 固定長(zhǎng)度數(shù)組轉(zhuǎn)換為動(dòng)態(tài)長(zhǎng)度數(shù)組。由于語(yǔ)言完善的問(wèn)題,支持狀態(tài)變量之間的轉(zhuǎn)換,未來(lái)可能會(huì)取消該限制。 uint[] x = [1, 3, 4]; // 正確。 uint[] memory x = [1, 3, 4]; // 報(bào)錯(cuò)。固定長(zhǎng)度 memory 的數(shù)組,不能轉(zhuǎn)換為動(dòng)態(tài)長(zhǎng)度 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); // 訪問(wèn)成員 employee.id數(shù)據(jù)存儲(chǔ)
storage 持久性
memory 臨時(shí)空間
calldata 類似 memory,執(zhí)行完后被抹除
相同存儲(chǔ)空間賦值
傳遞引用 reference(EVM 上的內(nèi)存地址)。 storage = storage
不同存儲(chǔ)空間變量賦值
拷貝
memory a = storage ,b 在 memory 內(nèi)存中重新開辟一個(gè)空間給 employee 類型,并且將 employee 這個(gè)值拷貝到 memory 內(nèi)存空間中。將 memory 內(nèi)存地址賦值給 memory 變量。所以 memory 變量?jī)?nèi)存地址并不是指向 storage 內(nèi)存地址,而是一個(gè) memory 變量的全新的地址。同樣的將 memory 賦值給 storage 變量,也會(huì)進(jìn)行一個(gè)拷貝。注意,只能將 memory 變量賦值給狀態(tài)變量,而不是本地 storage 變量。因?yàn)槲覀冎荒茉跔顟B(tài)變量中分配內(nèi)存空間。
delete 初始化變量、刪除數(shù)組中的內(nèi)容
http://www.tryblockchain.org/...
@黃敏之-助教; EVM的定義就是0值等同于回收,把一個(gè)storage設(shè)為0是消耗負(fù)值的gas
實(shí)驗(yàn)結(jié)果: remove約等于remove2,同時(shí)遠(yuǎn)遠(yuǎn)小于remove3和4。且執(zhí)行完remove12后下次remove34的gas消耗大大增加。這個(gè)很有意思。1和2做的都是釋放內(nèi)存的操作,所以有負(fù)gas的福利;釋放內(nèi)存后如果要再賦值,需要重新申請(qǐng)內(nèi)存,所以這樣會(huì)消耗更多的gas。
delete owner delete arr 初始化arr length =0 delete arr[i] 初始化 arr 的某個(gè)元素,但此時(shí) arr[i] 還占據(jù)空間,length 也沒(méi)有變。 // 因此需要以下兩步,真正的刪除元素 arr[i] = arr[arr.length - 1] arr.lenght -= 1;
未完成,待更新...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/23998.html
摘要:和比特幣協(xié)議有所不同的是,以太坊的設(shè)計(jì)十分靈活,極具適應(yīng)性。超級(jí)賬本區(qū)塊鏈的商業(yè)應(yīng)用超級(jí)賬本超級(jí)賬本是基金會(huì)下的眾多項(xiàng)目中的一個(gè)。證書頒發(fā)機(jī)構(gòu)負(fù)責(zé)簽發(fā)撤 showImg(https://segmentfault.com/img/bV2ge9?w=900&h=385); 從比特幣開始 一個(gè)故事告訴你比特幣的原理及運(yùn)作機(jī)制 這篇文章的定位會(huì)比較科普,盡量用類比的方法將比特幣的基本原理講出來(lái)...
摘要:舍去小數(shù)位在以太坊中賬戶有兩種類型普通賬戶和智能合約賬戶。報(bào)酬是小額的以太幣,想要運(yùn)行智能合約的人的需要支付報(bào)酬來(lái)使合約工作。涉及到以太坊智能合約的攻擊的問(wèn)題。 智能合約可以簡(jiǎn)單的理解為一段可執(zhí)行的程序片段,具體的代碼經(jīng)過(guò) Solidity 編寫之后,發(fā)布到區(qū)塊鏈上。而以太坊的智能合約也可以理解為一個(gè)特殊的交易(包括可執(zhí)行代碼的),被發(fā)送出去后會(huì)被礦工打包記錄在某一個(gè)區(qū)塊中,當(dāng)需要調(diào)用...
摘要:另外只能做狀態(tài)變量,不能做本地局部變量。語(yǔ)法聲明映射類型包括類型包括狀態(tài)變量報(bào)錯(cuò)。可視度指的是,決定函數(shù)或者狀態(tài)變量的可以被哪些智能合約可見(jiàn)和調(diào)用。狀態(tài)變量可見(jiàn)性沒(méi)有。在中,通過(guò)來(lái)抽象出狀態(tài)變量自增的代碼,并修飾。 Mapping 映射(Mappings):類似于哈希表。mapping 中任何一個(gè)可能的 key 都對(duì)應(yīng)著一個(gè) value,它的默認(rèn)值是default-value 。底層用...
摘要:引言給迷失在如何學(xué)習(xí)區(qū)塊鏈技術(shù)的同學(xué)一個(gè)指引,區(qū)塊鏈技術(shù)是隨比特幣誕生,因此要搞明白區(qū)塊鏈技術(shù),應(yīng)該先了解下比特幣。但區(qū)塊鏈技術(shù)不單應(yīng)用于比特幣,還有非常多的現(xiàn)實(shí)應(yīng)用場(chǎng)景,想做區(qū)塊鏈應(yīng)用開發(fā),可進(jìn)一步閱讀以太坊系列。 本文始發(fā)于深入淺出區(qū)塊鏈社區(qū), 原文:區(qū)塊鏈技術(shù)學(xué)習(xí)指引 原文已更新,請(qǐng)讀者前往原文閱讀 本章的文章越來(lái)越多,本文是一個(gè)索引帖,方便找到自己感興趣的文章,你也可以使用左側(cè)...
摘要:原文發(fā)表于以太坊智能合約開發(fā)第二篇理解以太坊相關(guān)概念很多人都說(shuō)比特幣是區(qū)塊鏈,以太坊是區(qū)塊鏈。它是以太坊智能合約的運(yùn)行環(huán)境。是由以太坊節(jié)點(diǎn)提供。以太坊社區(qū)把基于智能合約的應(yīng)用稱為去中心化的應(yīng)用。 原文發(fā)表于:以太坊智能合約開發(fā)第二篇:理解以太坊相關(guān)概念 很多人都說(shuō)比特幣是區(qū)塊鏈1.0,以太坊是區(qū)塊鏈2.0。在以太坊平臺(tái)上,可以開發(fā)各種各樣的去中心化應(yīng)用,這些應(yīng)用構(gòu)成了以太坊的整個(gè)生態(tài)...
閱讀 1304·2021-10-08 10:05
閱讀 4127·2021-09-22 15:54
閱讀 3113·2021-08-27 16:18
閱讀 3112·2019-08-30 15:55
閱讀 1445·2019-08-29 12:54
閱讀 2753·2019-08-26 11:42
閱讀 549·2019-08-26 11:39
閱讀 2134·2019-08-26 10:11