超過100道以太坊區塊鏈開發技術崗位的面試題,附參考答案。面試題目涵蓋以太坊的基本概念、Geth客戶端使用、智能合約基本概念、Solidity開發語言、去中心化 應用DApp、web3.js開發庫等方面。javascript
問:以太坊的有價通證叫什麼?
答:以太(ETH:Ether)前端
問:Wei和以太有什麼區別?
答:Wei是一個面額,像美分到美圓或便士到磅。 1 ETH =10^18 Weijava
問:以太坊的平均出塊時間是多少?
答:大約14秒git
問:以太坊的平均塊大小是多少?
答:大約2KB,實際值取決於具體狀況。github
問:以太坊是否支持腳本? 若是是這樣,支持什麼類型的腳本?
答:是的。 它支持智能合約web
問:你如何獲得以太?
答:有幾種方法: 1.成爲一名礦工
2.用其餘貨幣換取
3.使用以太Faucet,例如 https://faucet.metamask.io
4.接受別人的贈送面試
問:以太從哪裏來的?
答:在2014年預售中首次建立了6000萬個。另外,在挖出新塊時也會生成以太。數據庫
問:什麼是節點?
答:一個節點本質上是一臺鏈接到網絡的計算機,它負責處理交易。後端
問:你熟悉多少種以太坊網絡?
答:有三種類型的網絡 - 實時網絡(主),測試網絡(如Ropsten和Rinkeby)和私有網絡。api
問:與以太坊網絡交互的方式有哪些?
答:可使用電子錢包或DApp
問:你能夠「隱藏」一個以太坊交易嗎?
答:不能夠。全部交易對每一個人都是可見的。
問:交易記錄在哪裏?
答:在公共帳本上。
問:這些網絡的ID是什麼?
答:Live(id = 1),Ropsten(id = 3),Rinkeby(id = 4),Private(由開發人員分配)
問:我能夠在Rinkeby測試網絡中挖一些以太,而後轉移到Live網絡嗎?
答:不能夠。不能在不一樣的以太坊網絡之間傳遞以太。
問:爲何須要私有網絡?
答:有不少緣由,但主要是爲了數據隱私、分佈式數據庫、權限控制和測試。
問:你如何輕鬆查看有關交易和區塊的詳細信息?
答:使用區塊鏈瀏覽器,如etherscan.io或live.ether.camp
問:私有網絡的交易和區塊信息怎麼查看呢?
答:可使用開源瀏覽器客戶端,例如https://github.com/etherparty/explorer
問:區塊鏈的共識是什麼?
答:遵循特定協議(如以太坊)驗證交易(建立塊)的過程。
問:區塊鏈中兩種經常使用的共識模型是什麼?
答:工做量證實(POW)和權益證實(POS)。
問:簡單地解釋下工做量證實。
答:它其實是礦工爲了證實本身的工做量並驗證交易而對一個計算密集型問題的求解。
問:以簡單的方式解釋權益證實。
答:區塊的建立者是根據節點所持有的財富和股權隨機選擇的。 它不是計算密集型的。
問:以太坊使用什麼共識模式?
答:截至2018年初,它使用工做量證實,但從此將切換到權益證實。
問:怎麼挖以太幣?
答:使用錢包或geth客戶端。
問:用什麼來對交易進行簽名?
答:用戶的私鑰。
問:丟失私鑰後還能恢復以太坊帳戶嗎?
答:能夠,可使用助記詞組。
問:有哪些方法能夠鏈接到一個以太坊節點?
答:IPC-RPC、JSON-RPC和WS-RPC。
問:那麼Geth是什麼?
答:Geth是以太坊的客戶端。
問:鏈接到geth客戶端的默認方式是什麼?
答:默認狀況下啓用IPC-RPC,其餘RPC都被禁用。
問:你知道geth的哪些API?
答:Admin、eth、web三、miner、net、personal、shh、debug和txpool。
問:你可使用哪些RPC經過網絡鏈接到geth客戶端?
答:可使用JSON-RPC和WS-RPC經過網絡鏈接到geth客戶端。 IPC-RPC只能鏈接到同一臺機器上的geth客戶端。
問:若是啓動geth時使用了-rpc選項,哪些RPC會被啓用?
答:JSON-RPC。
問:哪些RPC API是默認啓用的?
答:eth、web3和net。
問:如何爲JSON RPC啓用Admin API?
答:使用-rpcapi選項。
問:選項-datadir有什麼做用?
答:它指定了區塊鏈的存儲位置。
問:什麼是geth的「快速」同步,爲何它更快?
答:快速同步會將事務處理回執與區塊一塊兒下載並完整提取最新的狀態數據庫,而不是從新執行全部發生過的交易。
問:選項--testnet是作什麼的?
答:它將客戶端鏈接到Ropsten網絡。
問:啓動geth客戶端會在屏幕上輸出大量文字,應該如何減小輸出信息?
答:能夠將--verbosity設置爲較低的數字(默認值爲3)
問:如何使用IPC-RPC將一個geth客戶端鏈接到另外一個客戶端?
答:首先啓動一個geth客戶端,複製它的管道位置,而後使用同一個datadir啓動另外一個geth客戶端並使用--attach 選項傳入管道位置。
問:如何將自定義javascript文件加載到geth控制檯中?
答:通使用--preload選項傳入js文件的路徑。
問:geth客戶端的賬戶存儲在哪裏?
答:在keystore目錄中。
問:爲了進行交易,須要對帳戶進行什麼操做?
答:必須先解鎖該帳戶 - 能夠傳入帳戶地址或帳戶序號來解鎖。 也可使用--password選項傳入一個密碼文件, 其中包含每一個帳戶的密碼。
問:你提到了一些有關帳戶序號的內容。 什麼因素決定帳戶的序號?
答:添加賬戶的前後順序。
問:是否可使用geth進行挖礦?
答:能夠,使用--mine選項開啓。
問:什麼是「etherbase」?
答:這是接收挖礦獎勵的賬戶,它是序號爲0的賬戶。
問:什麼是智能合約?
答:這是用多種語言編寫的計算機代碼。 智能合約存在於以太坊網絡上,它們根據預約規則執行動做,規則是由 參與者在這些合約中商定的。
問:智能合約可使用哪些語言編寫?
答:Solidity,這是最經常使用的語言,也可使用Serpent和LLL。
問:你能舉出一個智能合約的用例嗎?
答:賣方-買方應用場景:買方在智能合約中存入款項,賣方看到存款併發送貨物,買方收到貨物並 放行付款。
問:什麼是Metamask?
答:Metamask是一個能夠幫助用戶在瀏覽器中與以太坊網絡進行交互的工具
問:Metamask使用哪一個以太坊節點?
答:它使用infura.io
問:Metamask不支持什麼?
答:挖礦和合約部署。
問:執行合約是否免費?
答:不,調用合約方法是一個交易,所以須要支付費用。
問:訪問智能合約的狀態是否免費?
答:是的,查詢狀態不是交易。
問:誰執行合同?
答:礦工。
問:爲何調用智能合約的方法須要付費?
答:有些方法不會修改合約的狀態,也沒有其餘邏輯,只是返回一個值,這樣的方法是能夠免費調用的。 調用那些改變合約狀態的方法則須要付費,由於它們須要gas來執行。
問:爲何須要gas?
答:因爲礦工在他們的機器上執行合約代碼,他們須要gas來覆蓋執行合約代碼的成本。
問:是否是gas的價格決定了交易何時被處理?
答:便是,也不是。 gas價格越高,交易成功的可能性就越大。 儘管如此,gas價格並不能保證更快的交易處理。
問:交易中的gas使用量取決於什麼?
答:這取決於合約所用的存儲量、指令(操做碼)的類型和數量。 每一個EVM操做碼都對應一個固定的gas用量。
問:交易費是如何計算的?
答:gas用量*gas價格(由調用方指定gas價格)
問:若是智能合約的執行成本低於調用方指定的gas用量,用戶是否獲得退款?
答:是的
問:若是智能合約的執行成本高於指定的gas用量,會發生什麼狀況?
答:用戶不會獲得退款,而且一旦全部的gas用完,執行就會中止,合約也不會改變。
問:誰支付智能合約的調用費用?
答:調用合約的用戶。
問:節點在什麼上面運行智能合約代碼?
答:EVM - 以太坊虛擬機。 EVM遵循EVM規範,該規範是以太坊協議的組成部分。 EVM只是節點上的一個進程。
問:爲了運行智能合同,EVM須要什麼?
答:它須要合約的字節碼,是經過編譯Solidity等更高級別的語言編寫的合約來生成字節碼。
問:粗略的說,EVM有哪些組成部分?
答:內存區域、堆棧和執行引擎。
問:什麼是Remix?
答:開發,測試和部署合約的在線工具。 適合快速構建和測試輕量級合約,但不適合更復雜的合約。
問:在Remix中,能夠鏈接哪些節點?
答:可使用Metamask鏈接到公共節點、也能夠連接到使用Geth搭建的本地節點,或者在Javascript VM中模擬的內存節點。
問:什麼是DApp,它與App有什麼不一樣?有什麼不一樣?
答:App一般包含一個客戶端,這個客戶端會與一些中心化的資源(由一個組織擁有)進行通訊, 一般客戶端經過一箇中間層鏈接到中心化的數據層,若是中心化的數據層中的信息丟失,不能很輕鬆地恢復。 DApp表示去中心化應用程序。 DApps經過智能合約與區塊鏈網絡進行交互。 DApp使用的數據駐留在合約實例中。 中心化數據可能比去中心化數據更容易受到破壞。
問:DApp的前端是否侷限於某些技術或框架?
答:不受限制。可使用任何技術來開發DApp的前端,好比HTML,CSS,JS,Java,Python...
問:前端用什麼庫鏈接後端(智能合同)?
答:Web3.js庫。
問:在DApp的前端須要哪些東西才能與指定的智能合約進行交互?
答:合約的ABI和字節碼。
問:ABI有什麼做用?
答:ABI是合約的公開接口描述對象,被DApps用於調用合約的接口。
問:字節碼有什麼做用?
答:節點上的EVM只能執行合約的字節碼。
問:爲何要使用BigNumber庫?
答:由於Javascript不能正確處理大數。
問:爲何須要檢查在Web DApp代碼的開始部分是否設置了web3提供器(Provider)?
答:由於Metamask會注入一個web3對象,它覆蓋其餘的web3設置。
問:爲何要使用web3.js版本1.x而不是0.2x.x?
答:主要是由於1.x的異步調用使用Promise而不是回調,Promise目前在javascript世界中 是處理異步調用的首選方案。
問:如何在web3 1.x中列出帳戶?
答:web3.eth.getAccounts
問:.call和.send有什麼區別?
答:.send發送交易並支付費用,而.call查詢合約狀態。
問:這樣發送1個以太對嗎:.send({value:1})
?
A:不對,這樣發送的是1 wei。 交易中老是以wei爲單位。
問:那麼爲了發送1個以太,我必須將這個值乘以10^18?
答:可使用web3.utils.toWei(1,'ether')
。
問:調用.send()
時須要指定什麼?
答:必須指定from
字段,即發送帳戶地址。 其餘一切都是可選的。
問:web3.eth.sendTransaction()
的惟一功能是將以太發送到特定的地址,這個說法是否正確?
答:不對,也能夠用它調用合約方法。
問:你是否知道以太坊的可擴展性解決方案?
答:2層協議。可能的解決方案是狀態通道(state channels
)和Plasma。
問:Solidity是靜態類型的仍是動態類型的語言?
答:它是靜態類型語言,這意味着類型在編譯時是已知的。
問:Solidity中與Java「Class」相似的是什麼?
答:合約。
問:什麼是合約實例?
答:合約實例是區塊鏈上已部署的合約。
問:請說出Java和Solidity之間的一些區別。
答:Solidity支持多重繼承,但不支持重載。
問:你必須在Solidity文件中指定的第一件事是什麼?
答:Solidity編譯器的版本,好比指定爲^ 0.4.8。 這是必要的,由於這樣能夠防止在使用其餘版本的編譯器時引入不兼容性錯誤。
問:合約中包含什麼?
答:主要由存儲變量、函數和事件組成。
問:合約中有哪些類型的函數?
答:有構造函數、fallback函數、修改合約狀態的函數和只讀的constant函數。
問:若是我將多個合約定義放入單個Solidity文件中,我會獲得什麼錯誤?
答:將多個合約定義放入單個Solidity文件是徹底正確的。
問:兩個合約之間交互的方式有哪些?
答:一個合約能夠調用另外一個合約,也能夠繼承其餘合約。
問:當你嘗試使用部署一個包含多個合約的文件時會發生什麼?
答:編譯器只會部署該文件中的最後一個合約,而忽略全部其餘合約。
問:若是我有一個大項目,我須要將全部相關的合約保存到一個文件中嗎?
答:不須要。可使用import語句導入其餘合約文件,例如import "./MyOtherContracts.sol";
。
問:我只能導入本地合約文件嗎?
答:還可使用HTTP協議導入其餘合約文件,例如從Github導入:import "http://github.com/owner/repo/path_to_file";
。
問:EVM的內存分紅了哪些部分?
答:它分爲Storage、Memory和Calldata。
問:請解釋一下Storage。
答:能夠把它想象成一個數據庫。 每一個合約管理本身的Storage變量。 它是一個鍵-值數據庫(256位鍵值)。 就每次執行使用的gas而言,在Storage上讀取和寫入的成本更高。
問:請解釋一下Memory。
答:這是一個臨時存儲區。 一旦執行結束,數據就會丟失。 能夠在Memory上分配像數組和結構這樣複雜的數據類型。
問:請解釋一下Calldata 。
答:能夠把calldata視爲一個調用堆棧。 它是臨時的、不可修改的,用來存儲EVM的執行數據。
問:哪些變量存儲在Storage,那些變量存儲在Memory?
答:狀態變量和局部變量(它們是對狀態變量的引用)存儲在Storage區域, 函數參數位於Memory區域。
問:看看下面的代碼,並解釋代碼的哪一部分對應於哪一個內存區域:
contract MyContract { // part 1 uint count; uint[] totalPoints; function localVars(){ // part 2 uint[] localArr; // part 3 uint[] memory memoryArr; // part 4 uint[] pointer = totalPoints; } }
答: 第1部分 - Storage
第2部分 - Storage
第3部分 - Memory
第4部分 - Storage
問:這樣作對嗎:
function doSomething(uint[] storage args) internal returns(uint[] storage data) {…}
答:能夠,能夠強制將函數的參數設置爲Storage存儲。 在這種狀況下,若是沒有傳遞存儲引用,編譯器 會報錯。