以太坊帳戶類型如何判斷

以太坊中有兩類帳戶,它們共用同一個地址空間。web

  • 外部帳戶,該類帳戶被公鑰-私鑰對控制(人類)。
  • 合約帳戶,該類帳戶被存儲在帳戶中的代碼控制。

外部帳戶的地址是由公鑰決定的,合約帳戶的地址是在建立該合約時肯定的。函數

合約帳戶存儲了代碼,外部帳戶則沒有,除了這點之外,這兩類帳戶對於EVM來講是同樣的。 每一個帳戶有一個key-value形式的持久化存儲。其中key和value的長度都是256比特,名字叫作storage.區塊鏈

另外,每一個帳戶都有一個以太幣餘額(單位是「Wei"),該帳戶餘額能夠經過向它發送帶有以太幣的交易來改變。ui

web3實現

使用web3.eth.getCode()方法能夠判斷一個給定的地址的帳戶是外部帳戶,仍是合約帳戶。這個函數返回指定地址的代碼,因爲外部帳戶沒有代碼,所以僅僅會返回0x,而合約帳戶將會返回0x開頭的16進制代碼字符串。例如:spa

var code = web3.eth.getCode("0xd5677cf67b5aa051bb40496e68ad359eb97cfbf8")
if(code === '0x') console.log('外部帳戶')
else console.log('合約帳戶')

 

在solidity中實現

在合約內,能夠使用EVM彙編代碼來獲取指定地址處的代碼大小,顯然,普通帳戶地址將返回0.net

contract EzDemo {
    function isContract(address addr) returns (bool) {
    uint size;
    assembly { size := extcodesize(addr) }
    return size > 0;
  }
}

 

推薦兩個以太坊相關的實戰教程:3d

更多的內容能夠訪問博客:code

http://blog.hubwiz.com/2018/02/12/how-to-check-ethereum-address/blog

相關文章
相關標籤/搜索