2018-05-21

Ethereum smart contract / ERC20 補遺

大概就是工作的需要 ... 此處單純解釋

首先 ... 如果全世界有個程式只能寫一次,之後無法再修改,只能發佈新的程式時,會引發怎樣的災難和困擾? ... 單純這邊列下買保險的做法

A.所有 transaction 都必須確認 eip658Transition 上的 status (使用 eth_getTransactionReceipt => status 確認 0x1(完成) or 0x0(失敗) [下簡寫為 status])做為是否有完成 contract 的首要條件,否則沒有任何地方可供判斷,因為 transaction 入 chain 後就不會刪除,不同於 bitcoin 會刪除或是隱藏有問題的交易,且即使使用了 EVM 也無法追蹤實際運作細項(類似誰多了錢誰少了錢),多重交易時無法判斷哪個 transaction 是否完成,因此只能使用 status 來做判斷(案例 ... 對手商 ...)

B.不管如何上 SafeMath 就對了,不用判斷大小,而是直接上 SafeMath 後直接運算,簡單來說實際運作的 contract code 內不應該有比較運算(大於小於之類的運算),而是直接用 SafeMath 中的類似 .add / .sub / .div 之類的運算 function 做包裹,而比較運算只能在 SafeMath 中出現,因為當出事時,SafeMath 內直接會 require(false) 而直接噴走,並自動把 status 改成 0x0(案例 ... BatchOverFlow ...)

C.contract code 內的 return false 並不會把 status 改成 0x0,事實上只有 require(false) 或是 gas 不夠之類的才會改,其餘全部都是 0x1,所以請勿使用 return false (舊的寫法是 throw,新的寫法是 require(false),status 真實代表只是程式是否有"正確完成"而已,但並不代表交易是有效的,因此把交易是否有效反向綁定在程式是否由正確完成上,即可互相觀察)

大概是這些,有想到再繼續補下去 ......

沒有留言:

張貼留言