BCH恢復禁用的指令碼操作碼 草案

2021-09-11 09:39:41 字數 2770 閱讀 3115

version 0.1, 2018-01-19 – 草案供討論

討論草案

為了討論這個草案,附加說明包含在標題草案的標題中。這些打算從這個檔案的finalalized版本被刪除。

可選規則由rule option表示,其中預期將在工作組內達成共識之後採用所呈現的選項。

引言本文件描述了重新啟用幾個指令碼操作碼的建議要求。 2023年,在op_lshift和op_return中發現了兩個嚴重的錯誤,提示禁用這些和另外13個操作碼。 以下的禁用操作碼列表按類別細分。

拼接操作

按位邏輯

算術建議操作碼重新啟用

建議在分階段過程中重新引入這些操作碼(或等效功能)。第一階段是在五月硬叉中啟用乙個有限的子集。

拼接操作:op_cat, op_split 按位邏輯:op_and, op_or, op_xor 算術:op_div, op_mod

new:

提出了乙個新的操作op_split,作為op_substr,op_left和op_right的替代。所有三種操作都可以用op_split,op_swap和op_drop的不同組合來模擬。

在按位操作下進一步討論這些新操作的目的。

指令碼資料型別

應該注意的是,在指令碼操作中,堆疊中的資料值被解釋為二進位制字串(即位元組陣列)或數字。 除非特別宣告為解釋為數字,否則堆疊上的所有資料都被解釋為乙個位元組陣列。

數字型別有特定的限制:

使用的編碼是帶有明確的符號位(最後乙個位元組的最高位)的小端。 它們的長度不能超過4個位元組。 它們必須使用盡可能最短的位元組長度進行編碼(沒有零填充)3:規則3有乙個例外:如果有多於乙個位元組並且第二個最重要位元組的最高有效位被設定, 與符號位衝突。 在這種情況下,左邊允許單個0×00或0×80位元組。 負零不被允許。 新提出的opcode x op_bin2num - > out可以用來在需要時將二進位制陣列轉換為規範的數字。

新提出的操作碼x op_num2bin可用於將數字轉換為長度為n的零填充二進位制陣列,同時保留符號位。

endian符號

風險和哲學方法

一般而言,採取的方法是盡可能地限制邊緣案例的極簡主義方法。 在可能的情況下,與現有的操作碼結合使用的原始操作碼可能被組合,以產生比一組更複雜的操作碼更優選的更複雜的操作。 導致模糊或未定義行為的輸入條件應該快速失敗。

應針對以下風險狀況檢查每個操作**並明確定義緩解行為:

定義拼接操作

op_cat

opcode (decimal): 126 opcode (hex): 0x7e 連線兩個運算元。

x1 x2 op_cat → out 例如:

ox11 0x2233 op_cat -> 0x112233 這個操作會失敗如果:

0 <= len(out)<= max_script_element_size – 操作無法輸出違反元素大小約束的元素

請注意,零長度運算元的連線是有效的

成功執行的影響:

輸出長度的限制可以防止記憶體耗盡攻擊,導致操作對堆疊大小的影響比現有的op_dup操作符小。

單元測試:

1.a b op_div - > failure 其中! isnum(a)或 !isnum(b) – 兩個運算元都必須是有效的數字 2.0 op_div - > failure – 除以正零(所有大小),負零(所有大小),op_0 3.a b op_div - > out 其中a <0的結果必須是負數或任何形式的零。 4.檢查不同長度1..4的運算元的有效結果 op_mod

opcode (decimal): 151 opcode (hex): 0x97 返回除以b後的餘數。輸出將使用所需的最少位元組數來表示。

a b op_mod → out where a and b are interpreted as numbers 這個操作會失敗如果:

成功執行的影響:

單元測試:

1.a b op_mod - > failure其中!isnum(a)或!isnum(b) - 兩個運算元都必須是有效的數字 2.a 0 op_mod -> failure – 除以正零(所有大小),負零(所有大小),op_0 3.a b op_mod -> failure其中 a < 0, b < 0 – 兩個運算元都必須是正數 4.檢查不同長度1..4的運算元的有效結果

新操作草案討論

為了便於按位邏輯的「運算元必須等長」規則。 需要額外的操作員為指令碼作者提供填充運算元的合理方式。 填充位元組陣列和填充數字之間必須有明確的區別。

結束草案討論

op_bin2num

op_bin2num取代op_left並使用它的操作碼

opcode (decimal): 128 opcode (hex): 0x80 另見op_num2bin

例如:0x0000000002 op_bin2num -> 0x02 0x800005 op_bin2num -> 0x85 這個操作會失敗,如果:

op_num2bin

op_num2bin取代op_right並使用它的操作碼

opcode (decimal): 129 opcode (hex): 0x81 將數字值轉換為特定大小的二進位制陣列,考慮符號位。

n m op_num2bin -> x where m and n are interpreted as numbers 另見op_bin2num。

例如:0x02 4 op_num2bin -> 0x00000002 0x85 4 op_num2bin -> 0x80000005 這個操作會失敗,如果:

n或m不是有效的數字值 m max_script_element_size – 結果太大

參考實現

todo

參考[1]

引用原文:

hbase禁用一張表和把禁用的一張表恢復狀態

首先需要先讓該錶為disable狀態,使用命令 disable 表名 然後才能drop這個表,使用命令 drop 表名 注意 如果直接drop表,會報錯 drop the named table.table must first be disabled 但是,如果禁用一張表之後發現不想刪除了,可以用...

was控制台誤禁用後的恢復啟用辦法

websphere是可以配置禁用控制台的,下面以was6.1 單profile https控制台為例介紹在 誤 禁用控制台後如何恢復啟用控制台。wcinboundadmin 控制台http wcinboundadminsecure 控制台https wcinbounddefault 應用http w...

使用指令碼恢復Windows XP系統的使用者密碼

於網路 使用指令碼恢復windows xp系統的使用者密碼 用一種不用第三方軟體的方法來恢復管理員密碼,大家可以看看這招技巧如何。windows xp啟動指令碼 startup scripts 是計算機在登入螢幕出現之前執行的批處理檔案,它的功能類似於windows 9 和dos中的自動執行批處理檔...