作者 | John Baker
譯者 | Guoxi
話說颤介,區(qū)塊鏈行業(yè)對人才的缺口越來越大觅闽,但由于區(qū)塊鏈涉及的知識領(lǐng)域較為廣泛袜漩,能找到真正有用的人才對每個企業(yè)來說都非常不易。
另一方面度液,由于區(qū)塊鏈行業(yè)「待遇高」厕宗、「前途好」,很多人以次充好堕担,做了幾天開發(fā)就敢自成專家已慢。那么真正的區(qū)塊鏈人才究竟應(yīng)該具備哪些知識?
作為想要在區(qū)塊鏈領(lǐng)域發(fā)展的你霹购,又該如何通過區(qū)塊鏈企業(yè)的技術(shù)面試佑惠?俗話說知己知彼百戰(zhàn)不殆,了解了企業(yè)的面試套路齐疙,才能邁出區(qū)塊鏈的決勝的第一步膜楷。
本篇文章「套路滿滿」,營長將從各方了解到的企業(yè)常見的面試問題著手贞奋,從「區(qū)塊鏈」赌厅、「智能合約」、「Solidity」忆矛、「DApp」察蹲、「Web 3.0」请垛、「核心技術(shù)」、「函數(shù)」等幾個方面洽议,列出在面試技術(shù)崗位中最常問的問題宗收,并給出標(biāo)準(zhǔn)的技術(shù)解答。
是月薪八千亚兄,還是百萬年薪混稽,就看你能記住多少了,營長只能幫你到這了~
01 區(qū)塊鏈面試真經(jīng)
(1)以太坊常見問題
問:在以太坊中审胚,Wei和Ether(以太幣)有什么區(qū)別匈勋?
答:Wei是以太幣的最小面值,就好比說人民幣的最小面值是分膳叨,英鎊的最小面值是便士洽洁。 其換算關(guān)系為1以太幣 =10^18Wei。
問:以太坊的平均區(qū)塊間隔時間是多少菲嘴?
答:平均區(qū)塊間隔時間為14秒饿自,當(dāng)然了這只是理論值,你可以在Etherscan
(https://etherscan.io/chart/blocktime)
中查到每日的平均區(qū)塊時間間隔龄坪。
問:以太坊的平均區(qū)塊大小是多少昭雌?
答:區(qū)塊大小視情況而定,大約是2KB健田。不同于比特幣使用區(qū)塊大小來規(guī)定區(qū)塊的交易量上限烛卧,以太坊使用燃料(gas)限制。燃料限制決定了每個區(qū)塊中處理的交易量妓局、存儲/帶寬的上限总放,因?yàn)榻灰缀椭悄芎霞s中函數(shù)的執(zhí)行都要根據(jù)指令的復(fù)雜度多少來付出相應(yīng)的燃料,所以使用燃料限制來約束區(qū)塊大小是可行的好爬。
燃料限制會隨網(wǎng)絡(luò)的波動和礦工的意愿變化间聊,每個礦工都可以選擇自己愿意接受的燃料價格。燃料價格就像是比特幣中的交易費(fèi)抵拘,只是這里的價格是最小單位燃料的價格哎榴,而不是每筆交易的價格。
想要算出一個區(qū)塊中可以容納多少筆交易僵蛛,你不需要清楚地知道燃料的價格尚蝌,只需知道平均每筆交易使用多少燃料并用整個燃料限制除以它即可。
去年以太貓的發(fā)行造成了以太坊網(wǎng)絡(luò)的大擁堵充尉,整個網(wǎng)絡(luò)中充斥著大量未被處理的交易飘言。在這種情況下礦工有兩種選擇。他們可以投票提高燃料限制來處理更多交易驼侠,也可以開始提高自己的燃料價格標(biāo)準(zhǔn)并拒絕處理燃料費(fèi)用過低的交易姿鸿。
與比特幣一樣谆吴,即使燃料價格很低的交易也可能會被處理加入?yún)^(qū)塊鏈中,但礦工肯定會先處理完燃料價格高的交易再處理它苛预。如果你的交易并沒有那么緊急句狼,設(shè)置一個很低的燃料價格也不是不可以,就像我們現(xiàn)實(shí)生活中的“花時間來節(jié)省金錢”热某。
如果有惡意用戶持續(xù)地發(fā)起海量交易堵塞網(wǎng)絡(luò)腻菇,全網(wǎng)的交易成本就會越來越高,直到這個惡意用戶用完資金或者礦工賺足了交易費(fèi)并決定擴(kuò)大網(wǎng)絡(luò)容量昔馋。
問:以太幣是如何產(chǎn)生的筹吐?
答:2014年以太坊項(xiàng)目以眾籌的形式創(chuàng)建并預(yù)售了6000萬個以太幣,除此之外秘遏,礦工挖礦也會生成新的以太幣丘薛。
問:以太坊中的節(jié)點(diǎn)是什么?
答:從本質(zhì)上來說邦危,節(jié)點(diǎn)是一臺連接到區(qū)塊鏈榔袋、可以處理交易的計(jì)算機(jī)。
問:以太坊都有哪些網(wǎng)絡(luò)铡俐?
答:以太坊共有三種類型的網(wǎng)絡(luò):以太坊主鏈(就是我們平時用的以太坊)、以太坊測試網(wǎng)絡(luò)(如Ropsten和Rinkeby妥粟,供開發(fā)人員的學(xué)習(xí)和測試)和以太坊私有鏈(也叫以太坊私有網(wǎng)絡(luò)审丘,任何人都能用以太坊的代碼部署自己的私有鏈)。
問:與以太坊網(wǎng)絡(luò)交互都哪些方法勾给?
答:你可以使用電子錢包或DApp滩报。
問:你是否能在以太坊中“隱藏”一筆交易?
答:不能播急。以太坊區(qū)塊鏈中所有的交易都是公開可見的脓钾。
問:以太坊的交易記錄存放在哪里?
答:在公共可見的賬本中桩警,這個帳本通常被稱為區(qū)塊鏈可训。
問:以太坊主鏈已經(jīng)很強(qiáng)大了,為什么還要使用以太坊私有鏈捶枢?
答:原因有很多握截,主要是因?yàn)閿?shù)據(jù)涉及隱私,將數(shù)據(jù)庫去中心化烂叔,權(quán)限控制和測試谨胞。
問:如何查看一筆交易或一個區(qū)塊的詳細(xì)信息?
答:你可以使用區(qū)塊鏈瀏覽器蒜鸡,如etherscan.io或live.ether.camp胯努。
問:如何查看私有鏈中一筆交易或一個區(qū)塊的詳細(xì)信息牢裳?
答:一些開源的區(qū)塊鏈瀏覽器滿足這種需求,如etherparty推出的區(qū)塊鏈瀏覽器
(https://github.com/etherparty/explorer)叶沛。
問:區(qū)塊鏈的共識過程是什么蒲讯?
答:共識是按照特定的協(xié)議(如以太坊的協(xié)議)驗(yàn)證交易,將交易打包進(jìn)區(qū)塊并加入?yún)^(qū)塊鏈的過程恬汁。
問:以太坊挖礦操作的工作原理是什么呢伶椿?
答:從原理上說,以太坊中的挖礦操作幾乎與比特幣相同氓侧。
“套路”
簡單地說脊另,就是對于每個包含交易的區(qū)塊,礦工使用計(jì)算機(jī)反復(fù)且非吃枷铮快速地試驗(yàn)謎題的答案偎痛,直到有一個礦工猜對謎題。
更具體地說独郎,礦工將當(dāng)前區(qū)塊唯一的區(qū)塊頭元數(shù)據(jù)(包括時間戳和軟件版本)和一個隨機(jī)數(shù)(nonce value)作為哈希函數(shù)的輸入踩麦,函數(shù)將返回一個固定長度、看起來像是由數(shù)字和字母隨機(jī)組成的亂碼氓癌,叫做哈希值谓谦。哈希函數(shù)的特性是不同輸入對應(yīng)不同的哈希值,因此礦工僅需改變隨機(jī)數(shù)的值贪婉,就會得到一個完全不同的哈希值反粥。
如果算出來的哈希值小于當(dāng)前的目標(biāo)值(挖礦難度),則這個礦工就挖出了一個區(qū)塊疲迂,他會獲得一些以太幣獎勵才顿,然后通過向全網(wǎng)絡(luò)廣播該區(qū)塊,其他節(jié)點(diǎn)可以驗(yàn)證該區(qū)塊中的交易尤蒿,驗(yàn)證通過后將該區(qū)塊加入到本地區(qū)塊鏈的副本中郑气。也就是說,如果礦工B算出了一個哈希值腰池,礦工A將立刻停止當(dāng)前區(qū)塊的哈希值計(jì)算尾组,把B挖出的區(qū)塊加入?yún)^(qū)塊鏈中并開始新一輪的哈希值計(jì)算。
礦工們很難在這場算力競爭中作弊示弓。為了得到迷題的答案演怎,除了一個個試沒有更好的辦法,也沒有偽造這些計(jì)算工作的可能避乏,這就是該解謎方法被稱為“工作量證明”的原因爷耀。
從另一方面來說,用戶不需要來驗(yàn)證哈希值是否正確拍皮,因?yàn)槊總€節(jié)點(diǎn)都已驗(yàn)證過歹叮。
一般來說跑杭,每12到15秒就會有一個礦工挖出一個新區(qū)塊。如果礦工解謎的時間開始出現(xiàn)更快或更慢的傾向咆耿,算法會自動調(diào)整問題的難度德谅,以使礦工解謎的時間穩(wěn)定在14秒左右。
礦工有一定幾率能挖到新區(qū)塊賺取以太幣獎勵萨螺,他們的賺錢能力取決于運(yùn)氣和他們投入的計(jì)算能力窄做。
以太坊使用的工作量證明算法被稱為“ethash”,它被設(shè)計(jì)的需要更多內(nèi)存慰技,從而增大了使用昂貴的ASIC礦機(jī)挖礦的難度椭盏,因?yàn)锳SIC礦機(jī)的出現(xiàn)嚴(yán)重壓榨了使用其他設(shè)備礦工的收益,以至于在比特幣中唯一能盈利的挖礦形式就是使用這種定制化的芯片吻商。
從某種意義上來說掏颊,ethash可能已經(jīng)成功實(shí)現(xiàn)了這一目標(biāo),因?yàn)閷S玫腁SIC礦機(jī)不能用于挖掘以太坊(至少目前還沒有)艾帐。
此外乌叶,由于以太坊將要從工作量證明挖礦逐步過渡到權(quán)益證明挖礦,因而購買ASIC礦機(jī)可能不是一個明智的選擇柒爸,因?yàn)橐坏┮蕴晦D(zhuǎn)向權(quán)益證明它必將被淘汰准浴。
問:區(qū)塊鏈中最常用的兩種共識協(xié)議是什么?
答:工作量證明(PoW)和權(quán)益證明(PoS)捎稚,業(yè)界也在不斷涌現(xiàn)新的共識協(xié)議乐横,比如說活動證明(Proof-of-Activity,PoA)阳藻。
問:請簡述權(quán)益證明的工作原理。
答:權(quán)益證明就是根據(jù)持有貨幣的數(shù)量和時間隨機(jī)選擇區(qū)塊的創(chuàng)建者谈撒,它不是計(jì)算密集型的挖礦形式腥泥。
問:以太坊使用哪種共識協(xié)議呢?
答:截至2018年初啃匿,以太坊使用工作量證明建立共識蛔外,但在未來它將轉(zhuǎn)向權(quán)益證明。
活動證明在比特幣的工作量證明中引入了一種新形式的激勵結(jié)構(gòu)溯乒,這種混合結(jié)構(gòu)結(jié)合了工作量證明和權(quán)益證明夹厌。為避免系統(tǒng)出現(xiàn)惡性通貨膨脹,應(yīng)該停發(fā)新的加密貨幣裆悄,也就是說礦工的挖礦行為不再能拿到挖礦獎勵矛纹。
這樣系統(tǒng)中的加密貨幣數(shù)量就恒定了。在活動證明中光稼,礦工使用工作量證明產(chǎn)生區(qū)塊或南,加密貨幣的持有者通過權(quán)益證明簽署區(qū)塊孩等,交易費(fèi)將按比例分給礦工和簽署該塊的驗(yàn)證人。
問:簽署一筆交易需要用到什么工具采够?
答:用戶的私鑰肄方。
問:在私鑰丟失后,用戶是否還可以恢復(fù)以太坊帳戶蹬癌?
答:是的权她,用戶可以使用12字助記詞恢復(fù)。
問:用什么方法可以連接到以太坊節(jié)點(diǎn)逝薪?
答:IPC-RPC隅要,JSON-RPC和WS-RPC(RPC指Remote Procedure Call,遠(yuǎn)程過程調(diào)用)翼闽。
問:以太坊中異呈搬悖火爆的Geth是什么呢?
答:Geth是以太坊的一個命令行客戶端感局。
問:連接到Geth客戶端的默認(rèn)方式是什么尼啡?
答:默認(rèn)情況下使用IPC-RPC,禁用其他所有的RPC询微。
問:Geth客戶端中都有哪些API(Application Programming Interface崖瞭,應(yīng)用程序編程接口)?
答:Admin(管理員)撑毛、 eth(以太幣)书聚、web3、miner(礦工)藻雌、net(網(wǎng)絡(luò))雌续、personal(個人)、shh胯杭、debug(調(diào)試)和 txpool(工具)驯杜。
問:你可以使用哪些RPC通過網(wǎng)絡(luò)連接到Geth客戶端?
答:你可以使用JSON-RPC或WS-RPC通過網(wǎng)絡(luò)連接到Geth客戶端做个。 IPC-RPC只能用來連接本地部署的Geth客戶端鸽心。
問:如果你輸入命令“--rpc”,啟用的是哪一個RPC居暖?
答:JSON-RPC顽频。
問:****默認(rèn)情況下哪些RPC API是啟用的?
答:eth(以太幣)太闺、 web3和net(網(wǎng)絡(luò))糯景。
問:如何為JSON-RPC啟用admin api?
答:輸入命令“--rpcapi”。
問:命令“--datadir”有什么功能莺奸?
答:它指定了區(qū)塊鏈的存儲位置丑孩。
問:Geth的“快速”同步是什么,為什么它更快速呢灭贷?
答: “快速”同步僅下載收款交易所在的區(qū)塊温学,并拉取(pull)整個最近狀態(tài)數(shù)據(jù)庫甚疟,而不是像普通同步一樣仗岖,下載整個區(qū)塊鏈的數(shù)據(jù)并重放所有發(fā)生的交易。
問:命令“--testnet”有什么功能览妖?
答:它將客戶端連接到以太坊Ropsten測試網(wǎng)絡(luò)轧拄。
問:啟動Geth客戶端會在屏幕上打印大量的輸出信息,如果不想被這些繁雜信息干擾該怎么辦讽膏?
答:使用“--verbosity”命令調(diào)低輸出信息復(fù)雜度的值(默認(rèn)值為3)檩电。
問:如何使用IPC-RPC連接兩個Geth客戶端?
答:首先啟動一個Geth客戶端府树,復(fù)制其管道位置(pipe location)俐末,然后使用相同的數(shù)據(jù)文檔存儲目錄(datadir)啟動另一個Geth客戶端,并使用”--attach”命令傳遞復(fù)制的管道位置奄侠。
問:如何將自定義javascript文件加載到Geth控制臺卓箫?
答:輸入”--preload”命令和文件的路徑即可。
問:Geth客戶端中帳戶存儲在哪里垄潮?
答:存儲在密鑰庫(keystore)目錄中烹卒。
問:如何使用給定的賬戶發(fā)起一筆交易?
答:首先你要在“--unlock”命令中傳入帳戶地址或索引來解鎖賬戶弯洗。然后你需要使用“--password”命令指定一個此賬戶的密碼文件旅急。
問:我們剛才說到了有關(guān)索引的內(nèi)容。賬戶的索引取決于什么牡整?
答:取決于你添加帳戶的順序藐吮。
問:Geth客戶端是否能用來挖礦?
答:是的果正,輸入“--mine”命令即可炎码。
問:挖礦選項(xiàng)中的“etherbase”是什么盟迟?
答:這是接受挖礦獎勵的帳戶地址秋泳,該帳戶的索引為0。
(2)智能合約常見問題
問:ABI是什么攒菠?
答:簡單來說迫皱,“ABI”就是低級別的“API”。
ABI(Application Binary Interface)應(yīng)用程序二進(jìn)制接口,從本質(zhì)上講就是你調(diào)用智能合約中的函數(shù)并獲取它返回值的方式卓起。
ABI中定義了如何調(diào)用智能合約中的函數(shù)以及應(yīng)該選用哪種二進(jìn)制格式將信息從一個程序組件傳遞到下一個程序組件的詳細(xì)信息和敬。
以太坊智能合約以字節(jié)碼的形式部署在以太坊區(qū)塊鏈上,一個智能合約中可能會有多個函數(shù)戏阅。所以說昼弟,有了ABI你才可以指定調(diào)用智能合約中的哪個函數(shù),才能保證函數(shù)的返回值是你期望的格式奕筐。
這是一個來自以太坊ABI規(guī)范的例子:
contract Foo {function bar(real[2] xy) {}function baz(uint32 x, bool y) returns (bool r) { r = x > 32 || y; }function sam(bytes name, bool z, uint[] data) {}}
如果我們想使用參數(shù)“69”和“真”調(diào)用函數(shù)baz()舱痘,我們總共會傳遞68字節(jié)的數(shù)據(jù),整個過程可以分解為:
0xcdcd77c0:baz()函數(shù)的ID离赫。這是函數(shù)baz(uint32芭逝,bool)以ASCII形式編碼的Keccak-256哈希值的前4個字節(jié)。
0x0000000000000000000000000000000000000000000000000000000000000045:
傳入函數(shù)baz()的第一個參數(shù)渊胸,32位無符號整數(shù)69被填充為32個字節(jié)(10進(jìn)制中的69換算成16進(jìn)制為45)旬盯。
0x00000000000000000000000000000000000000000000000000000000000000000001:
傳入函數(shù)baz()的第二個參數(shù),布爾值真翎猛,也就是1胖翰,被填充為32個字節(jié)。
這68個字節(jié)會存放在交易的數(shù)據(jù)字段(data)办成,需要注意的是泡态,一定要仔細(xì)檢查交易數(shù)據(jù)字段中添加的內(nèi)容,因?yàn)樵趯⑵鋫鬟f給智能合約時可能會產(chǎn)生意外的迂卢,甚至可能是惡意的副作用某弦。)
為了避免出現(xiàn)生成函數(shù)ID時的常見錯誤,在此過程中必須使用規(guī)范的數(shù)據(jù)類型而克,就比如說使用標(biāo)準(zhǔn)的256位無符號整型(uint256)而不是無符號整型(uint)靶壮。
在Solidity中計(jì)算上述sam()函數(shù)ID的的代碼如下:
bytes4(sha3("sam(bytes,bool,uint256[])")
在這里可以使用諸如web3.js等高級程序庫來抽象大部分的細(xì)節(jié),不過提供給web3.js的JSON格式ABI是必不可少的员萍。
注意:******ABI是一個抽象腾降,它并不是以太坊核心協(xié)議的一部分。任何人都可以為自己的智能合約定義專屬的ABI,這些智能合約的任何調(diào)用者都必須遵守該ABI的規(guī)定才能得到有意義的調(diào)用結(jié)果康谆。但是盯滚,對于所有開發(fā)人員來說,使用Solidity奸晴,Serpent和web3.js更為簡單,這些也都符合ABI的規(guī)定日麸。
問:智能合約是什么寄啼?
答:從本質(zhì)上說,智能合約就是用多種語言編寫的計(jì)算機(jī)代碼。智能合約存在于區(qū)塊鏈網(wǎng)絡(luò)上墩划,它們按照自身嵌入的規(guī)則執(zhí)行相關(guān)操作涕刚,可以看做是參與者之間的契約。
問:智能合約可以用哪種語言編寫乙帮?
答:最常用的語言是Solidity杜漠,除此之外還有一些小眾的語言,比如說Serpent和類Lisp語言察净。
問:智能合約都有什么樣的使用場景呢碑幅?
答:舉一個簡單的商品買賣場景,買方在以太坊中部署一個智能合約并向其中存入資金塞绿,賣方看到存入的資金后發(fā)送商品沟涨,買方收到商品后通過智能合約支付貨款。這里的智能合約可以看作是一個保障淘寶交易的去中心化的支付寶异吻。
問:什么是MetaMask裹赴?
答:Metamask是一款插件類型的以太坊錢包,可以幫助用戶在瀏覽器中與以太坊網(wǎng)絡(luò)進(jìn)行交互诀浪。
問:Metamask使用什么節(jié)點(diǎn)棋返?
答:它使用infura.io。
問:相比于傳統(tǒng)以太坊錢包雷猪,有哪些功能是Metamask不支持的睛竣?
答:它不支持采礦和部署智能合約。
問:智能合約的執(zhí)行是免費(fèi)的嗎求摇?
答:不射沟,只能通過執(zhí)行交易來調(diào)用智能合約,而交易需要燃料費(fèi)用与境。
問:查看智能合約的狀態(tài)是免費(fèi)的嗎验夯?
答:是的,查詢狀態(tài)不需要執(zhí)行交易摔刁。
問:誰來執(zhí)行智能合約挥转?
答:礦工。
問:為什么調(diào)用智能合約中的函數(shù)需要花錢共屈?
答:除了一些不會改變智能合約狀態(tài)绑谣,除了返回值之外沒有其他邏輯的函數(shù)之外,調(diào)用智能合約中的函數(shù)都是需要花錢的拗引。
這筆花費(fèi)中借宵,除了向智能合約中轉(zhuǎn)入以太幣執(zhí)行調(diào)用之外,調(diào)用改變智能合約狀態(tài)的函數(shù)需要花費(fèi)燃料來執(zhí)行寺擂。
問:為什么以太坊中要引入燃料費(fèi)用呢暇务?
答:因?yàn)榈V工使用自己的計(jì)算機(jī)(礦機(jī))執(zhí)行智能合約代碼,礦工如果能收回購買機(jī)器的成本并獲得盈利才能保證整個系統(tǒng)生態(tài)的安全性怔软,所以以太坊設(shè)計(jì)使得礦工可以通過執(zhí)行調(diào)用者請求的代碼來賺取燃料費(fèi)用垦细,從而維持一個健康的生態(tài)。
問:燃料價格是否能決定交易被處理的時間挡逼?
答:是的括改,也不全是。一般來說家坎,你支付的燃料價格越高嘱能,交易越有可能被加入?yún)^(qū)塊鏈。盡管如此虱疏,燃料價格并不能保證交易更快地被處理惹骂。
問:交易中的燃料使用量取決于什么?
答:燃料使用量取決于存儲的用量做瞪,指令(操作碼)的類型和數(shù)量对粪。每一條以太坊虛擬機(jī)的操作碼都明確規(guī)定了所需燃料的數(shù)量。
問:交易費(fèi)該如何計(jì)算装蓬?
答:****交易費(fèi) = 使用的燃料數(shù)量 * 燃料價格(燃料價格由交易者指定)著拭。
問:如果執(zhí)行智能合約的花費(fèi)少于交易者支付的燃料費(fèi)用,他是否會獲得退款牍帚?
答:是的儡遮。
問:如果執(zhí)行智能合約的花費(fèi)超過了交易者支付的燃料費(fèi)用,這時會發(fā)生什么暗赶?
答:用戶不會獲得退款鄙币,并且一旦所有燃料耗盡執(zhí)行就會停止,智能合約的狀態(tài)就不會改變蹂随。
問:誰來支付調(diào)用智能合約的費(fèi)用爱榔?
答:調(diào)用智能合約的用戶。
問:節(jié)點(diǎn)在哪里運(yùn)行智能合約的代碼呢糙及?
答:節(jié)點(diǎn)在以太坊虛擬機(jī)(EVM)中運(yùn)行智能合約的代碼详幽。以太坊虛擬機(jī)規(guī)范是以太坊協(xié)議的一部分。以太坊虛擬機(jī)只是節(jié)點(diǎn)運(yùn)行的一個進(jìn)程浸锨。
問:以太坊虛擬機(jī)需要什么工具來運(yùn)行智能合約唇聘?
答:它需要智能合約的字節(jié)碼,它由高級別語言(如Solidity)編譯生成柱搜。
問:以太坊虛擬機(jī)都包含哪些部分迟郎?
答:內(nèi)存區(qū)域,堆棧和執(zhí)行引擎聪蘸。
問:Remix是什么宪肖?
答:Remix是一個用于開發(fā)表制,測試和部署智能合約的在線工具。它非常適合快速構(gòu)建和測試輕量級的智能合約控乾,但不適用于復(fù)雜的智能合約么介。
問:在Remix中,你可以連接哪些節(jié)點(diǎn)蜕衡?
答:你可以使用Metamask錢包連接到公共節(jié)點(diǎn)壤短,使用Geth錢包連接到本地節(jié)點(diǎn)以及使用Javascript虛擬機(jī)連接到內(nèi)存中模擬的節(jié)點(diǎn)。
問:什么是DApp慨仿,它與普通App有什么不同久脯?
答:應(yīng)用程序通常包含一個與某些中心化資源(由組織擁有)交互的客戶端,通常有一個與中心化數(shù)據(jù)層相連的中間層镰吆。如果中心化數(shù)據(jù)層中的數(shù)據(jù)丟失帘撰,則無法(輕松)恢復(fù)。
DApp表示去中心化的應(yīng)用程序万皿。DApp通過智能合約與區(qū)塊鏈網(wǎng)絡(luò)交互骡和,它們使用的數(shù)據(jù)駐留在智能合約的實(shí)例中,與中心化的數(shù)據(jù)相比相寇,去中心化的數(shù)據(jù)安全性更高慰于。
(3)Solidity常見問題
問:Solidity是靜態(tài)類型語言(類型的檢查是在運(yùn)行前做的,如編譯階段)還是動態(tài)類型語言(類型的檢查是在運(yùn)行時做的)唤衫?
答:Solidity是靜態(tài)類型語言婆赠,這意味著類型在編譯階段是已知的。
問:Solidity中的什么結(jié)構(gòu)與Java中的類(Class)相對應(yīng)佳励?
答:智能合約休里。
問:智能合約的實(shí)例是什么?
答:智能合約的實(shí)例就是在區(qū)塊鏈上部署的一個智能合約赃承。
問:Java和Solidity之間存在哪些差異妙黍。
答:相比于Java,Solidity支持多繼承(multiple inheritance)瞧剖,但不支持方法重載(Overloading)拭嫁。
問:在Solidity文件中需要指定的第一個參數(shù)是什么?
答:第一個參數(shù)是Solidity編譯器的版本抓于,需要指定為^ 0.4.8做粤。不要小看了這一步,因?yàn)樗梢员苊獬霈F(xiàn)在使用其他版本編譯器進(jìn)行編譯時引入的不兼容錯誤捉撮。
問:一個智能合約包含什么怕品?
答:智能合約主要由存儲變量,函數(shù)和事件組成巾遭。
問:智能合約中都有哪些類型的函數(shù)肉康?
答:有構(gòu)造函數(shù)(constructor)闯估,回退函數(shù)(fallback function),常量函數(shù)(constant functions)和修改智能合約狀態(tài)的函數(shù)吼和。
問:如果我將多個智能合約定義放入單個Solidity文件中涨薪,會出現(xiàn)什么樣的錯誤?
答:將多個智能合約定義放入單個Solidity文件中是完全可行的纹安。
問:兩個智能合約可以通過哪些方式進(jìn)行交互?
答:一個智能合約可以調(diào)用砂豌、創(chuàng)建和繼承另一個智能合約厢岂。
問:當(dāng)你嘗試部署具有多個智能合約的文件時會發(fā)生什么?
答:編譯器只會部署該文件中的最后一個智能合約阳距,也就是說塔粒,其他所有智能合約都被忽略了。
問:如果我有一個龐大的項(xiàng)目筐摘,我是否需要將所有相關(guān)的智能合約保存在一個文件中卒茬?
答:不需要,你可以使用import語句導(dǎo)入文件咖熟,如下所示:
import “./MyOtherContracts.sol”;
問:我是否只能導(dǎo)入本地文件圃酵?
答:不,你也可以使用HTTP導(dǎo)入文件(甚至是Github上的文件)馍管,如下所示:
import “http://github.com/<owner>/<repo>/<path to the file>”
問:以太坊虛擬機(jī)的內(nèi)存都有哪些部分郭赐?
答:存儲(Storage)、內(nèi)存(Memory)和Calldata确沸。
問:請解釋一下存儲(Storage)捌锭。
答:可以把存儲想象成一個數(shù)據(jù)庫。每個智能合約都管理自己的存儲變量罗捎,從而得到一個鍵值對數(shù)據(jù)庫(256位的鍵和值)观谦。存儲與普通數(shù)據(jù)庫的唯一區(qū)別就是,由于存在燃料費(fèi)用的問題它讀取和寫入操作的成本更高桨菜。
問:請解釋一下內(nèi)存(Memory)豁状。
答:內(nèi)存是一個臨時性的存儲。當(dāng)函數(shù)調(diào)用執(zhí)行完畢后倒得,內(nèi)存中的數(shù)據(jù)將會被釋放替蔬。你可以在內(nèi)存中分配各種復(fù)雜的數(shù)據(jù)類型,如數(shù)組和結(jié)構(gòu)體屎暇。
問:請解釋一下Calldata承桥。
答:Calldata可以理解為一個函數(shù)調(diào)用堆棧(Callstack)。它是臨時的根悼,不可修改的凶异,它存儲著以太坊虛擬機(jī)的執(zhí)行數(shù)據(jù)蜀撑。
問:存儲區(qū)和內(nèi)存區(qū)分別存儲了哪些變量?
答:狀態(tài)變量和局部變量(通常局部變量都是對狀態(tài)變量的引用)位于存儲區(qū)中剩彬,而函數(shù)的參數(shù)位于內(nèi)存區(qū)中酷麦。
問:閱讀以下代碼,請解釋代碼的哪一部分對應(yīng)哪個內(nèi)存區(qū)域:
contract MyContract {// part 1uint count;uint[] totalPoints;function localVars(){// part 2 uint[] localArr;// part 3 uint[] memory memoryArr;// part 4 uint[] pointer = totalPoints; }}
答:第1部分 - 存儲喉恋。
第2部分 - 存儲(數(shù)組大小指向計(jì)數(shù)器的位置)
第3部分 – 內(nèi)存沃饶。
第4部分 – 對存儲的引用。
問:我是否可以這樣定義一個函數(shù):
function doSomething(uint[] storage args) internal returns(uint[] storage data) {…}
答:是的轻黑,你可以強(qiáng)制函數(shù)的參數(shù)為存儲類型糊肤。在這種情況下,如果你沒有向函數(shù)中傳入存儲引用氓鄙,編譯器將會抱怨馆揉。
問:EVM調(diào)用和非EVM調(diào)用之間有什么區(qū)別呢?
答:
EVM調(diào)用是智能合約中的函數(shù)調(diào)用抖拦,它觸發(fā)函數(shù)執(zhí)行并需要燃料升酣。
非EVM調(diào)用讀取公開可見的數(shù)據(jù),不需要燃料态罪。
問:如何設(shè)定智能合約的以太幣余額限制噩茄,如果向有余額限制的智能合約中發(fā)送超額的以太幣會發(fā)生什么?
答:
pragma solidity ^0.4.19;contract yourContract{uint256 public balanceLimit = 999;function () payable{if (this.balance + msg.value > balanceLimit) {throw;//超額后會回滾复颈。 } }}
問:如何在智能合約帳戶中設(shè)置msg.val的值巢墅?
答:msg.val => msg.value =
隨消息發(fā)送的wei的個數(shù)。
(4)DApp和web3.0常見問題
問:DApp是什么券膀?
答:去中心化應(yīng)用程序(DApp)是在點(diǎn)對點(diǎn)網(wǎng)絡(luò)的計(jì)算機(jī)上而不是單臺計(jì)算機(jī)上運(yùn)行的應(yīng)用程序君纫。去中心化應(yīng)用程序自點(diǎn)對點(diǎn)網(wǎng)絡(luò)出現(xiàn)以來就已經(jīng)存在,它是一種旨在以不受任何實(shí)體控制的方式存在于Internet上的軟件工具芹彬。
去中心化應(yīng)用程序不一定需要在區(qū)塊鏈網(wǎng)絡(luò)上運(yùn)行蓄髓。 BitTorrent(去中心化下載軟件)、Popcorn Time(去中心化視頻軟件)舒帮、BitMessage(去中心化通信協(xié)議)会喝、Tor(洋蔥路由)都是在點(diǎn)對點(diǎn)網(wǎng)絡(luò)上運(yùn)行的傳統(tǒng)去中心化應(yīng)用程序,它們都沒有在區(qū)塊鏈上運(yùn)行(區(qū)塊鏈?zhǔn)且环N特殊的點(diǎn)對點(diǎn)網(wǎng)絡(luò))玩郊。
與簡單的智能合約相反肢执,在比特幣的經(jīng)典使用場景,即用戶A向用戶B匯款译红,去中心化應(yīng)用程序的參與者可以是市場中的任意一個人预茄。
問:DApp與智能合約有何不同?
答:去中心化應(yīng)用程序是一個基于區(qū)塊鏈的網(wǎng)站侦厚,其中智能合約允許它連接到區(qū)塊鏈中耻陕。說起來有點(diǎn)繞拙徽,為了更好地理解去中心化應(yīng)用程序和智能合約,讓我們先來了解傳統(tǒng)網(wǎng)站的工作方式诗宣。
傳統(tǒng)的Web(網(wǎng)絡(luò))應(yīng)用程序在前端使用HTML膘怕,CSS和Javascript來呈現(xiàn)頁面,在后端它需要利用API從數(shù)據(jù)庫中獲取一些詳細(xì)信息召庞,比如用戶的用戶名和頭像岛心。當(dāng)你進(jìn)入網(wǎng)頁版的新浪微博時,該頁面將調(diào)用API來獲取你的個人數(shù)據(jù)并將其顯示在頁面上篮灼。也就是說忘古,傳統(tǒng)網(wǎng)站的工作方式為:前端→API→數(shù)據(jù)庫。
去中心化應(yīng)用程序類似于傳統(tǒng)的Web應(yīng)用程序穿稳。它在前端使用完全相同的技術(shù)來呈現(xiàn)頁面存皂。一個關(guān)鍵的區(qū)別是晌坤,去中心化應(yīng)用程序不使用API來連接到數(shù)據(jù)庫逢艘,而是使用智能合約連接到區(qū)塊鏈。所以說骤菠,基于去中心化應(yīng)用程序的網(wǎng)站的工作方式為:前端→智能合約→區(qū)塊鏈它改。
在傳統(tǒng)的中心化應(yīng)用程序中,后端代碼在中心化的服務(wù)器上運(yùn)行商乎。而去中心化應(yīng)用程序與之相反央拖,它的后端代碼在去中心化的點(diǎn)對點(diǎn)網(wǎng)絡(luò)上運(yùn)行。去中心化應(yīng)用程序包括從后端到前端的整個軟件包鹉戚,智能合約只是去中心化應(yīng)用程序的一部分鲜戒。
也就是說,DApp包括:
前端(你能看到的頁面)抹凳,和
后端(應(yīng)用程序后臺的邏輯)遏餐。
另一方面,智能合約僅包含后端赢底,通常只是整個DApp的一小部分失都。這意味著如果你想在智能合約系統(tǒng)上創(chuàng)建去中心化的應(yīng)用程序,你必須與多個智能合約相結(jié)合并依賴第三方系統(tǒng)作為前端幸冻。
問:前端使用什么工具連接到后端的智能合約粹庞?
答:Web3 API程序庫。
問:請列幾個你所知道的DApp洽损。
答:Golem(單詞含義:傀儡)庞溜,Golem項(xiàng)目旨在創(chuàng)建業(yè)界首個閑置計(jì)算機(jī)算力的全球市場;Augur(單詞含義:預(yù)兆)碑定,Augur項(xiàng)目旨在將預(yù)測市場與去中心化網(wǎng)絡(luò)相結(jié)合强缘,創(chuàng)建一個預(yù)測工具督惰,以獲得潛在的收益;Aragon Network旅掂,它旨在充當(dāng)一個方便用戶的數(shù)字化管理組織赏胚。
問:你需要什么工具與DApp的智能合約進(jìn)行交互?
答:需要智能合約的ABI和字節(jié)碼商虐。
問:ABI的作用是什么觉阅?
答:ABI是智能合約公共接口的描述,DApp用這個公共接口來調(diào)用智能合約秘车。
問:字節(jié)碼的作用是什么典勇?
答:每個節(jié)點(diǎn)上的以太坊虛擬機(jī)都需要智能合約的字節(jié)碼來運(yùn)行智能合約。
問:為什么要使用大數(shù)運(yùn)算程序庫(BigNumber library)叮趴?
答:因?yàn)镴avascript無法正確處理大數(shù)字割笙。
問:為什么要始終檢查DApp代碼的開頭是否設(shè)置了web3提供程序(provider)?
答:因?yàn)槿绻贿@樣眯亦,Metamask會用自己的web3提供程序覆蓋掉它伤溉。
問:為什么使用web3 js的1.x版本而不是0.2x.x版本?
答:主要是因?yàn)?.x版本的異步調(diào)用使用promise對象(承諾將來會執(zhí)行妻率,比回調(diào)對象更合理和更強(qiáng)大)而不是回調(diào)對象乱顾,promise對象也是javascript中的首選。
問:在web3 1.x版本中如何列出所有帳戶宫静?
答:使用命令:“web3.eth.getAccounts”
問:“.call”和“.send”有什么區(qū)別走净?
答:“.send”發(fā)起交易并且產(chǎn)生費(fèi)用,而“.call”僅查詢智能合約的狀態(tài)不產(chǎn)生費(fèi)用孤里。
問:是否可以通過這樣的命令“.send({value:1})”發(fā)送一個以太幣伏伯?
答:不可以,實(shí)際上這樣你只送了1wei(1以太幣 =10^18Wei)捌袜。交易中的單位是wei说搅,而不是以太幣。
問:那是否意味著琢蛤,為了發(fā)送一個以太幣蜓堕,我需要將值設(shè)置為10^18?
答:不用博其,這樣太麻煩套才。你可以使用util方法,即:
web3.utils.toWei(1慕淡,'ether')背伴。
問:調(diào)用“.send()”時我需要指定什么?
答:你必須指定其中的發(fā)件人地址“from”。其他一切都是可選的傻寂。
問:將以太幣發(fā)送到特定地址的函數(shù)是否只有
web3.eth.sendTransaction()一個息尺?
答:不,你還可以調(diào)用智能合約中的函數(shù)疾掰。
問:以太坊的可擴(kuò)展性問題有什么解決方案搂誉?
答:解決可拓展性問題的思路是使用鏈下交易機(jī)制。具體的解決方案有狀態(tài)通道(state channels)和plasma静檬。
02
面試核心要點(diǎn)梳理
(1)Solidity文件的布局
源文件中可能包含任意數(shù)量的智能合約定義炭懊,包括指令和編譯指示(pragma directives)。
Pragma版本(Version Pragma)
Pragma版本用來聲明代碼應(yīng)該使用的Solidity編譯器版本拂檩。
version pragma ^0.4.00;
注意:有了這條指令侮腹,源文件不會使用早于版本0.4.0的編譯器進(jìn)行編譯,也不會使用晚于版本0.5.0的編譯器進(jìn)行編譯稻励。
導(dǎo)入其他源文件
以太坊的Solidity語言支持與JavaScript非常相似的導(dǎo)入語句(import)父阻,不過Solidity中沒有“默認(rèn)導(dǎo)出(default export)”的概念。
在全局級別望抽,你可以使用以下的導(dǎo)入語句:
import "filename";
上述代碼將“filename(你所指定的文件名)”中所有全局符號導(dǎo)入到當(dāng)前的全局范圍加矛。
import * as symbolName from "filename";
上述代碼創(chuàng)建了一個新的全局符號symbolName,其成員是“filename”中所有的全局符號糠聪。
注釋
和大多數(shù)編程語言一樣荒椭,Solidity也可以使用單行注釋和多行注釋谐鼎。
// 這是一個單行注釋舰蟆。/*這是一個多行注釋。*/
(2)以太坊存儲區(qū)域
在我們進(jìn)一步深入了解Solidity之前狸棍,你應(yīng)該知道以太坊有三個存儲區(qū)域身害。
存儲(Storage):所有智能合約狀態(tài)變量所在的位置。每個智能合約都有自己的存儲草戈,并且只有函數(shù)調(diào)用才能改變存儲中的狀態(tài)變量塌鸯。
內(nèi)存(Memory):用于保存外部調(diào)用的臨時數(shù)據(jù)并在調(diào)用結(jié)束之后釋放數(shù)據(jù),相比之下唐片,使用內(nèi)存中的數(shù)據(jù)價格更低丙猬。
堆棧(Stack):用于保存小的局部變量。堆棧幾乎是免費(fèi)使用的费韭,但只能保存有限數(shù)量的值茧球。
對于幾乎所有的類型,你都無法指定它們存儲的位置星持,因?yàn)槊看问褂脮r它們都會在這三種類型間互相復(fù)制抢埋。
在了解了以太坊Solidity中的存儲位置之后,我們來學(xué)習(xí)Solidity中的數(shù)據(jù)類型。
(3)Solidity中的數(shù)據(jù)類型
以下的數(shù)據(jù)類型通常也被稱為值類型揪垄,因?yàn)檫@些類型的數(shù)據(jù)始終按值傳遞穷吮。
![image](http://upload-images.jianshu.io/upload_images/1190574-64df0b6a533ffde1?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Solidity中的數(shù)據(jù)類型
布爾類型
關(guān)鍵詞:Bool
布爾類型可能的取值是固定的,即“真”或“假”饥努。
整型
關(guān)鍵字:int / uint(從uint8(8位無符號整型)到uint256(256位無符號整型)捡鱼,從int8(8位整型)到int256(256位整型))
整型就是各種大小的有符號或無符號整數(shù)。
我們可以按以下代碼來定義整型:
contract MySample{uint UnsignedInt =50;}
在上面的代碼中酷愧,我們創(chuàng)建了一個名為InsignedInt的無符號整型(uint)并將它的值設(shè)置為50堰汉。
地址類型
關(guān)鍵字:address
地址類型用于保存長度為20字節(jié)的值(以太坊地址的長度)。地址類型有其內(nèi)部的數(shù)據(jù)成員伟墙,是所有智能合約的基礎(chǔ)翘鸭。
地址的數(shù)據(jù)成員:余額(balance)與轉(zhuǎn)賬(transfer)
你可以使用余額屬性查詢某個地址中的余額,也可以使用轉(zhuǎn)賬函數(shù)將以太幣發(fā)送到某個地址戳葵,如下所示:
address x = 0x123;address myAddress = this;if (x.balance < 10 && myAddress.balance > = 10)x.transfer(10);
字符串類型
關(guān)鍵字:字符串中的文字通常用雙引號或單引號引出就乓,例如“foo”,“bar”拱烁。
字符串類型可以是任意長度的UTF數(shù)據(jù)生蚁,如下所示:
string language = "Solidity";
這些值類型可以在包含運(yùn)算符的表達(dá)式中相互交互。接下來戏自,我們就來說說各種運(yùn)算符邦投。
(4)運(yùn)算符
Solidity中的運(yùn)算符與JavaScript相同,有四種類型的運(yùn)算符:
![image](http://upload-images.jianshu.io/upload_images/1190574-c8e008ea5294cd2f?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Solidity中的運(yùn)算符
算術(shù)運(yùn)算符
與大多數(shù)編程語言類似擅笔,Solidity語言中包含一些非常簡單的數(shù)學(xué)運(yùn)算:
加法:x + y
減法:x - y
乘法:x * y
除法:x / y
求模/求余:x%y
如下所示志衣,Solidity中也支持指數(shù)運(yùn)算符:
uint x = 10 ** 3; // equal to 10^3 = 1000
增量運(yùn)算符
Solidity中的增量運(yùn)算符包括:a ++,a - 猛们,++ a念脯,-a,a + = 1弯淘,a = a + 1
Solidity中增量運(yùn)算符的運(yùn)算規(guī)則與其他編程語言類似绿店。
位運(yùn)算符
Solidity中的位運(yùn)算符包括:按位或“ | ”,按位異或“ ^ ”庐橙,按位取反“ ~ ”假勿,按位右移“ >> ”,按位左移“ << ”态鳖。
邏輯運(yùn)算符
Solidity中的邏輯運(yùn)算符包括:邏輯非“ 转培! ”,邏輯與“ && ”郁惜,邏輯或“ || ”堡距,相等“ == ”甲锡,不相等“ != ”羽戒。
用法請看以下示例:
contract operators {//算數(shù)運(yùn)算符// +,-,*,/, %, **// 增量運(yùn)算符// a++, a--, a+=1, a=a+1,++a,--a;a=10;a= a++; //在這里缤沦,輸出結(jié)果將為10, 因?yàn)椤癮++”運(yùn)算中先返回a的值再執(zhí)行自加。a=++a;//此時輸出的結(jié)果將為12易稠,因?yàn)椤?+a”運(yùn)算中先自加再返回a的值缸废。//邏輯運(yùn)算符!, &&, ||, ==, !=isOwner = true && false;var orValue= 0x02 | 0x01; // 這里的輸出應(yīng)該是 0x03//位運(yùn)算符~,>>, <<;function Operators() {// 在這里初始化狀態(tài)變量}}
在復(fù)雜的智能合約中僅僅使用這些數(shù)據(jù)類型不能滿足需求。為此驶社,Solidity還提供了數(shù)據(jù)結(jié)構(gòu)企量。
(5)Solidity中的數(shù)據(jù)結(jié)構(gòu)
Solidity提供三種類型的數(shù)據(jù)結(jié)構(gòu):
![image](http://upload-images.jianshu.io/upload_images/1190574-e1365bfefd924305?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
Solidity中的數(shù)據(jù)結(jié)構(gòu)
結(jié)構(gòu)體
Solidity提供了一種以結(jié)構(gòu)體定義新數(shù)據(jù)類型的方法。 結(jié)構(gòu)體是自定義類型亡电,其中可以包含多個變量届巩。我們可以按如下方式定義結(jié)構(gòu)體:
pragma solidity ^0.4.0;contract Ballot {struct Voter { // 結(jié)構(gòu)體uint weight1, weight2, weight3;bool voted;address delegate1, delegate2, delegate3, delegate4;string name;uint vote1, vote2, vote3, vote4, vote5;uint height1, height2, height3 } }
注意:結(jié)構(gòu)體類型中最多只能有16個成員,數(shù)量超標(biāo)后可能會發(fā)生“堆棧太深(Stack too Deep)”錯誤份乒。
結(jié)構(gòu)體類型可以用來創(chuàng)建功能更完善恕汇、更復(fù)雜的數(shù)據(jù)類型。
結(jié)構(gòu)體類型很強(qiáng)大或辖,但如果要處理多個相同種類的數(shù)據(jù)瘾英,比如說要存儲多個以太坊地址,該怎么辦呢颂暇?與大多數(shù)編程語言類似缺谴,Solidity中也支持?jǐn)?shù)組。
數(shù)組
Solidity中的數(shù)組可以是固定長度數(shù)組耳鸯,也可以是動態(tài)數(shù)組湿蛔。
uint[3] fixed; //這是一個長度為3的固定長度數(shù)組。uint[] dynamic; //這是一個動態(tài)數(shù)組片拍,長度隨元素的個數(shù)變化煌集。
如果數(shù)組中的元素為結(jié)構(gòu)體妓肢,那么我們可以得到一個結(jié)構(gòu)體數(shù)組捌省。如下所示,使用剛才創(chuàng)建的Voter結(jié)構(gòu)體創(chuàng)建一個結(jié)構(gòu)體數(shù)組:
Voter[] voting;
注意:將數(shù)組聲明為公開(public)將自動為其創(chuàng)建getter方法碉钠。
Voter[] public voting;
映射
映射可以看作是元素被虛擬初始化的哈希表纲缓,即每個鍵值對中的鍵被初始化,鍵映射的值用默認(rèn)值0代替喊废。
映射的聲明方式如下所示:
Mapping(_Keytype => _ValueType )
注意:“_Keytype”可以是除了動態(tài)數(shù)組祝高,智能合約,枚舉類型和結(jié)構(gòu)體類型之外的任何類型污筷。
請看以下示例:
contract MappingExample {mapping(address => uint) public balances;function update(uint newBalance) {balances[msg.sender] = newBalance; }}contract MappingUser {function f() returns (uint) {MappingExample m = new MappingExample();m.update(100);return m.balances(this);}}
(6)程序控制結(jié)構(gòu)
除了switch和goto之外工闺,Solidity支持JavaScript中的大多數(shù)程序控制結(jié)構(gòu),也就是說Solidity支持以下的程序控制結(jié)構(gòu):if,else陆蟆,while雷厂,do,for叠殷,break改鲫,continue,return林束,像棘? :,它們的用法與C語言和JavaScript中的用法相同壶冒。
注意:Solidity不能像C語言和JavaScript那樣將非布爾類型數(shù)據(jù)轉(zhuǎn)換成布爾類型數(shù)據(jù)缕题。
現(xiàn)在讓我們看看如何在Solidity中使用這些程序控制結(jié)構(gòu):
contract ControlStructure {address public a;function ControlStructure>){// if-else 可以這樣使用if(input1==2)a=1;elsea=0;// while 可以這樣使用while(input1>=0){if(input1==5)continue;input1=input1-1;a++;}// for循環(huán)可以這樣使用for(uint i=0;i<=50;i++) { a++; if(a==4) break; } //如果使用do while的話,代碼為 do { a--; } (while a>0);// 條件操作可以這樣使用bool IsTrue = (a == 1)?true: false;/*這將會報(bào)錯因?yàn)镾olidity不能將非布爾類型數(shù)據(jù)轉(zhuǎn)換成布爾類型數(shù)據(jù)*/if(1){}
將數(shù)據(jù)類型與程序控制結(jié)構(gòu)相結(jié)合就得到了程序的代碼胖腾。接下來讓我們談?wù)勚悄芎霞s中可執(zhí)行的代碼單元避除,也就是我們剛才提到的函數(shù)。
(7)函數(shù)
如何在Solidity中聲明一個函數(shù)呢胸嘁?請看以下示例:
function sampleFunc(string name, uint amount) {}
上面的代碼中聲明了一個空函數(shù)瓶摆,它有兩個參數(shù):一個是字符串和一個是無符號整型(uint)。
你可以通過以下命令調(diào)用這個函數(shù):
sampleFunc("Shashank", 10000);
除了函數(shù)之外性宏,Solidity中還提供函數(shù)修改器(Function Modifiers)群井。
(8)函數(shù)修改器
函數(shù)修改器可以輕易的修改一個函數(shù)的功能。只要提前在智能合約的函數(shù)定義中聲明毫胜,即使在執(zhí)行函數(shù)調(diào)用之前也可以進(jìn)行修改书斜。
如果你想要調(diào)用一個只有函數(shù)的所有者或創(chuàng)建者才能調(diào)用的銷毀智能合約函數(shù)killContract(),代碼如下所示:
contract FunctionModifiers{address public creator;function FunctionModifiers() {creator = msg.sender;}Modifier onlyCreator() {if(msg.sender!=creator){throw; }_; //在函數(shù)修改器修改完畢后恢復(fù)函數(shù)}function killContract() onlyCreator{ //不出意外的話酵使,修改后的函數(shù)可以正常調(diào)用荐吉。self-destruct(creator); }}
(9)繼承
Solidity可以通過復(fù)制包含多態(tài)(接口的不同實(shí)現(xiàn)方式)的代碼來支持多繼承(一個子類可以有多個父類,它繼承了多個父類的特性)。
contract Owned {address Owner ;function owned() {owner = msg.sender;}}contract Mortal is Owned { // 'is' 關(guān)鍵詞被用來繼承口渔。function kill(){self-destruct(owner); }}contract User is Owned, Mortal //多繼承{string public UserName;function User(string _name){UserName = _name;}}
原文鏈接:
https://medium.com/coinmonks/blockchain-interview-questions-the-collection-38de299ce44d
本文轉(zhuǎn)載自年薪百萬的技術(shù)面試都問啥样屠?來收下這份必考題葵花寶典吧|套路,感謝翻譯缺脉。