Proof-of-Work
0往返時間的無狀態工作量證明系統
我正在設計一個 API。為了避免濫用,我需要以某種方式對請求進行速率限制,但我不想為每個使用者這樣做,因為自動創建新帳戶非常容易。我認為工作量證明算法可以很好地完成這項工作,但我想我會問專家,即這個社區。
這些是我想要的屬性:
- 無狀態,但可以提前設置狀態,例如創建使用者帳戶。兩個後續請求可能會在彼此共享狀態之前到達不同的伺服器。
- 最好是零往返時間,即使用者在實際執行之前不必詢問伺服器它應該做什麼。這基本上意味著請求是無狀態的。
- 請求應該能夠並行執行,即使對於同一個使用者也是如此。
- 可調難度。
我可以想到一些滿足上述某些特性的系統,但不是全部。
- 散列
userid + (request id) + nonce
直到散列的前綴有 n 位零。Request id
是客戶選擇的一些唯一編號。具有屬性 2、3、4,因為我們必須跟踪已經使用了哪些請求 ID。否則,相同的工作量證明可用於多個請求。- 散列
userid + (request-id) + nonce
直到散列的前綴有 n 位零。在每個請求之前從伺服器獲取請求 ID。具有屬性 3、4 和可選的 1,如果有某種方法可以驗證請求 ID 是由我們的一台伺服器生成的,而無需接觸數據庫。由於我們必須向伺服器請求一個 request-id,我們需要一個額外的往返時間。是否有提供我列出的所有屬性的工作證明系統?
是否需要防止重播相同的請求?如果沒有,使用請求正文的部分逆散列似乎微不足道。
如果您擔心重放相同的請求,一種可能性可能是將工作量證明隨機數用於您的負載平衡算法。例如,使用最低有效 3 位在 8 個伺服器之間進行分配。長期平均值應該在工作人員之間公平分配,但重播的請求將始終最終發送給同一個工作人員。因此,您可以在本地檢查重複項,而無需訪問全域狀態。
是的。這是…
散列
prefixfree(server id) + prefixfree(userid) + prefixfree(request-id) + nonce
直到雜湊的前綴有 n 位零。
有關更多資訊
prefixfree
,請查看相關的 Wikipedia 文章。