如何在Polkadot構(gòu)建和部署智能合約
Polkadot是下一代區(qū)塊鏈協(xié)議,它將多個專用區(qū)塊鏈連接到一個統(tǒng)一網(wǎng)絡(luò)中。它以以前的區(qū)塊鏈網(wǎng)絡(luò)的革命性前景為基礎(chǔ),同時提供了一些基本優(yōu)勢。
Polkadot的優(yōu)點
Polkadot項目將通過提供類似橋的框架來徹底改變區(qū)塊鏈技術(shù),該框架具有以下優(yōu)點:
- 無限的可擴展性-Polkadot可以支持無限數(shù)量的區(qū)塊鏈并允許它們連接(被稱為順鏈)。
- 適應(yīng)性共識機制—由于不同的區(qū)塊鏈在不同的共識機制上運行,Polkadot平臺提供了一個開放且適應(yīng)性強的共識機制。
- 跨鏈交易—該框架可支持不同區(qū)塊鏈之間的價值轉(zhuǎn)移。
- 定義的治理機制—它具有定義的治理機制,從而消除其他區(qū)塊鏈面臨的主要問題。
- 可升級性— Polkadot支持升級,而不必借助費力的硬分叉來實施更改。
- 集合安全性-與Polkadot連接的區(qū)塊鏈可以通過統(tǒng)一的安全保護(hù)傘來保護(hù)。這可以保護(hù)沒有安全引導(dǎo)的小型鏈。
- 低交易費用– Polkadot與以太坊相比,其交易費用較低。
智能合約
智能合約是一種自我執(zhí)行的軟件,由P2P網(wǎng)絡(luò)管理。它是有效的權(quán)限管理工具,無需傳統(tǒng)的法律合同即可為網(wǎng)絡(luò)參與者之間的協(xié)議提供協(xié)調(diào)和執(zhí)行框架。它們可用于形式化兩方之間的簡單協(xié)議,組織的章程或創(chuàng)建代幣。
在我們今天使用的Internet上,許多技術(shù)巨頭(例如Amazon,eBay,Airbnb,Uber等)的商業(yè)模式和“存在的理由”都會由于缺乏一個可信賴的本地結(jié)算層而造成的對不認(rèn)識的交易者缺乏信任。智能合約提供了精確解決該問題的解決方案。他們可以正式建立個人與機構(gòu)之間的關(guān)系以及他們在Internet上完全擁有的P2P關(guān)系,而無需信任的中介。
盡管智能合約的概念并不新鮮,但區(qū)塊鏈技術(shù)似乎是智能合約實施的催化劑。智能合約的一種更原始的形式是自動售貨機。交易規(guī)則被編程到機器中。您可以通過按與該產(chǎn)品相關(guān)的數(shù)字來選擇一種產(chǎn)品,插入硬幣,然后機器會檢查您是否投入了足夠的錢,從而充當(dāng)了智能合約。
自我執(zhí)行協(xié)議
智能合約是嵌入在由區(qū)塊鏈管理的計算機代碼中的自我執(zhí)行協(xié)議。該代碼包含一組規(guī)則,根據(jù)該規(guī)則,該智能合約的各方同意彼此交互。如果并且當(dāng)滿足預(yù)定義的規(guī)則時,將自動執(zhí)行該協(xié)議。智能合約提供了有效管理令牌化資產(chǎn)和兩方或多方之間訪問權(quán)限的機制。
如果滿足特定的預(yù)定條件,人們就可以將其視為可以解鎖價值或訪問權(quán)限的密碼盒。他們管理的基礎(chǔ)價值和訪問權(quán)限存儲在區(qū)塊鏈中,該區(qū)塊鏈?zhǔn)峭该鞯墓蚕矸诸悗?,可以保護(hù)它們免受刪除,篡改和修訂。因此,智能合約可以從區(qū)塊鏈內(nèi)部(其他智能合約)和外部(外部數(shù)據(jù)源)的實體調(diào)用智能合約。
在這些實體中,所謂的“預(yù)言家”將與智能合約相關(guān)的數(shù)據(jù)從鏈上世界注入到智能合約信息存儲中。如果執(zhí)行得當(dāng),智能合約可以提供優(yōu)于傳統(tǒng)合約法的交易安全性,從而降低審計和執(zhí)行此類協(xié)議的協(xié)調(diào)成本。
他們可以實時跟蹤協(xié)議的執(zhí)行情況,因此可以節(jié)省成本,因為合規(guī)性和控制權(quán)是即時發(fā)生的。智能合約將協(xié)議的交易成本降低了幾個數(shù)量級;具體而言,它們降低了達(dá)成協(xié)議,形式化和實施的成本。
此外,智能合約安全性仍然是一個需要在技術(shù)層面解決的問題。我們還需要能夠執(zhí)行更復(fù)雜的合同條款,包括分散的爭端解決工具。盡管這種發(fā)展可能需要更多時間才能成熟,但一些有趣的爭端解決方案已經(jīng)在開發(fā)中,例如“ Kleros”,“開放式法律”或“ Jur”。隨著技術(shù)變得更加成熟和廣泛以及采用法律標(biāo)準(zhǔn),我們可能會在未來幾年看到合法合同和智能合同的融合。但是,我們目前仍缺乏最佳實踐,可能需要一些時間才能進(jìn)入集體學(xué)習(xí)階段。
用例
智能合約用例的范圍從簡單到復(fù)雜。它們可用于簡單的經(jīng)濟(jì)交易,智能合約還可用于注冊任何種類的所有權(quán)和產(chǎn)權(quán)。智能合約有可能破壞許多行業(yè)。用例可以在銀行,保險,能源,電子政務(wù),電信,音樂行業(yè),藝術(shù),移動性,教育等領(lǐng)域。
使用智能合約,每個協(xié)議,每個流程,任務(wù)和付款都可以具有數(shù)字記錄和簽名,可以對其進(jìn)行識別,驗證,存儲和共享。諸如“ Bernstein”(專利注冊機構(gòu))或政府和半政府注冊機構(gòu)(土地所有權(quán),出生證類別,學(xué)校和大學(xué)學(xué)位)之類的時間戳服務(wù)是簡單的技術(shù)用例的示例。
雖然時間戳服務(wù)在技術(shù)層面上很容易實現(xiàn),但根據(jù)行業(yè)類型和特定用例,此類用例的監(jiān)管方面可能要復(fù)雜得多。此外,智能合約還可用于商品或服務(wù)供應(yīng)鏈中眾多參與者之間更為復(fù)雜的協(xié)議,或在不需要傳統(tǒng)的集中式機構(gòu)的情況下管理一群擁有相同興趣和目標(biāo)的人。分散式自治組織(DAO)就是這樣的一個例子,可能代表了最復(fù)雜的智能合約。因此,智能合約可以規(guī)范治理規(guī)則(組織的章程,治理法規(guī),議事規(guī)則或組織章程),并用自我執(zhí)行的代碼代替日常運營管理。
模型
以太坊2.0中的分片都具有相同的狀態(tài)轉(zhuǎn)換函數(shù)(STF),就像管理區(qū)塊鏈如何更改每個區(qū)塊的狀態(tài)的規(guī)則中的規(guī)則一樣。該STF提供了用于智能合約執(zhí)行的界面。合同存在于單個分片上,并且可以在分片之間發(fā)送異步消息。
同樣,在Polkadot中,每個分片都承載核心邏輯,這些分片并行執(zhí)行,并且Polkadot可以發(fā)送跨分片的異步消息。但是,每個Polkadot分片(在Polkadot術(shù)語中為“對鏈”)都具有唯一的STF。通過組合邏輯,應(yīng)用程序可以存在于單個碎片中,也可以存在于多個碎片中。Polkadot使用WebAssembly(Wasm)作為“元協(xié)議”。碎片的STF可以是抽象的,只要Polkadot上的驗證程序可以在Wasm環(huán)境中執(zhí)行即可。
建筑學(xué)
Polkadot是具有共享安全性和互操作性的異構(gòu)多鏈。
中繼鏈
中繼鏈?zhǔn)荘olkadot的中央鏈。Polkadot的所有驗證器都已放置在DOT的中繼鏈上,并進(jìn)行中繼鏈驗證。中繼鏈由相對較少的交易類型組成,其中包括與治理機制進(jìn)行交互,平行鏈拍賣以及參與NPoS的方式。中繼鏈故意具有最小的功能,主要職責(zé)是協(xié)調(diào)整個系統(tǒng)。
平行鏈和平行線程插槽
Polkadot可支持多個執(zhí)行插槽。這些插槽就像計算機處理器上的核心(例如,現(xiàn)代筆記本電腦的處理器可能具有八個核心)。這些內(nèi)核中的每個內(nèi)核可以一次運行一個進(jìn)程,Polkadot使用兩種訂閱模型允許這些插槽:并行鏈和并行線程。平行鏈有一個專用的鏈槽(核心),就像一個不斷運行的過程。Parathread在組中共享插槽,因此更像是需要喚醒且運行頻率較低的進(jìn)程。
整個Polkadot網(wǎng)絡(luò)上發(fā)生的大多數(shù)計算都將委托給處理各種用例的特定parachain或parathread實現(xiàn)。Polkadot對平行鏈可以做什么沒有任何限制,除了它們必須能夠生成可以由分配給平行鏈的驗證者驗證的證據(jù)外。該證明驗證了旁鏈的狀態(tài)轉(zhuǎn)變。
一些平行鏈可能特定于特定的應(yīng)用程序,另一些平行鏈可能專注于諸如智能合約,隱私或可伸縮性之類的特定功能-仍然,其他平行鏈可能是實驗性架構(gòu),本質(zhì)上不一定是區(qū)塊鏈。
Polkadot提供了多種方法來在特定時間段內(nèi)固定旁鏈插槽的插槽。Parathread是共享插槽的池的一部分,必須贏得各個塊的拍賣。并行線程和并行鏈具有相同的API。他們的區(qū)別是經(jīng)濟(jì)上的。平行鏈將必須在其插槽租賃期間保留DOT;parathreads將按塊收費。平行線程可以變成平行鏈,反之亦然。
共享安全
連接到Polkadot中繼鏈的平行鏈都共享中繼鏈的安全性。Polkadot在中繼鏈和所有連接的副鏈之間具有共享狀態(tài)。如果中繼鏈由于某種原因必須還原,那么所有平行鏈也將還原。這是為了確保整個系統(tǒng)的有效性可以持續(xù)存在,并且任何單個部分都不可損壞。
共享狀態(tài)使得使用Polkadot平行鏈時的信任假設(shè)僅是中繼鏈驗證器集中的那些,而沒有其他假設(shè)。由于預(yù)計中繼鏈上設(shè)置的驗證器將是安全的,并且要有大量股份支持該驗證器,因此旁鏈應(yīng)從這種安全性中受益。
基板
基板是用于構(gòu)建區(qū)塊鏈的開源,模塊化和可擴展框架。
底層從頭開始進(jìn)行了靈活設(shè)計,使創(chuàng)新者可以設(shè)計和構(gòu)建滿足其需求的區(qū)塊鏈網(wǎng)絡(luò)。它提供了構(gòu)建自定義區(qū)塊鏈節(jié)點所需的所有核心組件。
基板開發(fā)人員中心節(jié)點模板
我們以Node Template的形式提供了一個開箱即用的基于Substrate的節(jié)點,您在閱讀本文時應(yīng)對其進(jìn)行編譯。無需進(jìn)行任何更改,您可以共享此節(jié)點模板,并創(chuàng)建具有加密貨幣和所有內(nèi)容的有效的區(qū)塊鏈網(wǎng)絡(luò)!
我們將教您如何在“開發(fā)”模式下使用該節(jié)點,該模式使您可以在單個節(jié)點上運行網(wǎng)絡(luò),并擁有一些預(yù)先配置的有資金的用戶帳戶。
建立和部署合同
1.安裝先決條件
- # Install Homebrew if necessary https://brew.sh/ /bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" # Make sure Homebrew is up-to-date, install openssl brew update brew install openssl
2.Rust開發(fā)人員環(huán)境
- # Install curl https://sh.rustup.rs -sSf | sh # Configure source ~/.cargo/env
- rustup default stable
3.基材的最新報道
自行構(gòu)建Substrate的開發(fā)人員應(yīng)始終每晚穩(wěn)定使用Rust的最新無錯誤版本。這是因為Substrate代碼庫遵循Rust每晚的技巧,這意味著Substrate的更改通常取決于Rust每晚編譯器的上游更改。為了確保您的Rust編譯器始終是最新的,您應(yīng)該運行:
- rustup update
- rustup update nightly
- rustup target add wasm32-unknown-unknown --toolchain nightly
4.Wasm工具鏈
現(xiàn)在,配置每晚版本以與Wasm編譯目標(biāo)一起使用:
- rustup target add wasm32-unknown-unknown — toolchain nightly
5.編譯基板
一旦安裝了先決條件,您就可以使用Git克隆Substrate Developer Hub節(jié)點模板,這是在Substrate上構(gòu)建的良好起點。
- git clone -b v3.0.0 — depth 1 https://github.com/substrate-developer-hub/substrate-node-template
6.編譯節(jié)點模板
- cd substrate-node-template # NOTE: you should always use the `--release` flag cargo build --release # ^^ this will take a while!
7.安裝前端模板
本教程使用ReactJS前端模板來允許您與應(yīng)該在上一步中開始編譯的基于Substrate的區(qū)塊鏈節(jié)點進(jìn)行交互。將來,您可以使用相同的前端模板為自己的項目創(chuàng)建UI。
要使用前端模板,你需要的紗線,其本身需要Node.js的。如果您沒有這些工具,則必須按照以下說明進(jìn)行安裝:
- 安裝Node.js
- 安裝紗
現(xiàn)在,您可以使用這些命令來設(shè)置前端模板。
- # Clone the frontend template from github git clone -b v3.0.0 --depth 1 https://github.com/substrate-developer-hub/substrate-front-end-template # Install the dependencies cd substrate-front-end-template yarn install
8.啟動節(jié)點
運行以下命令以啟動您的節(jié)點:
- # Run a temporary node in development mode ./target/release/node-template — dev — tmp
使用此命令,如果您的節(jié)點運行成功,您應(yīng)該會看到類似以下的內(nèi)容:
節(jié)點已啟動
- Start the Front-End Template
- # Make sure to run this command in the root directory of the Front-End Template yarn start
前端
9.合約組成
對于使用其他現(xiàn)代智能合約語言進(jìn)行編程的開發(fā)人員,應(yīng)該感到熟悉。合同的骨架具有您可能期望的所有相同組件:
- 大事記
- 貯存
- 部署(構(gòu)造函數(shù))功能
- 公共職能
- 內(nèi)部功能
每個合約功能明確定義了可變性和可見性。在這些功能中,您可以訪問幾種常見的基材類型,如AccountId,Balances,Hash,等。
10.創(chuàng)造an ink!項目
我們將使用an ink!CLI生成Substrate智能合約項目所需的文件。
確保您位于工作目錄中,然后運行:
- cargo contract new flipper
- cd flipper/
- flipper
- |
- +-- lib.rs <-- Contract Source Code
- |
- +-- Cargo.toml <-- Rust Dependencies and ink! Configuration
- |
- +-- .gitignore
11.建立合同
運行以下命令來編譯您的智能合約:
- cargo +nightly contract build
將項目投影為Wasm二進(jìn)制文件,元數(shù)據(jù)文件(包含合同的ABI)和將.contract兩者捆綁在一起的文件。該文件可用于將合同部署到鏈中。如果一切順利,您應(yīng)該看到一個target包含以下文件的文件夾:
- target
- └── flipper.wasm
- └── metadata.json
- └── flipper.contract
12.測試您的合同
您將在源代碼底部看到一個簡單的測試,它可以驗證合同的功能。
在您的項目文件夾中運行:
- cargo +nightly test
您應(yīng)該看到要成功完成的測試:
- $ cargo +nightly test
- running 2 tests
- test flipper::tests::it_works ... ok
- test flipper::tests::default_works ... ok
- test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
13.部署合同
現(xiàn)在我們已經(jīng)從源代碼生成了Wasm二進(jìn)制文件并啟動了Canvas節(jié)點,我們希望將該合同部署到我們的Substrate區(qū)塊鏈上。
Substrate上的智能合約部署與傳統(tǒng)智能合約區(qū)塊鏈上的部署有些不同。
每次您在其他平臺上推送合同時,都會部署一個全新的智能合同源代碼塊,而Substrate選擇優(yōu)化此行為。。
在Substrate中,合同部署過程分為兩個部分:
- 將您的代碼放在區(qū)塊鏈上
- 創(chuàng)建合同實例
通過這種模式,可以將諸如ERC20標(biāo)準(zhǔn)之類的合同代碼一次性放置在區(qū)塊鏈上,但是可以實例化任意次。
無需持續(xù)上傳相同的源代碼并浪費區(qū)塊鏈上的空間。
上載Wasm和元數(shù)據(jù)
將代碼放在上,當(dāng)您按Deploy時,應(yīng)該會看到一系列事件,包括創(chuàng)建新帳戶(system.NewAccount)和合同的實例化(contracts.instantiate):
打開“畫布UI”的特殊設(shè)計的“上傳”部分。
使用下拉菜單選擇具有一些帳戶余額的部署帳戶,例如Alice。在輸入字段中輸入合同名稱。提供flipper.contract文件作為捆綁的Wasm Blob和元數(shù)據(jù)。
14.簽訂合同
單擊上載,然后在確認(rèn)頁面上簽名并提交。
這應(yīng)該發(fā)出一個contracts.PutCode事件。如果交易成功,您將收到一個system.ExtrinsicSuccess事件,您的WASM合同將存儲在您的Substrate區(qū)塊鏈上!
創(chuàng)建合同實例
智能合約作為區(qū)塊鏈上會計系統(tǒng)的擴展而存在。因此,創(chuàng)建此合同的實例將創(chuàng)建一個新合同,該合同將AccountId存儲由智能合同管理的任何余額并允許我們與合同進(jìn)行交互。
在上一步中上傳合同后,確認(rèn)屏幕將顯示代表我們的智能合同的信息。現(xiàn)在,我們需要部署智能合約來創(chuàng)建實例。在確認(rèn)屏幕上按“部署代碼”按鈕。
要實例化我們的合同,請接受默認(rèn)選項,為該合同帳戶提供一筆of賦,1000 Units用于支付存儲租金,并將最大允許汽油價值設(shè)置為1000000:
當(dāng)您按Deploy時,應(yīng)該會看到一系列事件,包括創(chuàng)建新帳戶(system.NewAccount)和實例化合同(contracts.instantiate):
現(xiàn)在您的合同已被完全部署,我們可以開始與它進(jìn)行交互了!Flipper只有兩個功能,因此我們將向您展示同時使用這兩個功能的感覺。在上一步中,在部署了Flipper合同實例之后,在出現(xiàn)的確認(rèn)屏幕上,單擊“執(zhí)行合同”按鈕。
default()功能
如果您回顧一下我們合同的default()功能,我們會將Flipper合同的初始值設(shè)置為false。讓我們檢查一下是否是這種情況。
在“要發(fā)送的消息”部分中,選擇“ get():bool”消息,并接受其他選項的默認(rèn)值。
按“呼叫”并確認(rèn)它返回值false:
因此,true現(xiàn)在就讓價值轉(zhuǎn)向吧!
我們可以通過用戶界面發(fā)送的替代消息是flip()。同樣,接受其他選項的默認(rèn)值。
您會注意到該flip()消息默認(rèn)為交易呼叫。
如果交易成功,那么我們應(yīng)該可以返回到該get()函數(shù)并查看更新后的存儲:
目前為止,我們已經(jīng)成功在Polkadot上構(gòu)建和部署了智能合約,有任何疑問可以在留言區(qū)留言。