Merkle Tree
默克爾帕樹(Merkle Patricia tree/trie)
- 由Alan Reiner提出設(shè)想辆琅,并在瑞波協(xié)議中得到實(shí)現(xiàn)狭握,是以太坊的主要數(shù)據(jù)結(jié)構(gòu)炎辨,用于存儲(chǔ)所有賬戶狀態(tài),以及每個(gè)區(qū)塊中的交易和收據(jù)數(shù)據(jù)菇爪。MPT是默克爾樹和帕特里夏樹的結(jié)合縮寫;
- 每個(gè)唯一鍵值對(duì)唯一映射到根的hash值;在MPT中柒昏,不可能僅用一個(gè)鍵值對(duì)來(lái)欺騙成員(除非攻擊者有~2^128 的算力)凳宙;
- 增、刪昙楚、改鍵值對(duì)的時(shí)間復(fù)雜度是對(duì)數(shù)級(jí)別近速。
MPT的具體設(shè)計(jì)決策
有兩類節(jié)點(diǎn)KV節(jié)點(diǎn)和離散節(jié)點(diǎn) KV節(jié)點(diǎn)的存在提高了效率诈嘿,因?yàn)槿绻谔囟▍^(qū)域樹是稀疏的,KV節(jié)點(diǎn)可作為一個(gè)“快捷方式”削葱,代替深度為64的樹奖亚。
離散節(jié)點(diǎn)是16進(jìn)制,不是二進(jìn)制
這樣讓查找更有效率析砸,我們現(xiàn)在認(rèn)識(shí)到這種選擇并不理想昔字,因?yàn)?6進(jìn)制樹的查找效率在二進(jìn)制中可以通過(guò)批次存儲(chǔ)節(jié)點(diǎn)來(lái)模擬。MPT樹的結(jié)構(gòu)實(shí)現(xiàn)是非常容易出錯(cuò)的首繁,最終至少會(huì)造成狀態(tài)根不匹配作郭。空值(empty value)與非會(huì)員(non-membership)之間沒有區(qū)別
這樣做是為了簡(jiǎn)化邏輯,以太坊中未設(shè)置的值默認(rèn)為0弦疮,空字符串也用0表示夹攒。然而,需要強(qiáng)調(diào)的是胁塞,這樣做犧牲了一些通用性咏尝,因而也不是最優(yōu)的。終節(jié)點(diǎn)和非終節(jié)點(diǎn)的區(qū)別
技術(shù)上啸罢,標(biāo)識(shí)一個(gè)節(jié)點(diǎn)“是否是終節(jié)點(diǎn)”是沒必要的编检,因?yàn)橐蕴恢兴械臉涠急挥糜诖鎯?chǔ)靜態(tài)秘鑰長(zhǎng)度,但為了增加通用性扰才,我們還是會(huì)添加這個(gè)標(biāo)識(shí)允懂,以期望以太坊的MPT的實(shí)現(xiàn)方式能夠被其他加密貨幣原樣采納。在安全樹中采用SHA3(k)作為秘鑰(在狀態(tài)樹和賬戶存儲(chǔ)樹中使用)
使用SHA3(k)衩匣,通過(guò)設(shè)置離散節(jié)點(diǎn)的鏈的深度為64蕾总,以及反復(fù)調(diào)用SLOAD 和 SSTORE指令,使那些企圖對(duì)樹采取Dos攻擊的行為變得非常困難琅捏。不過(guò)谤专,這也讓窮舉樹的節(jié)點(diǎn)變得困難,如果你希望你的客戶端有窮舉的能力午绳,最簡(jiǎn)單的方法是維持一個(gè)數(shù)據(jù)庫(kù)映射:sha3(k) -> k
RLP
RLP(recursive length prefix)###
- 遞歸長(zhǎng)度前綴 RLP編碼是以太坊中主要的序列化格式置侍,它的使用無(wú)處不在:區(qū)塊、交易拦焚、賬戶狀態(tài)以及線路協(xié)議消息,旨在成為高度簡(jiǎn)化的序列化格蜡坊,。
- RLP唯一的目的是存儲(chǔ)嵌套的字節(jié)數(shù)組 不同于protobuf赎败、BSON等現(xiàn)有的解決方案秕衙,RLP并不定義任何指定的數(shù)據(jù)類型,如Boolean僵刮、floa据忘、double或者integer鹦牛。它僅僅是以嵌套數(shù)組的形式存儲(chǔ)結(jié)構(gòu),并將其留給協(xié)議來(lái)確定數(shù)組的含義勇吊。
- RLP也沒有明確支持map集合 半官方的建議是采用 [[k1, v1], [k2, v2], ...] 的嵌套數(shù)組來(lái)表示鍵值對(duì)集合曼追,k1,k2 ... 按照字符串的標(biāo)準(zhǔn)排序。
Trie 樹的使用
狀態(tài)樹汉规、交易樹礼殊、收據(jù)樹
- 以太坊區(qū)塊鏈中每個(gè)區(qū)塊頭都包含指向三個(gè)樹的指針:狀態(tài)樹、交易樹针史、收據(jù)樹晶伦。
- 狀態(tài)樹代表訪問區(qū)塊后的整個(gè)狀態(tài);
- 交易樹代表區(qū)塊中所有交易啄枕,這些交易由index索引作為key婚陪;(例如,k0:第一個(gè)執(zhí)行的交易频祝,k1:第二個(gè)執(zhí)行的交易)
- 收據(jù)樹代表每筆交易相應(yīng)的收據(jù)近忙。交易的收據(jù)是一個(gè)RLP編碼的數(shù)據(jù)結(jié)構(gòu):
[ medstate, gas_used, logbloom, logs ]
其中:
- medstate:交易處理后,樹的根的狀態(tài)智润;
- gas_used:交易處理后,gas的使用量未辆;
- logbloom:交易中所有l(wèi)ogs的address和topic組成的布隆過(guò)濾器(一種二進(jìn)制向量數(shù)據(jù)結(jié)構(gòu)窟绷,具有很好的空間和時(shí)間效率,被用來(lái)檢測(cè)一個(gè)元素是不是集合中的一個(gè)成員)
- logs:是表格[address, [topic1, topic2...], data]元素的列表咐柜。表格由交易執(zhí)行期間調(diào)用的操作碼LOG0 ... LOG4 生成(包含主調(diào)用和子調(diào)用)桅滋;address 是生成日志的合約的地址topics是最多4個(gè)32字節(jié)的值蔽午;data 是任意字節(jié)大小的數(shù)組;
過(guò)時(shí)區(qū)塊處理
問題背景
- 區(qū)塊在網(wǎng)絡(luò)中傳播需要一定時(shí)間,如果礦工A挖到一個(gè)區(qū)塊并向全網(wǎng)廣播舆驶,在廣播的路上,B也挖出了區(qū)塊黍少,那么B的區(qū)塊是過(guò)時(shí)的行剂,且B的本次挖礦對(duì)網(wǎng)絡(luò)的安全沒有貢獻(xiàn)。GHOST的目的正是要解決挖礦過(guò)時(shí)造成的安全性降低的問題牍蜂。
- 中心化問題:如果A是一個(gè)礦池漾根,有30%的算力,B有10%的算力鲫竞。A有70%的時(shí)間產(chǎn)生過(guò)時(shí)的區(qū)塊(因?yàn)榱硗獾?0%時(shí)間會(huì)產(chǎn)生最新區(qū)塊辐怕,所以它會(huì)立即挖到數(shù)據(jù)),而B有90%的時(shí)間產(chǎn)生過(guò)時(shí)區(qū)塊从绘。如果區(qū)塊的產(chǎn)出時(shí)間間隔很短寄疏,那么過(guò)時(shí)率就會(huì)變高是牢,則A憑借其更大的算力使挖礦效率也更高。所以陕截,區(qū)塊生成過(guò)快驳棱,容易導(dǎo)致網(wǎng)絡(luò)算力大的礦池控制挖礦過(guò)程。
GHOST協(xié)議
- 哪個(gè)鏈?zhǔn)亲铋L(zhǎng)的鏈艘策,GHOST解決了在計(jì)算的過(guò)程中蹈胡,因產(chǎn)生過(guò)時(shí)區(qū)塊而造成的網(wǎng)絡(luò)安全性下降的問題。不僅是父區(qū)塊和更早的區(qū)塊,同時(shí)Uncle區(qū)塊⑥也被添加到計(jì)算哪個(gè)塊具有最大的工作量證明中去朋蔫。
- 中心化問題罚渐,我們采用不同的策略:對(duì)過(guò)時(shí)區(qū)塊也提供區(qū)塊獎(jiǎng)勵(lì):挖到過(guò)時(shí)區(qū)塊的獎(jiǎng)勵(lì)是該區(qū)塊基礎(chǔ)獎(jiǎng)勵(lì)的7/8;挖到包含過(guò)時(shí)區(qū)塊的nephew區(qū)塊將收到1/32的基礎(chǔ)獎(jiǎng)勵(lì)作為賞金驯妄。但是荷并,交易費(fèi)并不獎(jiǎng)勵(lì)給Uncle區(qū)塊或nephew區(qū)塊。
- 區(qū)塊時(shí)間算法的設(shè)計(jì)決策包括:
- 區(qū)塊時(shí)間12s 選擇12s是因?yàn)檫@已經(jīng)是最快的時(shí)間了青扔,基本上比網(wǎng)絡(luò)延遲更長(zhǎng)源织。在2013年的一份關(guān)于測(cè)量比特幣網(wǎng)絡(luò)延遲的論文中,確定了12.6秒是新產(chǎn)生的區(qū)塊傳播到95%節(jié)點(diǎn)的時(shí)間微猖;
- 7個(gè)祖先塊的限制 這樣設(shè)計(jì)的目的是希望只保留少量區(qū)塊谈息,而將更早之前的區(qū)塊清除。已經(jīng)證明7個(gè)區(qū)塊可以提供大部分所需的效果凛剥。
- 1個(gè)后裔區(qū)塊的限制 如c(c(p(p(p(head))))) c=child, p = parent,就不合法侠仇,因?yàn)樗袃蓚€(gè)后裔區(qū)塊。這樣設(shè)計(jì)的目的是為了簡(jiǎn)單犁珠,上面的模擬結(jié)果顯示它并沒有構(gòu)成大的中心化風(fēng)險(xiǎn)逻炊。
- uncle塊要求具有有效性 uncle塊必須是有效的header,而不是有效的區(qū)塊犁享。這樣做也是為了簡(jiǎn)化余素,將區(qū)塊鏈模型保持為線性數(shù)據(jù)結(jié)構(gòu)。不過(guò)炊昆,要求uncle塊是有效的區(qū)塊也是合法的方法桨吊。
- 獎(jiǎng)金分配 7/8的挖礦基礎(chǔ)獎(jiǎng)勵(lì)分配給uncle塊,1/32分給nephew塊凤巨,它們交易費(fèi)用都是0%屏积。如果費(fèi)用占多數(shù),從中心化的角度看磅甩,這會(huì)使uncle塊激勵(lì)機(jī)制無(wú)效炊林;然而,這也是為什么只要我們繼續(xù)使用PoW卷要,以太坊就會(huì)不斷發(fā)行以太幣的原因渣聚。
難度更新算法
目前以太坊通過(guò)以下規(guī)則進(jìn)行難度更新:
diff(genesis) = 2^32
diff(block) = diff.block.parent + floor(diff.block.parent / 1024) *
1 if block.timestamp - block.parent.timestamp < 9 else
-1 if block.timestamp - block.parent.timestamp >= 9
難度更新規(guī)則的設(shè)計(jì)目標(biāo)如下:
快速更新:區(qū)塊間的時(shí)間應(yīng)該隨著hash算力的增減而快速調(diào)整独榴;
低波動(dòng)性:如果Hash算力恒定,那么難度不應(yīng)劇烈波動(dòng)奕枝;
簡(jiǎn)單:算法的實(shí)現(xiàn)應(yīng)相對(duì)簡(jiǎn)單棺榔;
低內(nèi)存:算法不應(yīng)依賴于過(guò)多的歷史區(qū)塊,要盡可能少的使用”內(nèi)存變量“隘道。假設(shè)有最新的十個(gè)區(qū)塊症歇,將存儲(chǔ)在這十個(gè)區(qū)塊頭部的內(nèi)存變量相加,這些區(qū)塊都可用于算法的計(jì)算谭梗;
非開發(fā)性:算法不應(yīng)讓礦工有過(guò)多篡改時(shí)間戳或者礦池忘晤、反復(fù)添加或刪除算力的能力,以使他們的收益最大化激捏。
Gas與費(fèi)用
以太坊交易費(fèi)用的基本機(jī)制
交易費(fèi)用需要考慮到賬戶的許多方面设塔,包括寬帶費(fèi)用,存儲(chǔ)費(fèi)用和計(jì)算費(fèi)用远舅。尤其重要的是闰蛔,以太坊編程語(yǔ)言是圖靈完備的,所以交易會(huì)使用任意數(shù)量的寬帶图柏、存儲(chǔ)和計(jì)算成本序六。這就可能會(huì)導(dǎo)致在計(jì)算成本過(guò)程中,突遭停電而計(jì)算被迫中止蚤吹。
每筆交易必須指明一定數(shù)量的gas(即指定startgas的值)例诀,以及支付每單元gas所需費(fèi)用(即gasPrice),在交易執(zhí)行開始時(shí)距辆,gasLimit * gasPrice 價(jià)值的以太幣會(huì)從發(fā)送者賬戶中扣除;
交易執(zhí)行期間的所有操作暮刃,包括讀寫數(shù)據(jù)庫(kù)跨算、發(fā)送消息以及每一步的計(jì)算都會(huì)消耗一定數(shù)量的gas;
如果交易執(zhí)行完畢椭懊,消耗的gas值小于指定的限制值诸蚕,則交易執(zhí)行正常,并將剩余的gas值賦予變量gas_rem ; 在交易完成后氧猬,發(fā)送者會(huì)收到返回的gas_rem * gasPrice 價(jià)值的以太幣背犯,而給礦工的獎(jiǎng)勵(lì)是(gasLimit - gas_rem)* gasprice價(jià)值的以太幣;
如果交易執(zhí)行中盅抚,gas消耗殆盡漠魏,則所有的執(zhí)行恢復(fù)原樣,但交易仍然有效妄均,只是交易的唯一結(jié)果是將 startgas * gasprice 價(jià)值的以太幣支付給礦工柱锹,其他不變哪自;
當(dāng)一個(gè)合約發(fā)送消息給另一個(gè)合約,可以對(duì)這個(gè)消息引起的子執(zhí)行設(shè)置一個(gè)gas限制禁熏。如果子執(zhí)行耗盡了gas壤巷,則子執(zhí)行恢復(fù)原樣,但gas仍然消耗瞧毙。
注意胧华,扣除費(fèi)用時(shí),僅僅檢查賬戶余額是不夠的宙彪,因?yàn)橘~戶可以在其他地方發(fā)送余額矩动。
gas消耗計(jì)算的特點(diǎn)
- 橢圓算法消耗 對(duì)于任何交易,都將收取21000gas的基本費(fèi)用您访。這些費(fèi)用可用于支付運(yùn)行橢圓曲線算法所需的費(fèi)用铅忿。該算法旨在從簽名中恢復(fù)發(fā)送者的地址以及存儲(chǔ)交易所花費(fèi)的硬盤和帶寬空間。
- 不限制大小的內(nèi)存 內(nèi)存是一個(gè)可以無(wú)限擴(kuò)展的數(shù)組灵汪,然而檀训,每擴(kuò)展32字節(jié)的內(nèi)存就會(huì)消耗1gas的成本,不足32字節(jié)以32字節(jié)計(jì)享言。
- 鼓勵(lì)清楚存儲(chǔ)器與延遲退款 用于設(shè)置賬戶存儲(chǔ)器的操作碼SSTORE的消耗是:1.將零值改為非零值時(shí)峻凫,消耗20000gas;2.將零值變成零值览露,或非零值變非零值荧琼,消耗5000gas;3.將非零值變成零值差牛,消耗5000gas命锄,加上交易執(zhí)行成功后退回的20000gas。退款金額上限是交易消耗gas總額的50%偏化。這樣設(shè)置會(huì)激勵(lì)人們清除存儲(chǔ)器脐恩。我們注意到,正因?yàn)槿狈@樣的激勵(lì)侦讨,許多合約造成了存儲(chǔ)空間沒有被有效使用驶冒,從而導(dǎo)致了存儲(chǔ)快速膨脹;為存儲(chǔ)收取費(fèi)用提供了很多好處韵卤,同時(shí)不會(huì)失去合約一旦確立就可以永久存在的保證骗污。延遲退款機(jī)制是必要的,因?yàn)榭梢宰柚咕芙^服務(wù)攻擊沈条。攻擊者發(fā)送一筆含有少量gas的交易需忿,循環(huán)清除大量的存儲(chǔ),直到用光gas,這樣消耗了大量的驗(yàn)證算力贴谎,但實(shí)際并沒有真正清除存儲(chǔ)或消耗大量gas汞扎。50%的上限的是為了確保獲得了一定交易gas的曠工依然能夠確定執(zhí)行交易的計(jì)算時(shí)間的上限。
- 消息調(diào)用的數(shù)據(jù)為指針 合約提供的消息的數(shù)據(jù)是沒有成本的擅这。因?yàn)樵谙⒄{(diào)用期間不需要實(shí)質(zhì)復(fù)制任何數(shù)據(jù)澈魄,調(diào)用數(shù)據(jù)可以簡(jiǎn)單地視為指向父合約內(nèi)存的指針,該指針在子進(jìn)程執(zhí)行時(shí)不會(huì)改變仲翎。
- call操作額外消耗9000gas 如果值不是零痹扇,操作碼CALL會(huì)額外消耗9000gas。這是因?yàn)槿魏沃祩鬏敹紩?huì)引起歸檔節(jié)點(diǎn)的歷史存儲(chǔ)顯著增大溯香。請(qǐng)注意鲫构,實(shí)際消耗是6700,在此基礎(chǔ)上玫坛,我們強(qiáng)制增加了一個(gè)自動(dòng)給予接受者的gas值结笨,這個(gè)值最小2300。這樣做是為了讓接受交易的錢包至少有足夠的gas來(lái)記錄交易湿镀。
- 可包括無(wú)限量的“數(shù)據(jù)” 虛擬機(jī)中的某些操作碼炕吸,可以讓合約允許交易對(duì)這些數(shù)據(jù)的訪問。數(shù)據(jù)的固定消耗計(jì)算是:每個(gè)零字節(jié)4gas勉痴,非零字節(jié)68gas赫模。這個(gè)公式的產(chǎn)生是因?yàn)楹霞s中大部分的交易數(shù)據(jù)由一些列的32字節(jié)的參數(shù)組成,其中多數(shù)參數(shù)具有許多前導(dǎo)零字節(jié)蒸矛。
gas機(jī)制的經(jīng)濟(jì)學(xué)原理
gas機(jī)制的另一個(gè)重要部分是gas價(jià)格本身體現(xiàn)出的經(jīng)濟(jì)學(xué)原理瀑罗。
- 比特幣中,默認(rèn)的方法是采取純粹自愿的收費(fèi)方式雏掠,礦工扮演守門人的角色并且動(dòng)態(tài)設(shè)置收費(fèi)的最小值斩祭。
- 以太坊中允許交易發(fā)送者設(shè)置任意數(shù)目的gas。這種方式在比特幣社區(qū)非常受歡迎乡话,因?yàn)樗恰笆袌?chǎng)經(jīng)濟(jì)”的體現(xiàn):允許礦工和交易者之間依據(jù)供需關(guān)系來(lái)決定價(jià)格摧玫。然而,這種方式的問題是蚊伞,交易處理并不遵循市場(chǎng)原則席赂。盡管可以將交易處理看作是礦工向發(fā)送者提供的服務(wù)(這聽起來(lái)很直觀)吮铭,但實(shí)際上礦工所處理的每個(gè)交易都必須由網(wǎng)絡(luò)中的每個(gè)節(jié)點(diǎn)處理时迫,所以交易處理的大部分成本都由第三方機(jī)構(gòu)承擔(dān),而不是決定是否處理它的礦工谓晌。
投票系統(tǒng)設(shè)定gas值
- 當(dāng)前掠拳,因?yàn)槿狈ΦV工在實(shí)際中的行為的明確信息,所以我們將采取一個(gè)非常簡(jiǎn)單公平的方法:投票系統(tǒng)纸肉,來(lái)設(shè)定gas限定值溺欧。礦工有權(quán)將當(dāng)前區(qū)塊的gas限定值設(shè)定在最后區(qū)塊的gas限定值的0.0975% (1/1024)內(nèi)喊熟。所以最終的gas限定值應(yīng)該是礦工們?cè)O(shè)置的中間值。我們希望將來(lái)能夠采用軟分叉的方法來(lái)使用更加精確的算法姐刁。
虛擬機(jī)EVM
EVM的設(shè)計(jì)
臨時(shí)/永久存儲(chǔ)的區(qū)別
我們先來(lái)看看什么是臨時(shí)存儲(chǔ)和永久存儲(chǔ)芥牌。
臨時(shí)存儲(chǔ):存在于VM的每個(gè)實(shí)例中,并在VM執(zhí)行結(jié)束后消失聂使;
永久存儲(chǔ):存在于區(qū)塊鏈狀態(tài)層壁拉。
假設(shè)執(zhí)行下面的樹(S代表永久存儲(chǔ),M代表臨時(shí)存儲(chǔ)):
- A調(diào)用B柏靶;
- B設(shè)置B.S[0]=5弃理,B.M[0]=9 ;
- B調(diào)用C;
- C調(diào)用B屎蜓。
此時(shí)痘昌,如果B試圖讀取B.S[0],它將得到B前面存入的數(shù)據(jù)炬转,也就是5辆苔;但如果B試圖讀取B.M[0],它將得到0返吻,因?yàn)锽.M是臨時(shí)存儲(chǔ)姑子,讀取它的時(shí)候是虛擬機(jī)的一個(gè)新的實(shí)例。
在一個(gè)內(nèi)部調(diào)用中测僵,如果設(shè)置B.M[0] = 13和 B.S[0] = 17 街佑,然后內(nèi)部調(diào)用和C的調(diào)用都終止,再執(zhí)行B的外部調(diào)用捍靠,此時(shí)讀取M,將會(huì)看到B.M[0] = 9(此值在上一次同一VM執(zhí)行實(shí)例中設(shè)置的)沐旨,B.S[0] = 17。如果B的外部調(diào)用結(jié)束榨婆,然后A再次調(diào)用B磁携,將看到B.M[0] = 0,B.S[0] = 17良风。
這個(gè)區(qū)別的目的是:
- 每個(gè)執(zhí)行實(shí)例都分配有內(nèi)存空間谊迄,不會(huì)因?yàn)檠h(huán)調(diào)用而減損,這讓安全編程更加容易烟央。
- 提供一個(gè)能夠快速操作的內(nèi)存形式:因?yàn)樾枰薷臉渫撑担源鎯?chǔ)更新必然很慢。
棧/內(nèi)存模式
早期疑俭,計(jì)算狀態(tài)有三種:棧(stack,一個(gè)32字節(jié)標(biāo)準(zhǔn)的LIFO)粮呢,內(nèi)存(memory,可無(wú)限擴(kuò)展的臨時(shí)字節(jié)數(shù)組),存儲(chǔ)(storage啄寡,永久存儲(chǔ))豪硅。在臨時(shí)存儲(chǔ)端,棧和內(nèi)存的替代方案是memory-only范式挺物,或者是寄存器和內(nèi)存的混合體(兩者區(qū)別不大懒浮,寄存器本質(zhì)上也是一種內(nèi)存)。在這種情況下识藤,每個(gè)指令都有三個(gè)參數(shù)嵌溢,例如:ADD R1 R2 R3: M[R1] = M[R2] + M[R3] 。選擇棧范式的原因很明顯蹋岩,它使代碼縮小了4倍赖草。
單詞大小32字節(jié)
在大多數(shù)結(jié)構(gòu)中,如比特幣剪个,單詞大小是4或8字節(jié)秧骑。4或8字節(jié)對(duì)存儲(chǔ)地址或加密計(jì)算來(lái)說(shuō)局限性太大了。而太大的值又很難建立相應(yīng)安全的gas模型扣囊。32字節(jié)是一個(gè)理想大小乎折,因?yàn)樗銐虼鎯?chǔ)下許多加密算法的實(shí)現(xiàn)以及地址,又不會(huì)因?yàn)樘蠖鴮?dǎo)致效率低下侵歇。
使用了可變骂澄、可擴(kuò)展的內(nèi)存大小
固定內(nèi)存的大小是不必要的限制,太小或太大都不合適惕虑。如果內(nèi)存大小是固定的坟冲,每次訪問內(nèi)存都需要檢查訪問是否超出邊界,顯然這樣的效率并不高溃蔫。
棧大小沒有限制
沒什么特別理由健提!許多情況下,該設(shè)計(jì)不是絕對(duì)必要的伟叛;因?yàn)樗奖裕琯as的開銷和區(qū)塊層gas的限制總是會(huì)充當(dāng)每種資源消耗的上限。
1024調(diào)用深度限制
許多編程語(yǔ)言在棧的深度過(guò)大時(shí)觸發(fā)中斷比在內(nèi)存過(guò)載時(shí)觸發(fā)中斷的策略要快的多统刮。所以區(qū)塊中g(shù)as限制所隱含的限制是不夠的紊遵。
SIGNEXTEND
SIGNEXTEND操作碼的作用是為了方便從大的有符號(hào)整數(shù)到小的有符號(hào)整數(shù)的類型轉(zhuǎn)換。小的有符號(hào)整數(shù)是很有用的侥蒙,因?yàn)槲磥?lái)的即時(shí)編譯虛擬機(jī)可能會(huì)檢測(cè)長(zhǎng)時(shí)間運(yùn)行的代碼塊暗膜,小的有符號(hào)整數(shù)能加快處理。
以太坊社區(qū)知識(shí)庫(kù)
https://ethfans.org/wikis/%E4%BB%A5%E5%A4%AA%E5%9D%8A%E8%AE%BE%E8%AE%A1%E5%8E%9F%E7%90%86