Solidity
您將如何在 gas 使用契約中優化此迭代?
我們是兩個年輕的開發者,他們開始探索這個神奇的世界。作為一個初始項目,我們想在乙太坊上製作一個有趣但真實的項目。
該項目的靈感來自 DecentraLand (LAND),非常簡單:
我們有一個 1000x1000 的區域(代表一張地圖),我們想讓使用者認領這張地圖的任意一塊,傳達一個起始 XY和一個結束 XY座標。
這將生成一個唯一的令牌 (ERC-271) 來代表地圖的這個區域。
我們的主要問題是檢查一個區域是否已經被認領的算法。
越多的使用者將獲得一張地圖,我們就越需要迭代才能知道新訂單是否應該失敗,從而將汽油費提高到屋頂。
智能合約將如下所示:
- 取包含開始和結束座標的新訂單
- 在檢查是否有重疊的同時,對之前購買的每個區域進行迭代
- 還原或確認交易
當您必須檢查許多先前聲稱的區域時,這將變得非常昂貴。
有什麼建議嗎?十分感謝!
我將儲存一個靜態 1000x1000 大小的布爾值的二維數組。每當有人保留一定大小的土地時,該算法會將每個 1x1 點標記為保留。如果其中任何一個已被保留(布爾值:true),它將恢復。
這包括迭代,你必須弄清楚交易是否會因為這種迭代而超過 gas 限制,但至少迭代是有限的,並且最大迭代量是已知的。
如果您正在尋找可以支持更大集合的非顯而易見的解決方案,您可以使用反事實方法。
買方因他的座標索賠而將資金置於風險之中,並且契約包含一份歷史索賠清單。賞金功能允許任何人抓住買方的股份並撤銷他們的索賠,如果他們可以證明聲稱區域內的 1 個像素先前被其他人聲稱。
賞金獵人將提供用於評估證明的確切記錄,這意味著合約不需要迭代。它只需要確認有爭議的像素位於已辨識的先前歷史記錄中聲稱的左上角和右下角之間。
function claimBounty(bytes32 claimId, bytes32 previousClaimId, uint pixelX, uint pixelY) external ... { // Is pixelX/pixelY inside both rectangles? // slashes claimId, revokes claimsId, sends money }
更一般地,將過程重新定義為經濟問題而不是機械問題。
希望能幫助到你。