Script

替代堆棧是否使腳本圖靈完整?

  • May 5, 2020

wiki 記錄了 Script 中“alt stack”的存在:

  • OP_TOALTSTACK將輸入放在 alt 堆棧的頂部。將其從主堆棧中移除。
  • OP_FROMALTSTACK將輸入放在主堆棧的頂​​部。將其從 alt 堆棧中移除。

這樣看來,Script 可能有資格作為兩棧下推自動機。眾所周知,這個系統相當於一個圖靈機。例如:

要查看等價性,只需將第一個堆棧視為目前位置左側磁帶的內容,將第二個堆棧視為右側的內容。首先在兩個堆棧上壓入正常的“堆棧底部”標記,然後我們可以通過從右側堆棧彈出並壓入左側以向右移動,反之亦然向左移動來模擬 TM。如果我們擊中左側堆棧的底部,我們會做出相應的行為(暫停並拒絕,或留在原地,具體取決於模型),如果我們擊中右側堆棧的底部,我們只需將一個空白符號壓入左側。

<https://cs.stackexchange.com/questions/2832/is-a-push-down-automaton-with-two-stacks-equivalent-to-a-turing-machine/2833#2833>

維基百科將“圖靈完備”定義為:

在可計算性理論中,如果一個數據操作規則係統(例如電腦的指令集、程式語言或元胞自動機)可用於模擬任何圖靈機,則稱其為圖靈完備或計算通用。

<https://en.wikipedia.org/wiki/Turing_completeness>

該執行緒引用了 alt 堆棧,聲稱它的存在使 Script Turing 完整:

<https://www.reddit.com/r/Bitcoin/comments/7yb3is/where_is_the_evidence_that_bitcoin_is_turing/duf1rt9/>

該執行緒連結到該執行緒,其中包含以下內容:

雖然眾所周知的 CS 結果是兩棧下推自動機具有與圖靈機相同的能力,但比特幣腳本不能作為兩棧下推自動機執行。儘管比特幣腳本有兩個堆棧,但比特幣腳本沒有您可以創建的關聯有限狀態機。

<https://reddit.com/r/btc/comments/6hjxiy/new_craig_wright_interview_part_2_on/diz9g69/?context=3>

換句話說,可能有兩個堆棧,但沒有辦法為它們提供足夠的動力來創建圖靈機。

鑑於替代堆棧的存在,比特幣腳本圖靈是否完整?如果沒有,缺少哪些特定功能?

不,替代堆棧不會使比特幣腳本成為圖靈完備的語言。

雖然腳本有兩個堆棧,但為了模擬兩個堆棧下推自動機(圖靈完備),必須能夠實現一個有限狀態控制單元。這不能在比特幣腳本中完成,因為沒有可用的循環或條件分支。可以編寫一個腳本,通過展開循環來完成執行圖靈機程序的動作,但這僅適用於終止的機器和輸入組合。使用無限循環的有限輸入字元串編寫圖靈機非常簡單,例如。考慮定義的圖靈機

狀態:q0(初始)、q1 和 q3(最終)

和磁帶字母 {0, 1}

過渡在哪裡

(q0, 0) -> (q1, 0, 左移)

(q1, 0) -> (q1, 0, 左移)

(q1, 1) -> (q1, 1, 向右移動)

給定輸入 01,這台機器將無限循環,如下所示:

<http://turingmachinesimulator.com/shared/ojvubpsgkm>

嘗試將其作為比特幣腳本“展開”永遠不會完成。

你可能對我寫的文章感興趣。我寫了一個圖靈機(利用兩個堆棧)並做了一個測試交易

基本上,如果我們假設我們的程序將停止,那麼它只需要有限數量的指令,這由比特幣腳本支持。不幸的是,比特幣腳本虛擬機只允許執行有限數量的操作,因此在實踐中只能編寫非常短的程序。

引用自:https://bitcoin.stackexchange.com/questions/71949