發表文章

目前顯示的是 1月, 2019的文章

Upgradable smart contract using zos

smart contract跟一般程式最大的差異,就是smart contract上了鏈就不能改了(這是區塊鏈的特性也是優點,但是如果真的有bug,麻煩就大了...)。所以今天要介紹的是,如何用 ZeppelinOS 來實作upgradeable smart contract,可升級的smart contract。 版本  - zos: 2.1.0  - Truffle: 5.0.1 OpenZeppelin 對smart contract的開發者一定不陌生,提供相當多smart contract的範例程式。Zeppelin部落格有介紹如何使用proxy contract實作可升級的contract,這是他們 proxy patterns的設計 ,之後有機會再深入介紹proxy pattern。本篇主要在介紹如何使用 zos 部署可升級的contract。(本篇需要有使用過truffle的經驗) Deploy contracts 環境部分,先安裝Node.js跟npm,跟Ganache(或Ganache-cli)。 Deploy your first project 有詳細地介紹如何使用zos部署。 先安裝ZeppelinOS npm install --global zos 再來建立專案 mkdir MyProject cd MyProject 初始化專案 npm init zos init MyProject npm install zos-lib 這個時候,資料夾內容就跟下過 truffle init 一樣,有 contracts , migrations 資料夾, truffle-config.js 等。以上環境就都建置完成了,再來就是寫contract了,這裡直接用官方的範例 pragma solidity ^ 0.4 .24; import "zos-lib/contracts/Initializable.sol" ; contract MyContract is Initializable { uint256 public x; string public s; function initialize(uint256

Ethereum RNG (RANDAO & VDF)

圖片
RNG 是 Random Number Generator ,也就是亂數產生器 在現實世界中要產生真正的隨機數,其實不容易,各個語言的library所提供的隨機數,都是偽隨機數,是可以預測的,不過在大部分的應用場域,都是可以應付的。區塊鏈的世界,面對的是全世界的人,怎麼產生不可預測的隨機數,就很重要,不然就可以被有心人所操作。例如Ethereum Beacon chain(POS chain)中的validator/attester(產塊跟驗證的角色),若是可以被預測,那大概就沒有人會相信這條鏈了。而這也是Ethereum Serenity(Eth-2.0),所遇到的問題之一。目前隨機數的產生,就由RANDOA + VDF所產生,以下就分別介紹 RANDAO RANDAO是利用經濟模式(獎勵跟處罰)的方式,促使在公共場域中能產生隨機變數 原理很簡單,想參加的人把拿錢來抵押,需要產生隨機數的人要付錢。所以參加者就可以從中分潤,當然不守規矩抵押的錢也就會被沒收,利用獎勵跟處罰的方式迫使大家都守規矩。詳細步驟如下: 首先,會有個收集seed的時間,例如6個block的時間。接著,想參與的人,投入某個數量的ETH到RANDAO這個smart contract(作質押),然後附上secret(某個只有你知道的值s,然後作sha3)。 等收集時間結束,就是驗證時間。此階段所有參與著需要把s傳入smart contract做驗證,smart contract會把s作sha3,去驗證是不是跟第一階段傳進來的一致。最終會把驗證過的s當作seed去產生隨機數。 最後,就是產生隨機數,然後把隨機數傳給之前有請求過的contract。然後歸還質押的ETH跟利潤分給參與者。 此外有幾個附加條件 第一階段若收集到數筆一樣的secret,只接受第一筆 第一階段會規定基本人數,若結束後未到達人數門檻,則此次的產生就失敗 若第二階段需提供s 若未提供,則質押的ETH會被沒收 若此階段有一個以上參與著未提供s,則此次產生失敗,並且把沒收的ETH分給有提供s的參與者。且退還請求者所支付的ETH。 VDF VDF  全名為 Verifiable delay functions ,從字面上有點難懂在幹嘛,從運作方面做