逆波蘭表示法與鎖定 解鎖指令碼

2021-08-25 14:23:06 字數 1191 閱讀 4094

位元幣交易指令碼語言,也稱為指令碼,是一種基於逆波蘭表示法的基於堆疊的執行語言。要搞懂位元幣交易的具體流程,就得知道逆波蘭表示法是怎麼回事,簡單來說就是操作符置於運算元的後面,這裡的「操作符」就是「+、—、*、/」之類的運算符號,「運算元」就是。。。數,比如」1+1「,我們的平常用的記法(記錄方法)叫常規中綴記法,而逆波蘭表示法把操作符置於運算元的後面就會寫成「11+」,所以大費周章這樣做有什麼意義呢?使用逆波蘭記法的乙個好處是不需要使用括號。我們先來複習下小學數學,不同的符號有不同的優先順序,比如乘法的優先順序比加法高,於是1+2*3=7而不等於9,因為我們先將2乘了3再加1,但如果我們寫這個式子的本意是要先讓1和2相加,如果使用常規中綴記法,那就在需要提高優先順序的地方加上括號,比如在上例中把式子寫成(1+2)*3,但如果我們不想有括號呢,我們就可以使用逆波蘭表示法來避免括號的使用,如把上例中的式子寫成12-3*。

位元幣指令碼語言被稱為基於棧語言,因為它使用的資料結構被稱為棧。棧是乙個非常簡單的資料結構,它可以被理解成為一堆卡片。棧允許兩類操作:入棧和出棧。入棧是在棧頂部增加乙個專案,出棧則是從棧頂部移除乙個專案。逆波蘭表示式的直譯器也基於堆疊。解釋過程一般是:運算元入棧;遇到操作符時,運算元出棧,求值,將結果入棧;當一遍後,棧頂就是表示式的值。因此逆波蘭表示式的求值使用堆疊結構很容易實現,和能很快求值。條件操作符評估一項條件,產生乙個真或假的結果。

例如,op_equal從堆疊移除兩個專案,假如二者相等則推送真(表示為1),假如二者不等則推送為假(表示為0)。位元幣交易指令碼常含條件操作符,當一筆交易有效時,就會產生真的結果。

任何解鎖和鎖定指令碼的組合如果結果為真,則為有效。前面被我們用於說明指令碼語言的簡單算術運算同樣也是乙個有效的鎖定指令碼,該指令碼能用於鎖定交易輸出。

使用部分算數運算示例指令碼作用鎖定指令碼:

1 op_add 3 op_equal

該指令碼能被以解鎖指令碼為輸入的一筆交易所滿足,解鎖指令碼為:

驗證軟體將鎖定和解鎖指令碼組合起來:

2 1 op_add 3 op_equal

當指令碼被執行時,結果是op_true,從而使得交易有效。不僅該筆交易的輸出鎖定指令碼有效,同時utxo也能被任何知曉這個運算技巧(知道是數字2)的人所使用。

當然真實的情況比這裡演示的要更複雜,但鎖定指令碼確實以這種方式來解鎖utxo,大多數的解鎖指令碼都指向乙個位元幣位址或公鑰,因而如果想要使用資金則需驗證所有權,即能給出能解鎖解鎖指令碼的公鑰和由相應私鑰創設的數字簽名。

逆波蘭表示法

逆波蘭表示發是一種將運算子寫在運算元後面的描述程式 算式 的方法。舉個例子,我們平常用中綴表示法描述的算式 1 2 5 4 改為逆波蘭表示法之後則是1 2 5 4 相較於中綴表示法,逆波蘭表示法的優勢在於不需要括號。請輸出以逆波蘭表示法輸入的算式的計算結果。輸入在1行中輸入1個算式。相鄰的符號 運算...

C語言實現逆波蘭表示法(棧)

逆波蘭表示法是一種將運算子寫在運算元後面的描述程式 算式 的方法。舉個例子,我們平常用中綴表示法描述的算式 1 2 5 4 改為逆波蘭表示法之後則是12 54 相較於中綴表示法,逆波蘭表示法的優勢在於不需要括號 主要使用了棧的資料結構 現在我有式子 12 54 1 2先壓入棧,遇到運算子後,把 1 ...

1基礎 7逆波蘭表示法(字尾表示式)

include includechar sfex 1000 儲存後序表示式,雖然沒用到棧的性質,但下面的注釋還是用字尾棧來描述 void transform else if ch ch else if ch ch else i 為了統一,因為判斷跳出後有i 移至下一字元 sfex t 字尾棧中每個數...