智慧合約的最初三分鐘
用5個CMT可以做什麼?
很悲傷的訊息是,在幣圈大涼的環境下,按照現在的幣價來算,只能買一瓶礦泉水。
但是這5個CMT 在開發人員手裡,大有用處!究竟能夠發揮了什麼作用,來CyberMiles開發者社群11月25日舉辦的 2小時學會編寫智慧合約Workshop101 看看。
Hello World
Hello world 是最簡單的程式之一,也是大部分程式設計師編寫的第一個程式。這次的workshop 101 也是從最基礎的Hello world智慧合約開始。
這裡要特別指出哦,Hello World 部分的主講人楊樂。她是CyberMiles 的產品經理,是香港大學英文文學系的高材生,她與這次來參會的大多數人一樣,在此之前,沒有任何程式設計經驗。只要你願意,歡迎來到開發者社群小課堂的講臺喲。
說回正題,在正式部署執行Hello world智慧合約之前,我們需要在電腦上安裝MetaMask for CMT。這是一個安裝在Chrome 瀏覽器的錢包工具,它的主要功能是管理 CyberMiles 帳號私鑰,實現從網頁上直接支付 CMTs (包括gas 費)等功能。

安裝過程比較簡單,去官網 (https://www.cybermiles.io/metamask/) 下載外掛,之後在Chrome的擴充套件程式中開啟開發者模式,將下載好的 metamask4cmt.crx 拖拽至Chrome 的擴充套件程式頁面。
拖拽後,如果Metamask for CMT 不能正常工作,可以試下重啟瀏覽器。如果依然不能正常工作,來參加workshop 的程式設計師提供了一個新的方法,非常厲害,當天拯救了不少人的電腦。
把下載好的metamask4cmt.crx 的字尾改成.rar,進行解壓。在Chrome 擴充套件程式頁面,點選 “載入已解壓的擴充套件程式”,新增解壓好的metamask4cmt.crx 就可以了。
此外,如果Chrome 中已經安裝了其他版本的MetaMask,為了不影響使用,最好暫時停止使用其他版本的MetaMask,只留Metamask for CMT啟用。
安裝好MetaMask for CMT,就可以生成一個新的 CyberMiles 帳號來儲存 CMTs,在最上方選擇Main CyberMiles Network。因為主辦方會給每個人發5個真實的CMT,用於支付執行智慧合約的gas 費以及參與後面的神祕環節。
CMT的轉賬速度非常快,差不多10秒就到賬了,並且不用支付gas費,轉賬體驗非常好!
有了5個CMT和MetaMask for CMT,就可以開始我們的Hello World!
在 Chrome 裡開啟Remix for CMT的網頁,將寫好的Hello World智慧合約程式碼放進中間的程式碼編輯區,當然,你也可以選擇自己寫程式碼。
之後點選右側的 Start to compile, 編譯器會自動檢查這段程式碼是否存在常規性錯誤。沒有問題的話,編譯器會自動識別出該段合約的名稱,也就是 Contract 後面的Greet。如果有問題,編譯器會給出提示,根據提示修改程式碼,再次編譯即可。

檢查程式碼沒有問題後,就可以把Greet智慧合約部署到 CyberMiles 區塊鏈了。點選右側最上方的Run,然後點選Deploy。這時需要呼叫MetaMask for CMT 支付部署智慧合約所需要的gas 費。
一般情況下,MetaMask 的支付頁面會自動跳出,點選 Submit 進行支付就可以了。如果沒有自動跳出,手動點選外掛就好了。可以看到,部署這個合約上鍊只需要花費0.000489個CMT。

支付完gas 費後,右下方Deployed Contracts 處就可以看到,我們的合約已經在CyberMiles 鏈上部署好了。
紅色的terminate 可以終止這個合約,但只有合約owner 才可以執行這項操作,終止合約同樣需要支援少量gas 費。
greet 顯示智慧合約的內容是什麼,在這裡是Hello World。當然,Hello World 這個詞只是程式設計師的選擇。作為智慧合約的開發者,你可以讓 greet() 返回任何字元 — 可以是一首歌,一篇文章,一本書,或者是一段加密的文字。
owner 顯示這個合約的所有權歸哪個地址所有。你為這個合約支付部署gas費的賬號地址就是合約的所有者。

同時用區塊瀏覽器 (cmttracking.io/) 查詢交易地址資訊,可以看到剛剛建立的合約地址。如果你的朋友有這個合約地址,在 At Address 欄內輸入合約地址,點選At Address 就可以收到別緻的智慧合約問候啦!

我們上面看見怎麼用Hello World智慧合約在區塊鏈存一段話,並讓世界上任何人看見這段話。那麼,這是怎麼在程式碼裡實現的呢?
pragma lity ^1.2.4; 複製程式碼
這是智慧合約所用的程式碼語言及版本。
contract Greet { function greet() { } function terminate() { } } 複製程式碼
以上程式碼介紹了智慧合約的名字Greet,以及兩個功能,greet和terminate。
address public owner; modifier onlyOwner() { assert(msg.sender == owner); _; } constructor () public { owner = msg.sender; } 複製程式碼
以上的程式碼設定了合約的owner,owner的地址資訊是公開的。資訊傳送者,也就是誰支付了gas費,讓合約能夠部署到鏈上,誰就是owner,並且定義了只有owner能夠修改這個合約。
function greet() public pure returns (string) { return "Hello world"; } 複製程式碼
以上程式碼表明當你呼叫greet()時,就會出現 Hello World。這個功能只是從區塊鏈上讀取資料,所以不需要 gas 費用。這裡你可以把 Hello World 改成任何文字。
function terminate() external onlyOwner { selfdestruct(owner); } 複製程式碼
這就是智慧合約最開始定義的terminate 終止合約的功能,並且定義了只有Owner可以執行這項功能。selfdestruct是解構函式,用於銷燬資料,終止合約。
到這裡,Hello World的程式碼就結束了,這是一段非常完整的程式碼。
這個最基礎的合約既設定了合約的Owner,同時也設定了Owner 能夠銷燬合約,當執行selfdesruct時,合約裡的錢也會返還給Owner。
因為合約地址與錢包地址長地非常像,並且長度也一致,如果不小心把幣打到了合約地址,一般情況下,是無法找回的。但如果你知道合約的owner是誰,可以聯絡合約的owner,在銷燬合約時拿回你的資產。
這只是個人的小損失,如果專案方沒有認真地對待程式碼,帶來的資產損失是非常嚴重的。非常典型的案例是,今年7月份,Polkadot 有超過513,774.16 ETH 被凍結在Parity錢包中,就是因為合約中的 owner 被人設成 null 了,因此沒有人可以終止合約,拿回存在合約裡的錢。現在,錢仍然被鎖在合約裡,永久凍結。
謹慎對待,認真審查每一段程式碼,尤其是涉及到錢的程式碼,這是每個程式設計師該有的素質。
CyberMiles 連最基礎的智慧合約程式碼也保證了程式碼的完整性,值得我們學習。
Bet game 競猜小遊戲
這次workshop 還有進階版,通過智慧合約發起一個競猜遊戲,由智慧合約當裁判,可以說具備了完全的公正性。
程式碼比較複雜,不再一一解釋,有興趣的朋友可以自行去 github 研究一下。
ofollow,noindex">github.com/CyberMiles/…
Owner 把智慧合約部署在CyberMiles 區塊鏈上後,玩家可以在Remix for CMT中輸入合約地址,呼叫該合約,參與競猜遊戲。
遊戲規則是每個參加workshop的人先從2到12中隨機選擇一個整數,併為自己選擇的數字支付一定數量的CMT作為賭注。如果猜對了,將獲得等比例的CMT。

規則公佈後,Owner 選擇startGame ,遊戲正式開始!大家在現場躍躍欲試,有人大聲說著”all in”,有人應和著,現場一時異常歡樂。這也是5個CMT的神祕用處!
呼叫合約成功後,在右下方 placeBet處填寫自己選擇的整數,在右上方Value處,將單位選擇為CMT,並且填寫自己準備花費多少錢。填好後,通過Metamask for CMT支付 gas費,將下來坐等開獎!

楊樂在微信中隨機擲了兩個骰子,確認了最終的正確答案。在骰子”塵埃落定”的過程中,一片安靜,靜悄悄地等最終答案,看來大家都沉浸在遊戲中了。
正確答案出來後,合約Owner 在endGame處填寫數字8,並支付gas費。
接下來就到領獎環節,根據智慧合約的規則,前面在 placeBet 填寫了數字8的參與者將按比例平分收集到的所有下注的CMT。
贏家點選payme,支付gas 費,合約將自動把分配好的CMT 轉賬到贏家的CMT 賬戶裡,這一切由程式碼計算,執行。
現場有兩位贏家,一位以0.5 CMT拿走了5.3個CMT,一位以2CMT拿走21.2CMT。當然也有沒有猜中的同學不死心地點了payme,但是因為不是贏家,什麼也沒拿到,白白地支付了gas費。不相信智慧合約是不行的。
結果公示,兩位贏家拿走獎勵後,Owner 選擇 terminate 這個合約,遊戲到此圓滿結束!
用5個CMT 編寫智慧合約,和周圍的小夥伴一起討論這段程式碼該怎麼理解,又有CMT開發社群的人熱心指導,最後參與到有趣的遊戲中,見證了什麼叫做”Code is law”。
非常感謝CyberMiles 開發者社群能夠組織這樣一次活動。這是一次非常棒的體驗,也是區塊鏈技術應有的魅力之處!