天天看點

以太坊賬戶類型如何判斷web3實作

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

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

外部賬戶的位址是由公鑰決定的,合約賬戶的位址是在建立該合約時确定的。

合約賬戶存儲了代碼,外部賬戶則沒有,除了這點以外,這兩類賬戶對于EVM來說是一樣的。 每個賬戶有一個key-value形式的持久化存儲。其中key和value的長度都是256比特,名字叫做storage.

另外,每個賬戶都有一個以太币餘額(機關是“Wei"),該賬戶餘額可以通過向它發送帶有以太币的交易來改變。

web3實作

使用web3.eth.getCode()方法可以判斷一個給定的位址的賬戶是外部賬戶,還是合約賬戶。這個函數傳回指定位址的代碼,由于外部賬戶沒有代碼,是以僅僅會傳回

0x

,而合約賬戶将會傳回

0x

開頭的16進制代碼字元串。例如:

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

在solidity中實作

在合約内,可以使用EVM彙編代碼來擷取指定位址處的代碼大小,顯然,普通賬戶位址将傳回

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

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

  • 區塊鍊初學者   : 以太坊 DApp 實戰開發入門
  • 區塊鍊開發進階:去中心化以太坊 DApp 電商平台實戰開發

更多的内容可以通路部落格:

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

版權聲明:本文為CSDN部落客「weixin_33859231」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。

原文連結:https://blog.csdn.net/weixin_33859231/article/details/92415142