# Cardano eUTxO > Reference: https://aiken-lang.org/fundamentals/eutxo [Aiken 學習目錄](/e7DvPvg8RSWhcTK3wnfaJA) [下一章內容 Aiken Common Design Patterns](/mnDEC8LQRYSG0d89bZKqIA) 假如你對於區塊鏈如何運作很好奇,也喜歡Cardano,那這篇會是蠻好的入門教學。 會寫這篇的原因是因為我的英文不是很好、原文有些地方沒有統整的很好,所以為了讓自己能夠輕鬆的反覆看,並在一些複雜的地方有個簡單的統整筆記更好理解,所以這篇是原文的繁中版+額外筆記 ## Blocks & transactions(區塊和交易) 區塊鏈是由區塊組成的。區塊是由交易組成的。無需深入了解細節,可以將區塊視為分為兩部分的物件:標題(header)和主體(body)。標頭包含有關區塊的信息,例如誰生成了它們以及它們何時生成。主體只不過是一個有序的交易序列。 >header:包含關於blocks的資訊,誰產生他們和何時產生 • block body的hash digest • 前一個block header的hash digest >body:一個有序的交易序列 請注意,區塊鏈的「鏈」來自於區塊如何相互引用。事實上,每個block header至少包含兩件事: - 區塊體的哈希摘要(hash digest) - 前一個區塊的標頭哈希(header hash digest) >hash digest是一種防篡改機制,它將輸入值對應到固定大小的輸出。將其視為一種為一段內容分配標識符的方法,這樣標識符取決於內容本身:更改內容,更改標識符。 ``` ┏━ Header ━━━━━━━━━━━━━━┳━ Body ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ ┃ Body hash ┃ ┌────────────────┬────────────────┬─────┐ ┃ ┃ Previous header hash ┃ │ Transaction #1 │ Transaction #2 │ ... │ ┃ ┃ Timestamp ┃ └────────────────┴────────────────┴─────┘ ┃ ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ``` 更改區塊中任何一比交易,都會更改block body hash,從而更改block header hash,並更改下一個區塊的header hash(每個block header包含前一個block header的hash digest),導致後續的整個鏈無效 ``` ____ ____ ____ ____ ____ / /\ / /\ / /\ / /\ / /\ o ❮❮ /____/ \ ❮❮ /____/ \ ❮❮ /____/ \ ❮❮ /____/ \ ❮❮ /____/ \ ... \ \ / \ \ / \ \ / \ \ / \ \ / ╿ \____\/ \____\/ \____\/ \____\/ \____\/ │ │ ╿ │ │ └ Genesis configuration │ └ Block ``` ## Unspent Transaction Outputs(未花費交易輸出) 交易是區塊鏈最基本的元語,他們是用戶可以用來更改區塊狀態的機制,交易將先前的狀態映射到新的狀態,最後區塊將交易批量處理在一起。 交易是首先且最重要的是一個物件,可以從持有資產的地方輸入,輸出到想要送到的地方。像Cardano,交易有很多輸入和輸出。除了輸入和輸出外,區塊鏈協議還包含一些可以修改區塊狀態的不同部分的元素(e.g. delegation certificates, governance votes, user-defined assets definitions...) 最重要的是,交易是要麼全有或是全無的原子命令序列。要麼有效,那麼他所有的更改都有效,要麼無效,並且不會有任何更改。 ### Outputs(輸出) 在Cardano中輸出是至少描述兩件事的物件 - 資產數量,也被稱為value - 支出(and/or delegating)這些資產的條件,也被稱為address 除了基本的輸出內容外,還可以在輸出中加入data payload(數據負載),但目前不需要關注這個部分。輸出中的「value」(值)的作用是明顯且透明的,它用來指示該輸出持有多少資產。 Cardano 區塊鏈支持兩種類型的資產:主協議貨幣(即 Ada)和用戶自定義貨幣。這兩者都可以在交易中的 value 中共存,但各自適用的規則略有不同。 具體來說: >1.主協議貨幣 (Ada): •是 Cardano 協議的原生貨幣,用於支付交易費、參與共識協議(如質押)以及其他核心功能。 •在 Cardano 網路中,所有交易都需要一些 Ada 作為手續費,這確保了網絡的安全性和可持續性。 2.用戶自定義貨幣: •是使用者在 Cardano 上自行創建的代幣,通常稱為「原生代幣」(native tokens)。 •它們可以代表不同的資產類型,例如加密貨幣、穩定幣、NFT 等。 •這些代幣共用同一套 value 結構,但適用於它們的規則(如發行、轉移)可能與 Ada 有些不同。 「address」包含了一組邏輯,用於告訴區塊鏈協議在何種條件下可以使用特定輸出中的資產。address的功能是定義資產的所有權。 ``` ┏━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ ┃ ┃ Value ┃ Address ┃ Data payload ┃ ┃ ┃ ┃ ┃ ┗━━━━━━━━━┻━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛ ``` ### Inputs(輸入) 輸入是對先前輸出的引用,可以將輸出想像成帶有唯一序號的小紙條,而輸入則是這個序號的引用。 >1.輸出(Output):當一筆交易發生時,它會創建一個或多個輸出,每個輸出都代表資產的持有記錄,並與一個地址綁定。這些輸出就像「帶有唯一序號的小紙條」,用於標記誰擁有這些資產及其價值。 2.輸入(Input):當你想要花費或轉移這些資產時,必須引用之前創建的輸出。這就是輸入的作用——它用於指向以前的某個輸出,這樣區塊鏈協議就知道你是用之前交易中剩餘的資產來進行新的交易。輸入中包含了輸出的「序號」(即唯一標識符)。 交易是一份文件,指示應銷毀哪些便利貼以及哪些新便利貼釘應在牆上。請注意,存在有關交易建構的規則。例如,輸入的value必須與輸出的value一樣多。換句話說,Total value應該平衡,但可能會以不同的方式進行重組。 尚未花費的輸出(即仍在牆上)被稱為 - 你猜對了 -an unspent transaction output(未花費的交易輸出),簡稱 UTxO。區塊鏈狀態是透過查看整面牆的剩餘便利貼得出的。除了所有可用的 UTxO 之外,狀態還包括協定定義的任何附加資料。 從技術上講,輸入的「序號」是發出其所引用的輸出的交易的hash digest以及輸出在該交易中的位置。這兩個元素使每個輸入都是獨一無二的。而且由於輸出在使用時會從可用集合中刪除(便利貼被銷毀),因此它們只能使用一次。這是由區塊鏈協議保證的。 ``` ┏━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ ┃ Transaction hash ┃ Output index ┃ ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━┛ ``` >第一筆輸出從哪來? >你可能會有一個疑問,輸入是對輸出的引用,而輸出是透過投入輸入創造的。 >舉個栗子🌰:獲得錢錢要先有對方給你錢,但對方給你錢是要有人給他錢,以此類推無限循環,那誰是第一個給錢錢的呢? >這就是創世配置(genesis configuration)的用途。它以商定的初始輸出清單的形式定義了區塊鏈的起點。可以使用一些特殊標識符來引用這些輸出。例如,創世配置hash digest要和output在配置中的位置。 >在 Cardano 的情況下,初始分配是透過一個初始代幣憑證銷售進行的。在區塊鏈網絡啟動之前,將一部分總供應量的 Ada 以憑證的形式出售給早期的利益相關者。這意味著,在創世配置中,這些憑證的持有者獲得了相應數量的 Ada。 ### TL;DR - 區塊鏈有一個稱為創世配置的初始狀態 - 交易捕獲修改該狀態的指令(例如資產轉移) - 一個區塊將交易分批在一起,並具有對父區塊的引用 - 資產流動透過交易中的輸入和輸出來表達 - 輸出是至少具有address和value的物件 - address描述了使用與其關聯的value所需的條件 - 輸入是對先前輸出的引用 ## Address 一般來說,address由兩或三個部分組成 ``` ┏━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃ ┃ ┃ ┃ ┃ Header ┃ Payment credentials ┃ Delegation credentials ┃ ┃ ┃ ┃ ┃ ┗━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ``` 會說由兩或三部分組成是因為第三部分,Delegation credentials是可選的。 第一部分稱為`header`,它描述address的type(即接下來的內容)以及可以使用該address的網路。我們將最後一點稱為網路判別式,它可以防止愚蠢的錯誤,例如將真實的主網資金發送到測試地址。address表示為位元組序列(sequence of bytes),通常使用bech32 或簡單的base16 文字字串進行編碼。 例如: - An address (bech32) ``` addr1x8phkx6acpnf78fuvxn0mkew3l0fd058hzquvz7w36x4gt7r0vd4msrxnuwnccdxlhdjar77j6lg0wypcc9uar5d2shskhj42g ``` - The same address (base16) ``` 31c37b1b5dc0669f1d3c61a6fddb2e8fde96be87b881c60bce8e8d542fc37b1b5dc0669f1d3c61a6fddb2e8fde96be87b881c60bce8e8d542f ``` ``` Type = 3 ┐┌ Network = 1 (1 = mainnet, 0 = testnet) ││ ╽╽ Header: 31 Payment credentials: c37b1b5dc0669f1d3c61a6fddb2e8fde96be87b881c60bce8e8d542f Delegation credentials: c37b1b5dc0669f1d3c61a6fddb2e8fde96be87b881c60bce8e8d542f ``` 可以看到,type為3,用於主網,Paymenet和Delegation使用相同的憑證 ### Payment credentials(支付憑證) 也被稱為payment part,描述該address的支出條件。 還記得 UTxO 就像牆上的便利貼嗎?嗯,你不能自己把它們掛起來或直接撿起來。您必須將交易移交給網路驗證器。想像一下,一名員工負責看管便利貼牆,您必須向他提供一份表格來描述您想要做什麼。每張便利貼上都寫著在拾取和銷毀它之前必須滿足的條件。這就是address中支付憑證的用途。 >1.UTxOs 作為小紙條:每個 UTxO 就像一個標記著資產數量和所有權的紙條,它們存儲在區塊鏈上,等待被花費或轉移。 2.無法直接操作:用戶不能直接從牆上取下或放置這些小紙條,而是必須通過向網絡的驗證者(validators)提交交易來請求處理。這就像需要一名員工來管理這面牆,負責監管誰能取用或銷毀這些紙條。 3.交易表單:當用戶想要花費某個 UTxO 時,他們必須填寫一個描述所需操作的表單(即交易),並將其提交給這位“門衛”來進行處理。 4.支付憑證的作用:每個小紙條上都有一組條件,這些條件必須滿足才能取用和銷毀該 UTxO。這些條件就是address中的 支付憑證,它們用來定義誰有權控制和使用這些資產。 它們有兩種形式之一: - a verification key hash digest(驗證密鑰哈希摘要);或者 - a script hash digest(腳本哈希摘要) 在第一種形式中,驗證者節點(或員工)將要求您提供與驗證金鑰相對應的簽章金鑰的數位簽章。這種方法依賴非對稱加密技術,其中產生憑證作為公鑰(驗證)和私鑰(簽署)金鑰對。在地址中,為了簡潔起見,我們僅儲存驗證金鑰的雜湊摘要,並避免過早洩漏(即使它是公共材料)。當從這樣的地址進行支出時,必須透露公鑰並出示整個交易的簽名作為見證人(也稱為證據)。這種指定支出條件的方式相對簡單,但也受到限制,因為它不允許表達任何複雜的邏輯。 >1.驗證者節點的角色:驗證者節點(或比喻中的員工)要求用戶提供與其驗證金鑰相對應的簽名金鑰所產生的數位簽名。這個過程確保了只有擁有私鑰的人才能花費地址中的資產。 2.非對稱加密:這種方法依賴於非對稱加密技術,其中生成一對金鑰——公開金鑰(驗證金鑰)和私密金鑰(簽名金鑰)。公開金鑰可被任何人使用來驗證簽名,而私密金鑰則保留給擁有者,用於生成數位簽名。 3.地址中儲存的哈希摘要:為了簡潔和安全,地址中只存儲驗證金鑰的哈希摘要,而不是完整的金鑰。這樣可以避免過早透露驗證金鑰,即使它本身是公共資料。 4.花費條件的證明:在從這種地址進行支出時,用戶必須揭示公共金鑰,並提供整個交易的簽名作為見證(即證明)。這樣可以確保只有擁有正確私鑰的人才能進行資產的花費。 5.優缺點: •簡單性:這種方式明確而簡單,易於實現,因為用戶只需提供簽名以證明其擁有權。 •局限性:然而,這種方法的靈活性有限,因為它無法表達複雜的邏輯條件。例如,無法設置多重簽名或其他更為複雜的控制條件。 這是第二種形式變得更有趣的地方。卡爾達諾允許使用代表驗證邏輯的腳本來鎖定資金,該邏輯必須滿足才能花費由地址保護的資金。我們通常將此類地址稱為“script addresses”(腳本地址)。與第一種形式類似,整個腳本必須由來自腳本地址的任何交易支出以及腳本所需的任何其他元素提供作為見證。腳本就像謂詞。換句話說,它們是傳回布林值的函數: `True`或`False` 。要被視為有效,事務中的所有腳本都必須傳回`True` 。 >1.鎖定資金:在 Cardano 中,用戶可以使用腳本來鎖定資金,這些腳本定義了必須滿足的條件,才能從地址中支出資金。這些地址被稱為腳本地址(script addresses)。 2.交易的見證:和使用傳統地址的方式類似,從腳本地址進行支出時,交易必須提供整個腳本作為見證。此外,交易還需要提供執行該腳本所需的其他元素,以確保資金能夠正確地解鎖和支出。 3.腳本作為謂詞:腳本可以被視為謂詞(predicates),本質上是返回布爾值(True 或 False)的函數。當交易執行時,該腳本會評估其內部的邏輯條件,判斷是否滿足花費資金的要求。 4.有效性檢查:在一筆交易中,所有腳本必須被正確地執行並返回有效的結果(通常是 True),才會被視為有效。這意味著,如果腳本中的某個條件不滿足,該交易將無法成功執行。 這種方式使 Cardano 的資金管理更為靈活,允許開發者定義更為複雜的資金支出條件,相比於傳統的金鑰對系統,腳本提供了更高的靈活性和功能性,能夠支持多種應用場景,如多重簽名、時間鎖定或其他自定義條件的實現。 ### Delegation credentials(委託憑證) addresses也可能包含委託憑證,也稱為delegation part(委託部分)。將委託憑證視為控制與地址相關的stake(權益)可以執行的操作的一種方式。權益對應於共識協議用來選舉區塊生產者的產出值(output's value)中的 Ada 數量。在卡爾達諾中,stake可以委託給稱為權益池(stake pools)的註冊實體。透過委託,人們表明與產出相關的權益應該被視為屬於受委託者,從而增加了他們產生區塊的機會。作為回報,受委託人同意與委託人分享其出塊獎勵的一部分。 >1.委託憑證的定義:地址中可以包含委託憑證,這部分通常被稱為委託部分(delegation part)。委託憑證的作用是控制與該地址相關的權益如何被使用。 2.權益與 Ada 的關聯:權益代表了地址中與 Ada 數量相對應的部分。這些權益在共識協議中被計算,用以選舉區塊生產者(block producers)。 3.委託給權益池:在 Cardano 中,權益可以委託給註冊的實體,稱為權益池(stake pools)。當用戶將其權益委託給一個權益池時,他們表示該地址中的權益應該計入該權益池,這樣可以提高該權益池生產區塊的機會。 4.獎勵的分享:作為回報,權益池的運營者(delegatee)同意將他們生產區塊所獲得的一部分獎勵分享給委託者(delegator)。這種安排使得即使是小額的 Ada 持有者也可以參與區塊生產的過程,獲得一定的獎勵。 支付憑證(payment credentials)控制如何花費輸出(output),而委託憑證(delegation credentials)控制兩個單獨的操作: - 如何`publich`(發布)委託證書(例如將權益委託給權益池); - 如何`withdraw`(提取)與權益憑證相關的獎勵。 與支付憑證一樣,委託憑證有兩種形式:作為驗證金鑰雜湊摘要或作為腳本雜湊摘要。 ### TL;DR ``` ┌ For spending │ ╽ ┏━ Header ━━━━━━━━━━━━━┳━ Payment credentials ━━━━━━━┳━ Delegation credentials ━━━━┓ ┃ ┃ ┃ ┃ ┃ ┃ ┌───────────────────────┐ ┃ ┌───────────────────────┐ ┃ ┃ ┌──────┬─────────┐ ┃ │ Verification key hash │ ┃ │ Verification key hash │ ┃ ┃ │ Type │ Network │ ┃ ├────────── OR ─────────┤ ┃ ├────────── OR ─────────┤ ┃ ┃ └──────┴─────────┘ ┃ │ Script hash │ ┃ │ Script hash │ ┃ ┃ ┃ └───────────────────────┘ ┃ └───────────────────────┘ ┃ ┃ ┃ ┃ ┃ ┗━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ ╿ │ └ For: - publishing certificates - withdrawing rewards ``` - 地址由 2 或 3 部分組成:它始終包含Header和Payment credentials,並且還可以選擇包含Delegation credentials; - Header描述了address類型及其所屬網路; - Delegation credentials部分雖然是可選的,但仍然強烈建議; - 憑證(playment或delegation)採用以下兩種形式之一: - a verification key hash(驗證密鑰哈希); - a script hash(腳本哈希); - Payment credentials控制如何從某個address進行支出; - Delegation credentials控制如何`publish`證書以及如何`withdraw`獎勵; - 腳本允許定義任意驗證邏輯。 ## Scripts , Datums and Redeemers ### Overview(概述) 我們已經了解了 UTxO 是什麼以及address由什麼組成,並且我們討論了一些關於腳本的內容。特別是,我們說腳本就像謂詞:即純函數(在數學意義上),將交易作為參數並傳回`True`或`False` 但,不完全是這樣,如果只是這樣,會很難表達更複雜的邏輯。 特別是,程式經常需要捕獲狀態是不可行的。 狀態及其轉換,就是eUTxO(擴展UTxO)模型的用武之地。 當我們說輸出包含value、address和data payload時,我們之前提到了datums(數據),但沒有將其稱為datums。這就是datums,它是一個免費的payload,開發人員可以使用它來將數據(data)附加到腳本執行中。當腳本在支出場景中執行時,它不僅接收交易作為上下文,還接收與所支出的輸出關聯的資料。 >1.Datum 的定義:之前提到輸出包含了價值(value)、地址(address)和數據負載(data payload)。這個數據負載實際上就是 datum,即開發人員可以用來附加在腳本執行上的自由格式數據。 2.使用場景:當一個腳本在花費情況下被執行時,不僅會接收到作為上下文的整個交易,還會接收到與正在花費的輸出相關的 datum。這使得腳本能夠訪問並利用這些數據來執行更複雜的邏輯。 3.作用與功能:Datum 提供了腳本執行時所需的額外上下文信息。例如,datum 可以存儲交易中的特定條件或狀態,這樣腳本在執行時可以根據這些信息來判斷是否允許花費該輸出。 另一方面,redeemer是另一個數據,也隨任何腳本執行的交易一起提供。請注意,datum和redeemer在兩個不同的時刻進行幹預。建立輸出時設定datum(即當便利貼掛在牆上時,它是便條的一部分)。相反,只有在花費輸出時才提供redeemer(即在將其移交給員工時與表格一起提供)。 >1.Redeemer 的定義:Redeemer 是在任何腳本執行中隨交易提供的另一部分數據。這個數據在花費輸出時用來提供額外的上下文信息,幫助腳本判斷交易是否符合執行條件。 2.Datum 和 Redeemer 的區別: • Datum 是在輸出創建時設置的。這意味著當輸出被生成(例如,將備註貼在牆上)時,datum 就已經成為該輸出的一部分。 • Redeemer 是在花費輸出時提供的。這是交易的一部分,當用戶提交交易給驗證節點時,redeemer 就像是隨表格提交給員工的附加資料。 3.應用場景和流程: • 當創建輸出時,會附帶 datum 作為數據負載,記錄所需的上下文信息或狀態。 • 當花費輸出時,交易會包含 redeemer,作為提供給驗證節點以證明符合腳本邏輯的附加數據。 ### Analogy(類比) 看待腳本、datum和redeemer的另一種方法是將它們一起視為形成參數化的數學函數。 ``` Script ╭─────────╮ f(x) = x * a + b = true | false ╿ ╿ ╿ Redeemer ┘ │ │ └─┬─┘ Datum ``` 該腳本將函數定義為一個整體。它指示參數和參數如何組合以產生布林結果。此datum對應於函數的參數。它允許配置功能並透過不同的設定重新使用類似的驗證邏輯。當資源被鎖定在輸出時,函數和參數都會被定義。只剩下稍後提供的函數參數。此參數是redeemer(以及交易的其餘部分)。 >1.腳本的作用:腳本本質上定義了整個函數邏輯,指出如何將參數和參數組合來產生布爾結果(True 或 False)。它負責執行驗證邏輯,決定交易是否有效。 2.Datum 作為參數:Datum 對應於函數的參數,它用來配置函數,使開發者能夠在不同的條件下重用相似的驗證邏輯。當資產被鎖定到一個輸出中時,datum 和腳本一起被定義。 3.Redeemer 作為函數的參數:當花費輸出時,需要提供函數的具體參數,這就是 redeemer(以及交易的其他部分)。Redeemer 是在花費時提供的,作用類似於函數執行時的輸入變量,幫助驗證節點決定腳本是否應返回 True,從而允許交易成功。 4.完整過程: • 當輸出被創建時,腳本和 datum 被一起鎖定。 • 當交易試圖花費這個輸出時,redeemer 與交易一起提交,作為腳本執行所需的參數。 • 最後,腳本將 datum 和 redeemer 組合,並使用它們來驗證交易,返回布爾值決定是否可以花費該輸出。 這樣的設計允許開發者在創建輸出時配置靜態條件(datum),而在花費時提供動態參數(redeemer),以實現靈活而強大的驗證邏輯。 這就是腳本通常被稱為validators(驗證器)的原因。因此,與其他一些區塊鏈系統不同,它們也是完全確定的。它們的執行僅取決於它們所涉及的交易,並且在將交易發送到網路之前可以評估交易的結果。datum充當本地狀態,redeemer是交易本身提供的使用者輸入。 >1.腳本作為驗證器:Cardano 的腳本通常被稱為驗證器,因為它們的主要任務是驗證交易是否符合預定的條件。這與其他一些區塊鏈系統有所不同,在 Cardano 中,腳本的執行是完全決定性的(deterministic)。 2.完全決定性:腳本的執行結果只依賴於相關的交易,這意味著在將交易提交到網絡之前,可以確定其執行結果是否有效。這種決定性避免了執行結果的隨機性或不確定性,使得系統更可預測和可靠。 3.Datum 和 Redeemer 的角色: • Datum 作為局部狀態:Datum 用於在輸出中記錄局部狀態,當輸出被創建時設置,並與腳本一起存儲。 • Redeemer 作為用戶輸入:Redeemer 是在花費輸出時由用戶提供的輸入數據,作為驗證腳本的一部分,用來判斷交易是否符合驗證條件。 >如果我們退後一步,看看支出資金的典型公鑰/私鑰程序,我們可以看到 eUTxO 只是其概括。事實上,公鑰(哈希)可以被視為datum,而簽名則是redeemer。該腳本是數位簽章驗證演算法,用於控制簽章對於所提供的金鑰是否有效。 ### Purposes(目的) 到目前為止,我們主要討論了驗證輸出是否可以使用的腳本。前面我們也簡單提到如何使用腳本來控制委託證書的發布或如何提取共識獎勵。 這些不同的用例通常稱為script purposes(腳本目的)。到目前為止,我們已經看到了三個purposes(目的):`spend` 、 `publish`和`withdraw` 。還有三個: `mint` 、 `vote`和`propose` 每個目的都表明腳本執行的目的。在驗證過程中,該資訊與交易和redeemer一起傳遞到腳本。請注意,只有出於`spend`目的執行的腳本才會給出datum。這是因為它們可以利用輸出中存在的資料有效負載(payload),這與無法獲得此機會的其他目的不同 #### Mint(鑄造) 鑄造目的(mint purpose)是指執行腳本來驗證使用者定義的資產是否可以鑄造(minted)(即創建)或burned(即銷毀)。 Cardano確實支援使用者定義的資產,這些資產用於表示同質化資產(如協議貨幣)或非同質化資產(又稱NFT)。 >1.鑄幣用途(Mint Purpose):指的是腳本在用戶自定義資產的鑄造(即創建)或銷毀時執行的驗證邏輯。這些腳本負責檢查交易是否符合規定條件,以允許或拒絕資產的鑄造或銷毀行為。 2.用戶自定義資產: • 同質化資產(Fungible Assets):這類資產可用來代表類似於協議貨幣的可替代數量,比如代幣、點數等。 • 非同質化資產(NFTs):這類資產則用來代表唯一的、不可替代的物品,如藝術品、數字收藏品等。 3.驗證過程:當用戶在 Cardano 區塊鏈上發起資產的鑄造或銷毀交易時,系統會執行相關的腳本來驗證此操作是否符合條件。這確保了只有符合特定規則的交易才能影響資產的供應量。 管理資產創建或銷毀的規則被定義為腳本。我們經常將此類腳本稱為鑄幣策略(minting policies),它對應於上面的`mint`目的。 #### Vote(投票) 投票目的(vote purpose)驗證腳本委託代表的治理投票。每個委託憑證的每個交易都會執行一次,即使該交易實際上包含多個投票。這可以方便地建立比單純的公鑰更複雜的委託代表;例如,模擬熱/冷密鑰的設置。 >1.投票用途的作用:它用於驗證來自腳本代表(script delegate representative)的治理投票。這類驗證在每筆交易中針對每個代理憑證執行一次,即使交易包含多個投票也不例外。 2.應用場景:這種驗證模式非常適合構建比單純使用公鑰更複雜的代表系統。舉例來說,可以用來模擬熱/冷密鑰的設置,增強安全性與靈活性。 3.熱/冷密鑰架構:熱密鑰是指更常用、但暴露在風險之下的密鑰,用於日常操作;而冷密鑰則儲存在更安全的環境中,用於更關鍵的操作。此驗證機制允許用戶設計這類密鑰架構,使治理操作能夠在不同層級的安全性中進行。 #### Propose(提出) 最後,提議的目的(propose purpose)是一個非常獨特的目的,因為整個帳本中只能有一個腳本可以執行該目的:憲法護欄腳本(constitution guardrails script)。此腳本(可選)以鏈上憲法定義,並由分類帳針對提出治理行動的每筆交易執行。其目標是確保從一開始就拒絕一些提案,以防止網路上出現垃圾郵件和不明智的提案——特別是在協議參數方面。 >1.提案用途的特殊性:提案用途與其他用途不同,因為整個賬本中只能有一個腳本可以執行這個用途,這就是 “憲法防護欄腳本(constitution guardrails script)”。 2.憲法防護欄腳本:這個腳本可以選擇性地隨鏈上憲法(on-chain constitution)定義,並在每次交易提出治理行動時由賬本執行。其作用是在提案提交後但正式討論和投票之前進行初步過濾。 3.目標和功能: • 阻止不良提案:此腳本的目的是保證一些不合適的提案一開始就被拒絕,以避免網絡上充斥著不恰當的提案或垃圾提案。 • 特別針對協議參數:此過濾尤其針對涉及協議參數的提案,以保護系統的穩定性和一致性。 例如,將區塊大小從當前值降低到零的提案將使該鏈完全癱瘓,並且無論如何都沒有機會被接受。護欄腳本甚至可以阻止其提交。原則上,這是憲法的綱領性實施。 ### TL;DR - 腳本(scripts)類似參數化謂詞函數,傳回 true 或 false。 - Datums扮演function parameters的角色,而redeemers扮演one of argument的角色。 - 腳本也稱為驗證器(validators),並且是完全確定性的(completely deterministic)。 - 腳本用於驗證交易中的特定操作。 - 腳本(script)的用途稱為其目的(purpose)。有6個purpose: - Mint(鑄造):控制如何鑄幣或銷毀資產。 - Vote:控制如何對提案程序進行投票。 - Propose:控制提議程序的合憲性。 - spend:控制如何支付輸出 - withdraw:控制如何提取共識獎勵 - publish:控制如何發布委託證書 - 只有spending scripts (即purpose=spend)才能存取datum。 補充:關於eUTxO的有趣的網站:https://eutxo.org/
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up