Faucets

測試網乙太池項目

  • January 2, 2022

這是我在乙太坊堆棧交換上的第一篇文章。在過去 6 年左右的時間裡,我一直是一名軟體工程師,最近開始朝著區塊鏈開發的方向前進。作為一名開發人員,我強烈認為最好的學習方式是動手做,所以我決定做一些 Solidity 項目。我真的更喜歡這些項目來幫助區塊鏈社區,因為我對 Web3.0 充滿熱情測試網 ETH 的數量,使得在測試項目時更難支付 gas 成本)。我將其作為 AWS 上的 S3 分發版上傳到此域https://testnet-ethpool.xyz/並且任何擁有多餘測試網 ETH(在任何測試網上)的人都可以捐贈其中的一部分(每個週期的提款限制為 1 ETH,一個週期應該是 1 週左右)

合約的 repo 在這裡

正如我之前提到的,我對區塊鏈開發世界非常陌生,並且可能仍然有許多源於我作為普通 Web 開發人員多年的壞習慣,所以我將非常高興獲得一些關於我可以做得更好的提示和指示. 如果這個合約在 gas 方面效率低下,或者如果它容易受到攻擊,我也將非常感激知道。

非常感謝您,並希望成為這個社區的一名富有成效的成員,祝您新年快樂!

我已經閱讀了你的契約,這裡有一些回饋:

  1. 創建地址數組並對其進行迭代被認為是 Solidity 中的反模式。這種方法是行不通的,因為這個地址數組會變得非常大,然後當你重置 epoch 時,不僅會消耗大量的 gas,而且還可能達到塊 gas 限制,然後函式總是會恢復,你將無法重置紀元。
  • 一個解決方案是代替 save address[] public addrList,將其設為雙精度數組,其中第一個索引是紀元 ID,第二個索引是地址(與現在相同)。然後,當您重置時代時,您將一個新的空插入address[] public addrList到雙數組中。並且始終將雙精度數組的最後一個元素視為目前的 addrList。通過這種方式,您可以有效地忽略先前的值,而無需對其進行迭代。
  • resetInterval另一個可能更好的解決方案是為每個地址保存它最後一次聲明的時間,然後當它再次嘗試聲明時,只有在時間過去時才讓它聲明。這樣你也不需要手動重置紀元。
  1. 當使用小於 uint256 的 uint 時,有時實際上可能會花費更多的氣體,因為 Solidity 必須將它們轉換為 uint256。您可以閱讀有關可變包裝的資訊。

祝你好運🙂

引用自:https://ethereum.stackexchange.com/questions/117812