位元幣指令碼語言

2021-09-02 23:08:49 字數 3184 閱讀 7576

指令碼是一種簡單的指令碼語言,也是位元幣交易處理的核心。如果你曾經寫過彙編**,你會發現這篇文章很容易理解,而且可能是有趣的;否則它可能是特別具挑戰性的。所以請保持專注!

指令碼是電腦程式,作為程式設計師,你當然知道程式是什麼。程式接受輸入,執行一段時間,然後返回輸出。程式語言是我們編寫計算機能理解的程式的工具,因為大多數語言都帶有編譯器,可以將人性化的**對映到cpu來操作,所以也稱為操作碼。

操作碼操作碼包括記憶體操作,數學,迴圈,函式呼叫以及在程式程式語言(如c)中找到的所有內容。它們構成cpu的口語,即所謂的機器碼。由於位元組是計算機的首選習慣用法,因此操作碼也是位元組。結果就是,機器碼表示要在cpu上執行的操作的位元組串。

在像c這樣的高階程式語言中考慮這段**:

x = 0x23;

x += 0x4b;

x *= 0x1e;

現在假設你要在假設的小尾數的cpu上編譯和執行此**,該cpu具有16位記憶體(暫存器)的單個單元和以下操作碼集:

opcode

encoding

vset(v)

ab v

16-bit

add(v)

ac v

16-bit

mul(v)

ad v

16-bit

操作碼解釋如下:

這種cpu的編譯器將生成這9個位元組的機器**:

ab 23 00 ac 4b 00 ad 1e 00
以下是它的解釋方式:

暫存器儲存最終結果,即ce4。

大多數情況下,我們需要使用變數跟蹤複雜的程式狀態。在c中,根據變數是靜態分配還是使用malloc分配,它儲存在不同排列的記憶體中。雖然malloc-ed資料像乙個非常大的陣列中的元素一樣被訪問,但靜態變數被推送到一堆名為stack的專案中並從中彈出。堆疊以lifo方式執行(後進先出),這意味著你推送的最後乙個專案將是第乙個彈出的專案。

考慮這個虛函式:

int foo()
堆疊最初是空的(1):

然後,推送三個變數(2):

[12]

[12, a4 00]

[12, a4 00, e7 a5 02 00]

第四個變數被賦予其他變數的總和並被推入堆疊(3):

[12, a4 00, e7 a5 02 00, 9d a6 02 00]
堆疊的尖端是返回值,並通過其他方式傳送回函式呼叫者。每個臨時堆疊變數都會在塊(4)的末尾彈出,因為必須平衡推push/彈pop操作,以便堆疊始終返回其初始狀態:

[12, a4 00, e7 a5 02 00]

[12, a4 00]

[12]

同樣,位元幣核心有自己的「虛擬處理器」來解釋指令碼機器碼。指令碼具有豐富的操作碼,但與英特爾等完全成熟的cpu相比卻非常有限。關於指令碼的一些關鍵事實:

實際上,第1點也意味著第2點。第3點意味著在script中沒有像命名變數這樣的東西,你只需在堆疊上進行計算。通常,你推送的堆疊項成為後續操作碼的運算元。在指令碼的末尾,頂部堆疊項是返回值。

在介紹現實世界的指令碼之前,讓我們先列舉一些操作碼。如需全套,請檢視位元官方維基頁面。

以下操作碼將數字0-16推入堆疊:

opcode

encoding

op_0

00op_1-op_16

51-60

按照慣例,op_0op_1也表示布林值op_false(零)和op_true(非零)。

例:

54 57 00 60
或者:

op_4 op_7 op_0 op_16
這是堆疊如何發展:

[4][4, 7]

[4, 7, 0]

[4, 7, 0, 16]

返回值是最高項,因此指令碼返回16。我知道,這是毫無意義的,但這是乙個開始。

提供了幾個操作碼來推送自定義資料。它們的運算元大小不同:

opcode

encoding

l (length)

d (data)

op_pushdata1

4c l d

8-bit

l bytes

op_pushdata2

4d l d

16-bit

l bytes

op_pushdata4

4e l d

32-bit

l bytes

例如,如果你的資料長度可以儲存為8位數字,那麼op_pushdata1是你的最佳選擇。看這個:

4c 14 11 06 03 55 04 8a

0c 70 3e 63 2e 31 26 30

24 06 6c 95 20 30

第乙個位元組顯然是op_pushdata1操作碼,後面是1位元組長度14,即十進位制20.因此,接下來會有20個位元組的資料。這條指令的作用是將這些資料壓入堆疊:

[11 06 03 55 04 8a 0c 70

3e 63 2e 31 26 30 24 06

6c 95 20 30]

實際上,與varints一樣,對於非常短的資料有一種特殊的編碼。如果操作碼位於01和4b(包括)之間,則它是乙個推送資料操作,其中操作碼本身是以位元組為單位的長度:

opcode

encoding

l (length)

d (data)

ll d

01-4b

l bytes

例如,在字串中:

07 8f 49 b2 e2 ec 7c 44
操作碼07意味著要推送7個位元組的資料:

[8f 49 b2 e2 ec 7c 44]
區塊鏈中的下乙個塊呢?

你學到了一些關於機器**和操作碼的知識。指令碼是礦工軟體理解的簡單低階語言。使用堆疊記憶體跟蹤指令碼狀態。

指令碼語言 shell指令碼

指令碼語言的特徵 指令碼語言 於批處理命令語言,但更接近於程式語言。與批處理命令語言的差別是,指令碼語言有變數和豐富的控制語句 與一般程式語言的差別是 指令碼語言變數的值主要是字串,語言的基本單位是命令 而程式語言變數主要是數值,語言的基本單位是表示式 指令碼語言一般是解釋執行的,速度低,但開發成本...

使用指令碼語言

dim myvar myvar hello world myvar 在這個例子中,option explicit語句強制所有的變數必須專門宣告。dim語句宣告了變數myvar。如果在使用變數前沒有宣告變數,vbscript就會給出執行時錯誤資訊 variable is undefined myvar...

shell指令碼語言

現在流行的指令碼語言有很多,例如php perl python shell等等,這些指令碼語言都有自己的牛x的地方。shell指令碼語言在unix linux系統上用途廣泛,它的優勢在於處理作業系統底層的業務,它利用大量的命令和函式來實現強大的功能,例如一鍵安裝 報警等等。1 在編寫指令碼語言的時候...