為一個賬戶生成多個存款地址
我想創建一個類似於加密貨幣交易所的東西,我需要為每個使用者生成不同的唯一存款地址,這樣他們就可以將資金發送到他們的賬戶,同時我可以跟踪每個使用者存了多少。這在比特幣等其他加密貨幣中相當容易。但是,這在乙太坊中似乎是不可能的(或者我錯了)。
這裡的主要問題是,如果我生成多個私鑰,或者使用 HD 錢包並從中驅動多個私鑰,則發送到這些錢包的資金需要使用不同的密鑰簽名才能使用,因此我必須付費如果我嘗試將所有資金發送到一個大錢包進行維護,則需要支付巨額交易費(每個賬戶一次)。
所以我想知道我是否可以生成多個存款地址,都對應於乙太坊中的一個賬戶,這樣每個使用者都可以將資金發送到不同的地址,因此,我可以跟踪哪個使用者發送了多少,以及何時我想使用這些資金,我可以簽名使用一個私鑰進行交易並且只支付一次交易費用(將所有乙太幣一起花費)?如果一個賬戶對應多個存款地址是完全不可能的,那我該怎麼辦?
PS:我在這個 StackExchange 中看到了幾個類似這樣的問題,但沒有一個答案真正回答了我的問題。因此,請在將其標記為重複之前猶豫一下
PS2:我不是在尋找使用智能合約的解決方案,因為這需要我的使用者使用支持 web3 的特殊錢包(如 metamask)進行存款,我更想知道 Binance 等其他交易所如何處理這個問題,以便使用者可以存款從任何類型的錢包!!!!
您正在嘗試應用適合比特幣的模型,主要是由於其局限性。對於乙太坊來說,這將是一個忽略其優勢的尷尬策略。
比特幣:不是特別可程式,但很容易從多個賬戶中轉移資金。乙太坊:特別可程式,但不太容易從多個賬戶中清除資金。
乙太坊也有獨特的安全考慮,重要的是要確認您的客戶具有您的契約假定的所有功能,例如形成交易和簽署提款請求的能力。如果他們是從另一個交易所發送的,則情況並非如此,因此您需要阻止它。在任何情況下,您都可能需要註冊/KYC,因此請確認他們可以完全控制他們將使用的賬戶,然後通知契約他們已“獲准”匯款。
- 您可以使用一個存款賬戶 - 所有的錢都在一起,所以無需掃一掃。
- 您可以知道是誰發送了它並發出事件、記錄它等等——所有的會計要求。
- 它是可程式的——無論接下來發生什麼。
您應該確認您的使用者可以簽署交易。這將確保他們可以使用您將來向他們展示的**任何契約界面。
- 讓他們簽署一條消息並將其發送給您,鏈下(免費)。用 ecrecover 確認他們的地址。
- 現在你知道誰是誰了。不是從哪裡來的錢。從哪裡來。使用者沒有理由不能確認多個帳戶(第 1 步),但接受來自未知發件人的資金是不明智的。
為簡潔起見,我將跳過提款功能,因為您可能會在收到資金後立即將資金轉移到運營賬戶,並且您可能有一個完全不同的契約,您可以在其中發送要提取的資金 - 或基於網路發送給使用者網站互動。
這不是作為準備就緒的生產契約提出的,而更像是一個簡單的例子來展示這種方法。
pragma solidity 0.5.16; contract Deposit { address payable public wallet; mapping(address => bool) public approved; event LogApproved(address approver, address approved); event LogDeposit(address sender, uint amount); function authorize(address allowed) public { require(msg.sender == wallet, "Only the owner can do this, e.g. from their admin server."); emit LogApproved(msg.sender, allowed); approved[allowed] = true; } function deposit() public payable { require(approved[msg.sender], "Unauthorized sender. Please register."); emit LogDeposit(msg.sender, msg.value); // <=== there's your accounting wallet.transfer(msg.value); } }
會計關注點在區塊鏈上永垂不朽,並且可由外部客戶端(例如 nodejs)檢查。錢進入您的
wallet
帳戶,您可以從那裡繼續。希望能幫助到你。