Wallets

合約地址和錢包地址的區別

  • January 6, 2021

免責聲明:這是一個相當長的問題。

據我了解,合約地址錢包地址是兩個截然不同的概念,唯一的共同點是它們都是以 160 位數字的十六進製表示形式給出的。

區別如下:

當一個合約被部署時,它被分配到一個唯一的地址,即鏈上的任何其他合約都不能被分配到那個地址上。

此外,假設合約包含總大小為 X 字節的狀態(全域)變數(包括 Solidity 編譯器添加的任何填充)。

下一次將合約部署到鏈上時,它必然會分配到前一個合約的地址 + X,或更高。

因此,每個合約都佔用“真實”記憶體。

另一方面,錢包地址是“扁平的”。

它不儲存任何數據,因此兩個錢包在技術上可以有兩個連續的地址。

因此,雖然合約的狀態變數是在合約地址“之後”分配的,但錢包持有的錢並沒有在錢包地址“之後”分配,實際上 - 根本沒有分配。

取而代之的是,錢包持有的錢被歸屬於一個或多個 ERC20 合約中的錢包地址。

例如,假設我有一個地址為 20 咖啡幣的錢包0x1234...

那麼就意味著鏈上部署了一些ERC20合約,儲存了這個資訊:

contract CoffeeCoin is ERC20Basic {
   mapping(address => uint256) balances;
   ...
}

而在那份契約中,balances[0x1234...] = 20.

上述差異的一個次要含義:

那裡的一些錢包地址可以等於那裡的一些合約地址。

我相信在區塊鏈的情況下,地址這個詞可能更適合與合約一起使用,而不是與錢包一起使用(同時將它用於兩者都會造成這種混亂)。

錢包地址實際上只不過是一個公鑰。

我在上述每一項聲明中都正確嗎?

我對合約地址錢包地址區別的理解正確嗎?

我很樂意得到任何建設性的意見。

謝謝你。

賬戶地址——外部擁有的賬戶(你稱之為錢包)或合約賬戶——與記憶體地址不同。不可能知道“合約地址 + X”處存在什麼,因為賬戶地址不是到連續塊記憶體的映射。

作為入門,請在此處查看大圖(字面意思):https ://ethereum.stackexchange.com/a/6413/52

地址充當區塊鏈狀態樹的密鑰。這個 trie 的葉子節點是帳戶資料結構。資料結構包含:

  • 一個隨機數
  • 平衡
  • 儲存根
  • 一個程式碼雜湊

在我看來,合約地址和錢包地址是兩個截然不同的概念,

這些地址只是為狀態樹提供了一個密鑰,所以它們的行為方式相同,應該被認為是相同的。

主要區別在於合約的賬戶資料結構包含一個codehash條目,這意味著可以執行一些可執行程式碼。對於外部擁有的帳戶,只有餘額和隨機數。

合約的儲存狀態——即它的變數狀態等——儲存在另一個 trie 中,該 trie 的根是在前面提到的 account 資料結構中找到的儲存根。這個 trie 是一個 key:value 映射,當你提到“合約的地址 + X”時,這可能就是你所想的。是的,當對合約的儲存進行更改時,此 trie 中需要更多記憶體。只是我們已經將組織層次結構進一步向下移動,遠離最初使用地址作為辨識帳戶的主要手段。這是兩個不同的地址空間。

那裡的一些錢包地址可以等於那裡的一些合約地址。

那不可能發生。鏈上的給定(賬戶)地址只能存在一個賬戶。(可能發生的情況是,許多私鑰可以映射到同一個地址,但這與您的要求正交。)

錢包地址實際上只不過是一個公鑰。

它派生自keccak256()公鑰雜湊的最後 20 個字節。

請參閱:乙太坊地址是如何生成的?

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