Transactions

為一個賬戶生成多個存款地址

  • November 5, 2021

我想創建一個類似於加密貨幣交易所的東西,我需要為每個使用者生成不同的唯一存款地址,這樣他們就可以將資金發送到他們的賬戶,同時我可以跟踪每個使用者存了多少。這在比特幣等其他加密貨幣中相當容易。但是,這在乙太坊中似乎是不可能的(或者我錯了)。

這裡的主要問題是,如果我生成多個私鑰,或者使用 HD 錢包並從中驅動多個私鑰,則發送到這些錢包的資金需要使用不同的密鑰簽名才能使用,因此我必須付費如果我嘗試將所有資金發送到一個大錢包進行維護,則需要支付巨額交易費(每個賬戶一次)。

所以我想知道我是否可以生成多個存款地址,都對應於乙太坊中的一個賬戶,這樣每個使用者都可以將資金發送到不同的地址,因此,我可以跟踪哪個使用者發送了多少,以及何時我想使用這些資金,我可以簽名使用一個私鑰進行交易並且只支付一次交易費用(將所有乙太幣一起花費)?如果一個賬戶對應多個存款地址是完全不可能的,那我該怎麼辦?


PS:我在這個 StackExchange 中看到了幾個類似這樣的問題,但沒有一個答案真正回答了我的問題。因此,請在將其標記為重複之前猶豫一下

PS2:我不是在尋找使用智能合約的解決方案,因為這需要我的使用者使用支持 web3 的特殊錢包(如 metamask)進行存款,我更想知道 Binance 等其他交易所如何處理這個問題,以便使用者可以存款從任何類型的錢包!!!!

您正在嘗試應用適合比特幣的模型,主要是由於其局限性。對於乙太坊來說,這將是一個忽略其優勢的尷尬策略。

比特幣:不是特別可程式,但很容易從多個賬戶中轉移資金。乙太坊:特別可程式,但不太容易從多個賬戶中清除資金。

乙太坊也有獨特的安全考慮,重要的是要確認您的客戶具有您的契約假定的所有功能,例如形成交易和簽署提款請求的能力。如果他們是從另一個交易所發送的,則情況並非如此,因此您需要阻止它。在任何情況下,您都可能需要註冊/KYC,因此請確認他們可以完全控制他們將使用的賬戶,然後通知契約他們已“獲准”匯款。

  1. 您可以使用一個存款賬戶 - 所有的錢都在一起,所以無需掃一掃。
  2. 您可以知道是誰發送了它並發出事件、記錄它等等——所有的會計要求。
  3. 它是可程式的——無論接下來發生什麼。

您應該確認您的使用者可以簽署交易。這將確保他們可以使用您將來向他們展示的**任何契約界面。

  1. 讓他們簽署一條消息並將其發送給您,鏈下(免費)。用 ecrecover 確認他們的地址。
  2. 現在你知道誰是誰了。不是從哪裡來的錢。從哪裡來。使用者沒有理由不能確認多個帳戶(第 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帳戶,您可以從那裡繼續。

希望能幫助到你。

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