合約地址和錢包地址的區別
免責聲明:這是一個相當長的問題。
據我了解,合約地址和錢包地址是兩個截然不同的概念,唯一的共同點是它們都是以 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 個字節。請參閱:乙太坊地址是如何生成的?