上一篇我們稍微修改了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)。
今天我們說明了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;
}
}
}