Contract-Development
如何通過智能合約為推薦系統創建唯一的貢獻地址
我的智能合約遇到了一些麻煩。我希望能夠將推薦代幣分配給參與 ICO 推薦計劃的每個人。為了做到這一點,智能合約必須能夠區分所做的貢獻並將它們連結到某個參與者。我正在尋找一種方法讓智能合約為每個註冊 ICO 的參與者創建唯一的貢獻地址。這些地址將收到捐款並立即將其轉移到“主”合約地址,這樣即使他從多個錢包捐款,也可以分別了解每個捐款人所做的每筆捐款。我怎樣才能做到這一點?
根據OP中的評論:
在智能合約中,您不能將新地址分配給發件人。此外,在合約內部,您可以通過新的方式知道哪個地址屬於您。此外,這只是我的觀點,使用者從他們想要的地方發送乙太幣,通常只從一個帳戶發送。他們有責任從他們想要的地方發送,而不是我們的。
但是,即使您設法辨識使用者,我也會創建一個以 uint 作為鍵、以映射作為值的映射。這個其他映射將是使用者發送乙太的地址列表。這樣,您就可以辨識地址。
你必須有兩個契約:主要和接收者。主合約將具有創建接收者合約實例並在映射中註冊該實例以確保我們將僅從有效接收者接收付款的功能。
接收方合約將執行預設應付回退功能,將任何價值轉移到主合約。在發送 ETH 時,預設支付功能只能使用少量 gas,因此您可以要求您的使用者呼叫特殊功能進行付款。我稱之為PayTransfer。在 Remix 上測試的工作程式碼如下。要對其進行測試,您必須:
- 創建主合約
- 在主合約中呼叫 AddReceiver 函式。
- 新的接收方地址將顯示在 Event NewReceiver 和公共變數 lastReceiver 中。
- 然後,您必須向接收方契約付款。在混音中,您可以將 PaymentReceiver 契約附加到您在上一步中獲得的地址。使用地址按鈕。
- 付款完成後,您可以使用以下功能檢查您的主契約餘額、接收方餘額和接收方對主契約的貢獻值:
- 我的餘額
- 收款人餘額
- 接收者貢獻
如果預設的應付回退功能不起作用(適用於 Remix),您可以要求您的客戶呼叫 PayTransfer 功能進行付款或修改回退功能不將 msg.value 轉移到主契約並使用 RetrievePayment 功能將 ETH 轉移到您的主契約(在這種情況下,您必須支付 gas 費用)。
希望這可以幫助。
pragma solidity ^0.4.24; contract PaymentReceiver { Main public main; function () payable { main.ReceivePayment.value(msg.value)(); } function PayTransfer() public payable { main.ReceivePayment.value(msg.value)(); } function RetreivePayment() public { main.ReceivePayment.value(address(this).balance)(); } constructor() public { main = Main( msg.sender); } } contract Main { event NewReceiver(address receiver); event ReceivedPayment(address receiver, uint256 value); mapping(address => uint256) contributions; mapping (address=>bool) validReceiver; address public lastReceiver; function ReceivePayment() public payable { require (validReceiver[msg.sender]); contributions[msg.sender] = contributions[msg.sender] + msg.value; emit ReceivedPayment(msg.sender,msg.value); } function AddReceiver() public { PaymentReceiver receiver = new PaymentReceiver(); validReceiver[address(receiver)] = true; lastReceiver = address(receiver); emit NewReceiver(receiver); } function MyBalance() public view returns (uint) { return address(this).balance; } function ReceiverBalance(address receiver) public view returns (uint256) { require(validReceiver[receiver]); return address(receiver).balance; } function ReceiverContribution(address receiver) public view returns (uint256) { return contributions[address(receiver)]; } }