1. 程式人生 > >區塊鏈遊戲FOMO3D智能合約核心分析

區塊鏈遊戲FOMO3D智能合約核心分析

技術 重寫 term 時間 交流 aio 流程 blue 角度

技術分享圖片
最近做一個區塊鏈的項目,需要徹底分析FOMO3D的智能合約,順便熟悉一下區塊鏈的開發流程。
技術分享圖片
首先為了能跑FOMO3D的智能合約我嘗試了truffle+galanche,對我來說不太理想,我就自己用python+solc做了一個類似的框架。

可以編譯部署發布合約,自動生成前端的JS合約對象以及跑一個aiohttp的測試環境,該環境已經開源https://github.com/bluehook/pyw3c.git,
技術分享圖片
示例就是全套FOMO3D的智能合約,在分析的過程中我又重新寫了一遍FOMO3D也放在示例合約中叫TinyF3D,把所有功能都整合在這一個合約裏面,所有FOMO3D實現的功能,Tiny3D都有實現,並且函數名稱也保持一致,可以復制到remix裏面部署方便測試,交流可加微信號:bluehook。

技術分享圖片
網上已經有一些FOMO3D的分析文章,我盡量寫一些沒有分析到的部分。

從另外一個怪異的角度介紹一下FOMO3D這個項目,這個項目的核心是一個函數,這個函數的公式是這樣f(x)=sqrt(totala+b^2)-b)/c。

公式不重要,只需要知道這個函數是遞增的,比如x=1,f(x)返回1000,x=2,f(x)返回1100,每次x傳一樣的值返回都一樣,了解這個就夠了。

現在有這麽一個機制:我用x代表獎池的值,f(x)就是整個公式的返回代表當前獎池的值為x時,能夠購買的key數量。

這個假設清楚了就繼續,那麽我現在要購買0.1以太幣的keys,我不知道買多少個,反正我就買這麽多以太幣的,那麽可以買多個呢?因為函數是固定的,每一局遊戲開始時獎池都是從0開始,也就是說都是從x=0開始,那麽我當時能夠購買多少keys,反過來想就是要確定當我買了0.1以太幣時獎池總獎金x能購買多少keys再減去現在我沒有買時獎池總獎金x能購買的keys數量就是我出0.1以太幣這一段能買到的keys,

看看公式不難理解:
0.1eth / ( (sqrt((total+0.1)a+b^2)-b)/c) - (sqrt(totala+b^2)-b)/c) ),其中total代表當前總獎池金額。

上面一段是FOMO3D最核心的公式,也是最復雜的公式,剩余的就是流程邏輯,現在來結合流程把上面的函數組合進去。

首先這個合約需要部署,原合約有5個主合約太繁瑣,我用我重寫合並成的1個主合約TinyF3D來講,同樣適用於FOMO3D,只是不用在合約之間切換。

合約部署後,要開始運行,需要第一個調用的是activate(),這個裏面初始化5個地址,第1個是合約的管理者,後面4個是合約的資金流向賬戶,原FOMO3D通過一個1/N多重簽名合約來管理資金,這個模塊可以完全根據需要去除讓資金自己留向4個賬戶就可以了。activate()後面再設置開始局的開始時間和結束時間,局ID,最重要是把激活標誌設置為activated_ = true;

調用activate()之後,就可以調用一個叫registerNameXID的方法註冊一個遊戲ID,拿到遊戲ID之後,調用buyXid()購買keys,這裏就需要上面的公式了,我向buyXid()傳入我要購買的金額:0.1以太幣,

通過上面的公式:在獎池0的情況下f(0)返回1331個,也就是可以買1331個keys,

如果你再繼續買0.1以太幣,那麽相當於就是f(0.1)(上次花費的錢不可能全部進獎池,這裏只是方便)返回1328個,

也就是獎池x=0.1的時候,同樣0.1以太幣智能購買1328個keys,這就是FOMO3D這個遊戲越到後期購買keys越貴的原理,
技術分享圖片
也是這個遊戲最難理解的部分,如果這個理解了,其他基本上沒有上面難度,只是有些流程比較繞,所以我重寫了FOMO3D合約,去除了多重簽名,把playerbook合約的功能集成到了主合約,直接查看TinyF3D就能清楚整個DAPP的遊戲邏輯。

只要理解了上面就理解了整個核心邏輯,剩下的枝節我相信有開發經驗的都能明白。**

區塊鏈遊戲FOMO3D智能合約核心分析