以太坊智能合約實戰 | 聽聽工程師怎麼說

以太坊智能合約實戰 | 聽聽工程師怎麼說

Linda
Linda

14 July 2022

Crypto

目標: 寫一份樂透(博弈)型智能合約。

本節重點:(For Solidity Smart Contract Developer) 智能合約上的每一條程式碼收取的 gas 費用通常不會一樣。 換句話說,執行智能合約時,使用者需要付 "gas"(交易手續費的概念)。

學習重點: 『if』與『else』需要付的 gas 費用就不一樣。

假設你有一個「真正的隨機數」(以 truelyRand 代表)來使用,而這個隨機數不會被任何的礦工或負責出塊的節點操控。 有個駭客知道『if』跟『else』收取的 gas 費用不一樣,他可以藉由精準控制gas limit去操縱這場遊戲!

換句話說,他會利用這個方式從你能賺錢的智能合約中的把錢全部贏走。 【重點】『if』的gas消耗量會比『else』還要多。

透過 estimated gas,可以得知執行這一條程式碼需要支付多少 gas 。“贏(Winning)”和“輸(Losing)”這兩個結果的程式碼都執行的話,需要付的交易手續費:62186只執行“贏(Winning)”這個結果的程式碼,需要付的交易手續費: 62176

來看一個不夠付 gas 的例子吧!附上完整版

只要你限制你的 gas limit 為 62176 而非 62186 ,則你就可以保證 100% 的勝利(贏錢)。


可能還似懂非懂?再來!

以這份樂透型智能合約來說,觀察智能合約的程式碼可以發現,第 13~16 行是 if - else 條件判斷,執行『if』比執行『else』還要貴。剛好這份智能合約的部署者將「輸」的結果放在 if 裡面,這時候玩家只要沒有足夠的錢(62186)可以付執行 if 裡面那條輸的程式碼,也就不會有「輸」的結果發生!換句話說,只要使用者(玩家)將自己錢包的錢維持在 62176(含)~62186(不含) 之間,就能保證 100% 勝利!


總結

為了執行智能合約,使用者需要付 gas 來執行程式碼。為了避免執行到無限迴圈(不斷付 gas 直到錢不夠…),使用者可以自行設定 gas limit 防止這樣的悲劇發生 。然而,這樣的功能(gas limit)也成為了某些使用者拿來「操縱賭局」的一種手法。Feel free to check this smart contract out on Etherscan.

© All rights reserved
ReneVerse