簡體   English   中英

用戶帳戶如何擁有 ERC20 令牌

[英]How does a User account own an ERC20 Token

這個問題有點概念性,所以希望這張圖片能幫助消除我的誤解。 在此處輸入圖像描述

圖片在地址 0x2 上部署了一個眾籌智能合約。 地址為 0x01 的用戶購買了代幣。 這是我對發生的事情的理解:

  1. 眾籌合同(@地址:0x2)接受來自用戶賬戶(@地址:0x1)的以太幣
  2. 眾籌合約將 0x1 存儲為已購買代幣(重要:此信息存儲在智能合約@address 0x2 中)

現在我的問題是:如果 0x1 是用戶帳戶(而不是智能合約),則地址 0x1 處沒有代碼。 我以為一個用戶帳戶只包含一個地址 + 與該地址相關聯的以太幣,它怎么還可以存儲 0x1 擁有 ERC20 令牌的事實呢? 例如,我可以登錄到 MetaMask 並且(在單擊“添加令牌”選項之前)MetaMask 可以看到我有一個令牌……這怎么可能?

每個 ERC20 合約都具有以下功能:
function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; }

您的錢包只需使用您的地址從已知的代幣合約中調用此函數。 因為它是一個視圖函數,所以它不消耗任何 gas。

我發現大多數 ERC20 代幣會很快添加到 Metamask 或 MEW 等錢包中。 但是如果你的余額沒有自動顯示,你可以手動添加合約地址(至少在 MEW 中,不確定 Metamask),它會在之后顯示。

在 Solidity 中,有兩種方法可以獲取發送交易的人的地址

  • tx.origin
  • msg.sender

在您的示例中,在ERC20 Token.sol內的方法中,值tx.origin將為0x1 ,而msg.sender將為0x2

因此,要回答您的問題,ERC20 代幣如何知道0x2是:這取決於代幣合約的編寫方式以及它使用的是tx.origin還是msg.sender 我想它會使用msg.sender ,因為這是更普遍的一種。

如果它確實使用msg.sender ,您仍然可以通過首先購買代幣然后立即將代幣從眾籌合同轉移給調用者來使眾籌合同生效。

有關詳細信息,請參閱“msg.sender”和“tx.origin”之間有什么區別?

它如何存儲 0x1 擁有 ERC20 令牌這一事實?

代幣轉移,或一般會計中的轉移,都保存在賬本中。 在這種情況下,分類賬是 ERC-20 智能合約,它在內部保持余額誰擁有以及balances映射中的內容。 或者,智能合約管理保存所有權記錄的存儲(EVM SSTORE指令)。

請注意,其他一些區塊鏈,如 Telos 和 EOS(以及 mayne Solana)可能是相反的,並且存儲在用戶帳戶上維護(用戶帳戶具有關聯的 RAM 和用戶擁有的任何令牌的表)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM