Solidity智能合约案例——投票存在的问题
通過(guò)對(duì)Solidity官方文檔的學(xué)習(xí),發(fā)現(xiàn)投票案例代碼有些不夠嚴(yán)謹(jǐn),簡(jiǎn)要做以下說(shuō)明。
1. 調(diào)用者問(wèn)題
在vote函數(shù)中,如果是一個(gè)沒(méi)有投票權(quán)的地址(假設(shè)A地址)調(diào)用了vote 函數(shù),代碼也能順利執(zhí)行。
首先,A地址雖然沒(méi)有被chairperson 賦予投票權(quán),但是代碼也能正常獲取Voter 對(duì)象sender ,只不過(guò)sender的所有屬性值是對(duì)應(yīng)類型的默認(rèn)值,函數(shù)可以繼續(xù)執(zhí)行。
表1 Voter對(duì)象屬性對(duì)應(yīng)的默認(rèn)值
| uint | weight | 0 |
| bool | voted | false |
| uint | vote | 0 |
| address | delegate | 0x0 |
接下來(lái),代碼將A 的voted設(shè)為true (sender.voted = true;),權(quán)重被累加到了對(duì)應(yīng)的提案票數(shù)上,我們會(huì)發(fā)現(xiàn),這對(duì)于投票結(jié)果并沒(méi)有什么影響(A 的weight 值為0),但是因?yàn)榇藭r(shí)A.voted = true ,當(dāng)主持人chairperson 試圖給A 賦予投票權(quán)時(shí)將無(wú)法正常執(zhí)行,這就導(dǎo)致A永久不能擁有投票權(quán),顯然這是不合適的。
2. 提案不存在
同樣在vote函數(shù)中,如果調(diào)用者輸入的參數(shù)proposal 并不存在(即proposal >= proposals.length),導(dǎo)致數(shù)組越界,雖然這不會(huì)給合約的安全性帶來(lái)問(wèn)題,但是會(huì)造成調(diào)用執(zhí)行失敗,顯然這不是我們希望看到的。
注意:
在delegate函數(shù)中也出現(xiàn)了上面兩個(gè)問(wèn)題,具體不再描述。
3. 提案票數(shù)相同
在獲取最高票數(shù)的提案編號(hào)winningProposal 和提案名稱winnerName 的方法中,如果出現(xiàn)兩個(gè)或者多個(gè)提案的票數(shù)最高且相同時(shí),只會(huì)返回編號(hào)靠前的提案編號(hào)。
代碼優(yōu)化請(qǐng)點(diǎn)這里查看
總結(jié)
以上是生活随笔為你收集整理的Solidity智能合约案例——投票存在的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Spring Security完成安全认
- 下一篇: 拷机软件 从软件测试中得知自己机器的性能