iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
0
Blockchain

商管學生如何從零開始學習區塊鏈系列 第 17

DAY17 enum(列舉)和時間

  • 分享至 

  • xImage
  •  

上一篇我們稍微修改了Solidity的voting例子(https://solidity.readthedocs.io/en/v0.5.11/),今天我們要繼續改進它,首先,讓我簡單介紹我們等等會用到的函數,我們會使用到enum(列舉)當作我們狀態的判斷,我們將狀態分成Init(初始狀態)、Reg(註冊狀態)、Vote(投票狀態)和Done(完成狀態),並且使用時間的計算來改進我們的投票例子。

在我們原本的voting(投票)範例中,我們有一個主席跟一個投票的人,只有主席才能賦予投票人投票權,在主席跟投票人投完票後,你可以在winsProposal看到勝利的提案,但是你要怎麼知道現在是投票進行的哪個階段呢?因此我們今天要來介紹時間和狀態。

在區塊鏈中,時間的設定幫助所有參與者同步同一個通用時間,時間也用在我們的時間戳(Time stamp)上

我們叫這個智能合約votingstate,我們使用enum(列舉)將狀態分成Init(初始狀態)、Reg(註冊狀態)、Vote(投票狀態)和Done(完成狀態)。

contract votingstate {

    enum Stage {Init, Reg, Vote, Done}
    Stage public stage;
    uint startTime;
    uint public timeNow;

接著設定初始化階段和投票開始時間。

   constructor() public {
     stage = Stage.Init;
     startTime = now;
   }

我們根據時間在各個階段之間進行轉換,我將時間設置為十秒中,這代表十秒後就能換到下一個階段。

    function advanceState () public  {
        timeNow = now;
        if (timeNow > (startTime+ 10 seconds)) {
        startTime = timeNow;  
        if (stage == Stage.Init) {stage = Stage.Reg; return;}
        if (stage == Stage.Reg) {stage = Stage.Vote; return;}
        if (stage == Stage.Vote) {stage = Stage.Done; return;}
        return;
        }
    }

現在讓我們編譯和部署這個智能合約,你可以看到,每隔10秒當你點擊advanceState時,就會經歷一個階段進入下一個階段,一開始時間為零,階段為零,也就是在Init 階段,接著進入階段1(Reg),階段2(Vote),階段3(Done)。
https://ithelp.ithome.com.tw/upload/images/20190928/20120814Q849jhpjbt.jpg
今天我們說明了enum(列舉)和時間,下一篇我們會將它們加入我們投票的例子中,並介紹modifier函數來改進我們的投票例子,那我們明天見~

程式碼

pragma solidity >=0.4.22 <0.7.0;
contract voteState {

    enum Stage {Init, Reg, Vote, Done}
    Stage public stage;
    uint startTime;
    uint public timeNow;

     constructor()  public {
       stage = Stage.Init;
      startTime = now;
    }
    
    function advanceState () public  {
        timeNow = now;
        if (timeNow > (startTime+ 10 seconds)) {
        startTime = timeNow;  
        if (stage == Stage.Init) {stage = Stage.Reg; return;}
        if (stage == Stage.Reg) {stage = Stage.Vote; return;}
        if (stage == Stage.Vote) {stage = Stage.Done; return;}
        return;
        }
    }
}

上一篇
DAY16 Solidity的投票例子
下一篇
DAY18 甚麼是modifier函數?
系列文
商管學生如何從零開始學習區塊鏈30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言