智慧型合約簡介
最後編輯: @wackerow(opens in a new tab), 2024年4月22日
智慧型合約是什麼?
「智慧型合約」就是在以太坊區塊鏈上執行的程式。 這是一系列存在於以太坊區塊鏈特定地址的程式碼(函數)及資料(狀態)。
智慧型合約是一種以太坊帳戶。 這表示智慧型合約有餘額且能作為交易目標。 然而,智慧型合約不受使用者控制,而是部署至網路,並按程式編寫方式執行。 使用者帳戶能藉由傳送交易,執行智慧型合約定義的函數,來與智慧型合約互動。 智慧型合約能定義規則,就像一般合約一樣,且完全透過程式碼自動執行。 預設情況下,智慧型合約無法刪除,且與其互動的結果無法逆轉。
基本資訊
如果你是初學者,或是想找不技術性不太強的說明,推薦你參閱智慧型合約簡介。
務必先詳閱帳戶、交易及以太坊虛擬機後再踏入智慧型合約的世界。
數位販賣機
或許最適合智慧型合約的比喻是 Nick Szabo(opens in a new tab) 所說的「販賣機」。 只要輸入正確,就保證能得到特定的輸出結果。
要從販賣機取得一包點心:
1錢 + 點心選擇 = 點心分發
這種邏輯會編寫進販賣機中。
而智慧型合約就像販賣機,其中編寫了邏輯。 以下是若使用 Solidity 編寫智慧型合約,這種販賣機運作方式的簡要範例:
1pragma solidity 0.8.7;23contract VendingMachine {45 // Declare state variables of the contract6 address public owner;7 mapping (address => uint) public cupcakeBalances;89 // When 'VendingMachine' contract is deployed:10 // 1. set the deploying address as the owner of the contract11 // 2. set the deployed smart contract's cupcake balance to 10012 constructor() {13 owner = msg.sender;14 cupcakeBalances[address(this)] = 100;15 }1617 // Allow the owner to increase the smart contract's cupcake balance18 function refill(uint amount) public {19 require(msg.sender == owner, "Only the owner can refill.");20 cupcakeBalances[address(this)] += amount;21 }2223 // Allow anyone to purchase cupcakes24 function purchase(uint amount) public payable {25 require(msg.value >= amount * 1 ether, "You must pay at least 1 ETH per cupcake");26 require(cupcakeBalances[address(this)] >= amount, "Not enough cupcakes in stock to complete this purchase");27 cupcakeBalances[address(this)] -= amount;28 cupcakeBalances[msg.sender] += amount;29 }30}顯示全部複製
如同自動販賣機消除了我們對販賣員工的需求,智慧型合約也可取代許多產業的中間媒介。
無需許可
任何人都能編寫智慧型合約並部署於區塊鏈網路。 你只需要學習如何使用智慧型合約語言編碼,並取得足夠的以太幣,即可部署合約。 部署合約基本上是一種交易,因此你需要支付燃料費用,如同進行簡單的以太幣轉帳一樣。 然而,部署合約的燃料成本卻遠高於此。
以太坊具備方便開發者編寫智慧型合約的程式語言:
- Solidity
- Vyper
然而,在部署合約前需要先編譯,讓以太坊的虛擬機可以解譯並儲存合約。 深入瞭解編譯
可組合性
智慧型合約公開於以太坊, 類似一API於網路. 這表示你可以在自己的智慧型合約中,調用其他智慧型合約,以大幅拓展可能性。 合約甚至能部署其他合約。
深入瞭解智慧型合約的可組合性。
限制
智慧型合約本身無法取得「真實世界」事件的資訊,因為這些合約無法擷取鏈外來源中的資料。 這表示智慧型合約不會針對真實世界的事件做出反應。 這是刻意設計。 過度依賴外部資訊可能會破壞共識機制,而共識對安全性與去中心化至關重要。
然而,區塊鏈應用程式最好能使用鏈外資料。 解決方法是使用預言機,這種工具可以取得鏈外資料並提供給智慧型合約使用。
智慧型合約的另一個限制為合約大小的上限。 智慧型合約必須小於 24KB,不然燃料不足。 可以透過鑽石模式(opens in a new tab)迴避此問題。
多簽合約
多簽(多重簽章)合約是需要多個有效簽章,才能執行交易的智慧型合約帳戶。 這能有效預防持有大量以太幣或代幣的合約發生單點失效。 多簽合約也能將執行合約與金鑰管理的責任分散給多方,避免遺失單一私密金鑰造成資金無法回復的損失。 基於上述理由,多簽合約可用於簡單的去中心化組織管理體系。 多簽需要在 M 個可接受的簽章中取得 N 個簽章才能執行(其中,N ≤ M 且 M > 1)。 通常是N = 3, M = 5
以及 N = 4, M = 7
。 4/7 的多簽需要在七個可能的有效簽章中取得四個簽章。 這表示即便遺失三個簽章,仍可取回資金。 在這種情況下,這也表示大多數金鑰持有者必須同意並簽署,才能執行合約。
智慧型合約資源
OpenZeppelin Contracts - 開發安全智慧型合約的資料庫。