年薪百萬的技術面試都問啥?來收下這份必考題葵花寶典吧|套路
隨著各大企業紛紛佈局區塊鏈,各行業對區塊鏈人才求賢若渴,區塊鏈從業者的待遇也是水漲船高。
動輒百萬的年薪+通證激勵,不知你是否已經蠢蠢欲動。不過區塊鏈涉及的領域既多且雜,在面試中你不僅需要有牢固的知識儲備,還需要一本“面試葵花寶典”以防萬一。
話不多說,上乾貨。
作者 | John Baker
譯者 | Guoxi
話說,區塊鏈行業對人才的缺口越來越大,但由於區塊鏈涉及的知識領域較為廣泛,能找到真正有用的人才對每個企業來說都非常不易。
另一方面,由於區塊鏈行業「待遇高」、「前途好」,很多人以次充好,做了幾天開發就敢自成專家。那麼真正的區塊鏈人才究竟應該具備哪些知識?
作為想要在區塊鏈領域發展的你,又該如何通過區塊鏈企業的技術面試?俗話說知己知彼百戰不殆,瞭解了企業的面試套路,才能邁出區塊鏈的決勝的第一步。
本篇文章「套路滿滿」,營長將從各方瞭解到的企業常見的面試問題著手,從「區塊鏈」、「智慧合約」、「Solidity」、「DApp」、「Web 3.0」、「核心技術」、「函式」等幾個方面,列出在面試技術崗位中最常問的問題,並給出標準的技術解答。
是月薪八千,還是百萬年薪,就看你能記住多少了,營長只能幫你到這了~
01
區塊鏈面試真經
(1)以太坊常見問題
問:在以太坊中,Wei和Ether(以太幣)有什麼區別?
答:Wei是以太幣的最小面值,就好比說人民幣的最小面值是分,英鎊的最小面值是便士。 其換算關係為1以太幣 =10^18Wei。
問:以太坊的平均區塊間隔時間是多少?
答:平均區塊間隔時間為14秒,當然了這只是理論值,你可以在Etherscan
(https://etherscan.io/chart/blocktime)
中查到每日的平均區塊時間間隔。
問:以太坊的平均區塊大小是多少?
答:區塊大小視情況而定,大約是2KB。不同於比特幣使用區塊大小來規定區塊的交易量上限,以太坊使用燃料(gas)限制。燃料限制決定了每個區塊中處理的交易量、儲存/頻寬的上限,因為交易和智慧合約中函式的執行都要根據指令的複雜度多少來付出相應的燃料,所以使用燃料限制來約束區塊大小是可行的。
燃料限制會隨網路的波動和礦工的意願變化,每個礦工都可以選擇自己願意接受的燃料價格。燃料價格就像是比特幣中的交易費,只是這裡的價格是最小單位燃料的價格,而不是每筆交易的價格。
想要算出一個區塊中可以容納多少筆交易,你不需要清楚地知道燃料的價格,只需知道平均每筆交易使用多少燃料並用整個燃料限制除以它即可。
去年以太貓的發行造成了以太坊網路的大擁堵,整個網路中充斥著大量未被處理的交易。在這種情況下礦工有兩種選擇。他們可以投票提高燃料限制來處理更多交易,也可以開始提高自己的燃料價格標準並拒絕處理燃料費用過低的交易。
與比特幣一樣,即使燃料價格很低的交易也可能會被處理加入區塊鏈中,但礦工肯定會先處理完燃料價格高的交易再處理它。如果你的交易並沒有那麼緊急,設定一個很低的燃料價格也不是不可以,就像我們現實生活中的“花時間來節省金錢”。
如果有惡意使用者持續地發起海量交易堵塞網路,全網的交易成本就會越來越高,直到這個惡意使用者用完資金或者礦工賺足了交易費並決定擴大網路容量。
問:以太幣是如何產生的?
答:2014年以太坊專案以眾籌的形式建立並預售了6000萬個以太幣,除此之外,礦工挖礦也會生成新的以太幣。
問:以太坊中的節點是什麼?
答:從本質上來說,節點是一臺連線到區塊鏈、可以處理交易的計算機。
問:以太坊都有哪些網路?
答:以太坊共有三種類型的網路:以太坊主鏈(就是我們平時用的以太坊)、以太坊測試網路(如Ropsten和Rinkeby,供開發人員的學習和測試)和以太坊私有鏈(也叫以太坊私有網路,任何人都能用以太坊的程式碼部署自己的私有鏈)。
問:與以太坊網路互動都哪些方法?
答:你可以使用電子錢包或DApp。
問:你是否能在以太坊中“隱藏”一筆交易?
答:不能。以太坊區塊鏈中所有的交易都是公開可見的。
問:以太坊的交易記錄存放在哪裡?
答:在公共可見的賬本中,這個帳本通常被稱為區塊鏈。
問:以太坊主鏈已經很強大了,為什麼還要使用以太坊私有鏈?
答:原因有很多,主要是因為資料涉及隱私,將資料庫去中心化,許可權控制和測試。
問:如何檢視一筆交易或一個區塊的詳細資訊?
答:你可以使用區塊鏈瀏覽器,如etherscan.io或live.ether.camp。
問:如何檢視私有鏈中一筆交易或一個區塊的詳細資訊?
答:一些開源的區塊鏈瀏覽器滿足這種需求,如etherparty推出的區塊鏈瀏覽器
(https://github.com/etherparty/explorer)。
問:區塊鏈的共識過程是什麼?
答:共識是按照特定的協議(如以太坊的協議)驗證交易,將交易打包進區塊並加入區塊鏈的過程。
問:以太坊挖礦操作的工作原理是什麼呢?
答:從原理上說,以太坊中的挖礦操作幾乎與比特幣相同。
“套路”
簡單地說,就是對於每個包含交易的區塊,礦工使用計算機反覆且非常快速地試驗謎題的答案,直到有一個礦工猜對謎題。
更具體地說,礦工將當前區塊唯一的區塊頭元資料(包括時間戳和軟體版本)和一個隨機數(nonce value)作為雜湊函式的輸入,函式將返回一個固定長度、看起來像是由數字和字母隨機組成的亂碼,叫做雜湊值。雜湊函式的特性是不同輸入對應不同的雜湊值,因此礦工僅需改變隨機數的值,就會得到一個完全不同的雜湊值。
如果算出來的雜湊值小於當前的目標值(挖礦難度),則這個礦工就挖出了一個區塊,他會獲得一些以太幣獎勵,然後通過向全網路廣播該區塊,其他節點可以驗證該區塊中的交易,驗證通過後將該區塊加入到本地區塊鏈的副本中。也就是說,如果礦工B算出了一個雜湊值,礦工A將立刻停止當前區塊的雜湊值計算,把B挖出的區塊加入區塊鏈中並開始新一輪的雜湊值計算。
礦工們很難在這場算力競爭中作弊。為了得到迷題的答案,除了一個個試沒有更好的辦法,也沒有偽造這些計算工作的可能,這就是該解謎方法被稱為“工作量證明”的原因。
從另一方面來說,使用者不需要來驗證雜湊值是否正確,因為每個節點都已驗證過。
一般來說,每12到15秒就會有一個礦工挖出一個新區塊。如果礦工解謎的時間開始出現更快或更慢的傾向,演算法會自動調整問題的難度,以使礦工解謎的時間穩定在14秒左右。
礦工有一定機率能挖到新區塊賺取以太幣獎勵,他們的賺錢能力取決於運氣和他們投入的計算能力。
以太坊使用的工作量證明演算法被稱為“ethash”,它被設計的需要更多記憶體,從而增大了使用昂貴的ASIC礦機挖礦的難度,因為ASIC礦機的出現嚴重壓榨了使用其他裝置礦工的收益,以至於在比特幣中唯一能盈利的挖礦形式就是使用這種定製化的晶片。
從某種意義上來說,ethash可能已經成功實現了這一目標,因為專用的ASIC礦機不能用於挖掘以太坊(至少目前還沒有)。
此外,由於以太坊將要從工作量證明挖礦逐步過渡到權益證明挖礦,因而購買ASIC礦機可能不是一個明智的選擇,因為一旦以太坊轉向權益證明它必將被淘汰。
問:區塊鏈中最常用的兩種共識協議是什麼?
答:工作量證明(PoW)和權益證明(PoS),業界也在不斷湧現新的共識協議,比如說活動證明(Proof-of-Activity,PoA)。
問:請簡述權益證明的工作原理。
答:權益證明就是根據持有貨幣的數量和時間隨機選擇區塊的建立者,它不是計算密集型的挖礦形式。
問:以太坊使用哪種共識協議呢?
答:截至2018年初,以太坊使用工作量證明建立共識,但在未來它將轉向權益證明。
活動證明在比特幣的工作量證明中引入了一種新形式的激勵結構,這種混合結構結合了工作量證明和權益證明。為避免系統出現惡性通貨膨脹,應該停發新的加密貨幣,也就是說礦工的挖礦行為不再能拿到挖礦獎勵。
這樣系統中的加密貨幣數量就恆定了。在活動證明中,礦工使用工作量證明產生區塊,加密貨幣的持有者通過權益證明簽署區塊,交易費將按比例分給礦工和簽署該塊的驗證人。
問:簽署一筆交易需要用到什麼工具?
答:使用者的私鑰。
問:在私鑰丟失後,使用者是否還可以恢復以太坊帳戶?
答:是的,使用者可以使用12字助記詞恢復。
問:用什麼方法可以連線到以太坊節點?
答:IPC-RPC,JSON-RPC和WS-RPC(RPC指Remote Procedure Call,遠端過程呼叫)。
問:以太坊中異常火爆的Geth是什麼呢?
答:Geth是以太坊的一個命令列客戶端。
問:連線到Geth客戶端的預設方式是什麼?
答:預設情況下使用IPC-RPC,禁用其他所有的RPC。
問:Geth客戶端中都有哪些API(Application Programming Interface,應用程式程式設計介面)?
答:Admin(管理員)、 eth(以太幣)、web3、miner(礦工)、net(網路)、personal(個人)、shh、debug(除錯)和 txpool(工具)。
問:你可以使用哪些RPC通過網路連線到Geth客戶端?
答:你可以使用JSON-RPC或WS-RPC通過網路連線到Geth客戶端。 IPC-RPC只能用來連線本地部署的Geth客戶端。
問:如果你輸入命令“--rpc”,啟用的是哪一個RPC?
答:JSON-RPC。
問:預設情況下哪些RPC API是啟用的?
答:eth(以太幣)、 web3和net(網路)。
問:如何為JSON-RPC啟用admin api?
答:輸入命令“--rpcapi”。
問:命令“--datadir”有什麼功能?
答:它指定了區塊鏈的儲存位置。
問:Geth的“快速”同步是什麼,為什麼它更快速呢?
答: “快速”同步僅下載收款交易所在的區塊,並拉取(pull)整個最近狀態資料庫,而不是像普通同步一樣,下載整個區塊鏈的資料並重放所有發生的交易。
問:命令“--testnet”有什麼功能?
答:它將客戶端連線到以太坊Ropsten測試網路。
問:啟動Geth客戶端會在螢幕上列印大量的輸出資訊,如果不想被這些繁雜資訊干擾該怎麼辦?
答:使用“--verbosity”命令調低輸出資訊複雜度的值(預設值為3)。
問:如何使用IPC-RPC連線兩個Geth客戶端?
答:首先啟動一個Geth客戶端,複製其管道位置(pipe location),然後使用相同的資料文件儲存目錄(datadir)啟動另一個Geth客戶端,並使用”--attach”命令傳遞複製的管道位置。
問:如何將自定義javascript檔案載入到Geth控制檯?
答:輸入”--preload”命令和檔案的路徑即可。
問:Geth客戶端中帳戶儲存在哪裡?
答:儲存在金鑰庫(keystore)目錄中。
問:如何使用給定的賬戶發起一筆交易?
答:首先你要在“--unlock”命令中傳入帳戶地址或索引來解鎖賬戶。然後你需要使用“--password”命令指定一個此賬戶的密碼檔案。
問:我們剛才說到了有關索引的內容。賬戶的索引取決於什麼?
答:取決於你新增帳戶的順序。
問:Geth客戶端是否能用來挖礦?
答:是的,輸入“--mine”命令即可。
問:挖礦選項中的“etherbase”是什麼?
答:這是接受挖礦獎勵的帳戶地址,該帳戶的索引為0。
(2)智慧合約常見問題
問:ABI是什麼?
答:簡單來說,“ABI”就是低級別的“API”。
ABI(Application Binary Interface)應用程式二進位制介面,從本質上講就是你呼叫智慧合約中的函式並獲取它返回值的方式。
ABI中定義瞭如何呼叫智慧合約中的函式以及應該選用哪種二進位制格式將資訊從一個程式元件傳遞到下一個程式元件的詳細資訊。
以太坊智慧合約以位元組碼的形式部署在以太坊區塊鏈上,一個智慧合約中可能會有多個函式。所以說,有了ABI你才可以指定呼叫智慧合約中的哪個函式,才能保證函式的返回值是你期望的格式。
這是一個來自以太坊ABI規範的例子:
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) {}
}
如果我們想使用引數“69”和“真”呼叫函式baz(),我們總共會傳遞68位元組的資料,整個過程可以分解為:
0xcdcd77c0:baz()函式的ID。這是函式baz(uint32,bool)以ASCII形式編碼的Keccak-256雜湊值的前4個位元組。
0x0000000000000000000000000000000000000000000000000000000000000045:
傳入函式baz()的第一個引數,32位無符號整數69被填充為32個位元組(10進制中的69換算成16進製為45)。
0x00000000000000000000000000000000000000000000000000000000000000000001:
傳入函式baz()的第二個引數,布林值真,也就是1,被填充為32個位元組。
這68個位元組會存放在交易的資料欄位(data),需要注意的是,一定要仔細檢查交易資料欄位中新增的內容,因為在將其傳遞給智慧合約時可能會產生意外的,甚至可能是惡意的副作用。)
為了避免出現生成函式ID時的常見錯誤,在此過程中必須使用規範的資料型別,就比如說使用標準的256位無符號整型(uint256)而不是無符號整型(uint)。
在Solidity中計算上述sam()函式ID的的程式碼如下:
bytes4(sha3("sam(bytes,bool,uint256[])")
在這裡可以使用諸如web3.js等高階程式庫來抽象大部分的細節,不過提供給web3.js的JSON格式ABI是必不可少的。
注意:ABI是一個抽象,它並不是以太坊核心協議的一部分。任何人都可以為自己的智慧合約定義專屬的ABI,這些智慧合約的任何呼叫者都必須遵守該ABI的規定才能得到有意義的呼叫結果。但是,對於所有開發人員來說,使用Solidity,Serpent和web3.js更為簡單,這些也都符合ABI的規定。
問:智慧合約是什麼?
答:從本質上說,智慧合約就是用多種語言編寫的計算機程式碼。智慧合約存在於區塊鏈網路上,它們按照自身嵌入的規則執行相關操作,可以看做是參與者之間的契約。
問:智慧合約可以用哪種語言編寫?
答:最常用的語言是Solidity,除此之外還有一些小眾的語言,比如說Serpent和類Lisp語言。
問:智慧合約都有什麼樣的使用場景呢?
答:舉一個簡單的商品買賣場景,買方在以太坊中部署一個智慧合約並向其中存入資金,賣方看到存入的資金後傳送商品,買方收到商品後通過智慧合約支付貨款。這裡的智慧合約可以看作是一個保障淘寶交易的去中心化的支付寶。
問:什麼是MetaMask?
答:Metamask是一款外掛型別的以太坊錢包,可以幫助使用者在瀏覽器中與以太坊網路進行互動。
問:Metamask使用什麼節點?
答:它使用infura.io。
問:相比於傳統以太坊錢包,有哪些功能是Metamask不支援的?
答:它不支援採礦和部署智慧合約。
問:智慧合約的執行是免費的嗎?
答:不,只能通過執行交易來呼叫智慧合約,而交易需要燃料費用。
問:檢視智慧合約的狀態是免費的嗎?
答:是的,查詢狀態不需要執行交易。
問:誰來執行智慧合約?
答:礦工。
問:為什麼呼叫智慧合約中的函式需要花錢?
答:除了一些不會改變智慧合約狀態,除了返回值之外沒有其他邏輯的函式之外,呼叫智慧合約中的函式都是需要花錢的。
這筆花費中,除了向智慧合約中轉入以太幣執行呼叫之外,呼叫改變智慧合約狀態的函式需要花費燃料來執行。
問:為什麼以太坊中要引入燃料費用呢?
答:因為礦工使用自己的計算機(礦機)執行智慧合約程式碼,礦工如果能收回購買機器的成本並獲得盈利才能保證整個系統生態的安全性,所以以太坊設計使得礦工可以通過執行呼叫者請求的程式碼來賺取燃料費用,從而維持一個健康的生態。
問:燃料價格是否能決定交易被處理的時間?
答:是的,也不全是。一般來說,你支付的燃料價格越高,交易越有可能被加入區塊鏈。儘管如此,燃料價格並不能保證交易更快地被處理。
問:交易中的燃料使用量取決於什麼?
答:燃料使用量取決於儲存的用量,指令(操作碼)的型別和數量。每一條以太坊虛擬機器的操作碼都明確規定了所需燃料的數量。
問:交易費該如何計算?
答:交易費 = 使用的燃料數量 * 燃料價格(燃料價格由交易者指定)。
問:如果執行智慧合約的花費少於交易者支付的燃料費用,他是否會獲得退款?
答:是的。
問:如果執行智慧合約的花費超過了交易者支付的燃料費用,這時會發生什麼?
答:使用者不會獲得退款,並且一旦所有燃料耗盡執行就會停止,智慧合約的狀態就不會改變。
問:誰來支付呼叫智慧合約的費用?
答:呼叫智慧合約的使用者。
問:節點在哪裡執行智慧合約的程式碼呢?
答:節點在以太坊虛擬機器(EVM)中執行智慧合約的程式碼。以太坊虛擬機器規範是以太坊協議的一部分。以太坊虛擬機器只是節點執行的一個程序。
問:以太坊虛擬機器需要什麼工具來執行智慧合約?
答:它需要智慧合約的位元組碼,它由高級別語言(如Solidity)編譯生成。
問:以太坊虛擬機器都包含哪些部分?
答:記憶體區域,堆疊和執行引擎。
問:Remix是什麼?
答:Remix是一個用於開發,測試和部署智慧合約的線上工具。它非常適合快速構建和測試輕量級的智慧合約,但不適用於複雜的智慧合約。
問:在Remix中,你可以連線哪些節點?
答:你可以使用Metamask錢包連線到公共節點,使用Geth錢包連線到本地節點以及使用Javascript虛擬機器連線到記憶體中模擬的節點。
問:什麼是DApp,它與普通App有什麼不同?
答:應用程式通常包含一個與某些中心化資源(由組織擁有)互動的客戶端,通常有一個與中心化資料層相連的中間層。如果中心化資料層中的資料丟失,則無法(輕鬆)恢復。
DApp表示去中心化的應用程式。DApp通過智慧合約與區塊鏈網路互動,它們使用的資料駐留在智慧合約的例項中,與中心化的資料相比,去中心化的資料安全性更高。
(3)Solidity常見問題
問:Solidity是靜態型別語言(型別的檢查是在執行前做的,如編譯階段)還是動態型別語言(型別的檢查是在執行時做的)?
答:Solidity是靜態型別語言,這意味著型別在編譯階段是已知的。
問:Solidity中的什麼結構與Java中的類(Class)相對應?
答:智慧合約。
問:智慧合約的例項是什麼?
答:智慧合約的例項就是在區塊鏈上部署的一個智慧合約。
問:Java和Solidity之間存在哪些差異。
答:相比於Java,Solidity支援多繼承(multiple inheritance),但不支援方法過載(Overloading)。
問:在Solidity檔案中需要指定的第一個引數是什麼?
答:第一個引數是Solidity編譯器的版本,需要指定為^ 0.4.8。不要小看了這一步,因為它可以避免出現在使用其他版本編譯器進行編譯時引入的不相容錯誤。
問:一個智慧合約包含什麼?
答:智慧合約主要由儲存變數,函式和事件組成。
問:智慧合約中都有哪些型別的函式?
答:有建構函式(constructor),回退函式(fallback function),常量函式(constant functions)和修改智慧合約狀態的函式。
問:如果我將多個智慧合約定義放入單個Solidity檔案中,會出現什麼樣的錯誤?
答:將多個智慧合約定義放入單個Solidity檔案中是完全可行的。
問:兩個智慧合約可以通過哪些方式進行互動?
答:一個智慧合約可以呼叫、建立和繼承另一個智慧合約。
問:當你嘗試部署具有多個智慧合約的檔案時會發生什麼?
答:編譯器只會部署該檔案中的最後一個智慧合約,也就是說,其他所有智慧合約都被忽略了。
問:如果我有一個龐大的專案,我是否需要將所有相關的智慧合約儲存在一個檔案中?
答:不需要,你可以使用import語句匯入檔案,如下所示:
import “./MyOtherContracts.sol”;
問:我是否只能匯入本地檔案?
答:不,你也可以使用HTTP匯入檔案(甚至是Github上的檔案),如下所示:
import “http://github.com/<owner>/<repo>/<path to the file>”
問:以太坊虛擬機器的記憶體都有哪些部分?
答:儲存(Storage)、記憶體(Memory)和Calldata。
問:請解釋一下儲存(Storage)。
答:可以把儲存想象成一個數據庫。每個智慧合約都管理自己的儲存變數,從而得到一個鍵值對資料庫(256位的鍵和值)。儲存與普通資料庫的唯一區別就是,由於存在燃料費用的問題它讀取和寫入操作的成本更高。
問:請解釋一下記憶體(Memory)。
答:記憶體是一個臨時性的儲存。當函式呼叫執行完畢後,記憶體中的資料將會被釋放。你可以在記憶體中分配各種複雜的資料型別,如陣列和結構體。
問:請解釋一下Calldata。
答:Calldata可以理解為一個函式呼叫堆疊(Callstack)。它是臨時的,不可修改的,它儲存著以太坊虛擬機器的執行資料。
問:儲存區和記憶體區分別儲存了哪些變數?
答:狀態變數和區域性變數(通常區域性變數都是對狀態變數的引用)位於儲存區中,而函式的引數位於記憶體區中。
問:閱讀以下程式碼,請解釋程式碼的哪一部分對應哪個記憶體區域:
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部分 - 儲存。
第2部分 - 儲存(陣列大小指向計數器的位置)
第3部分 – 記憶體。
第4部分 – 對儲存的引用。
問:我是否可以這樣定義一個函式:
function doSomething(uint[] storage args) internal returns(uint[] storage data) {…}
答:是的,你可以強制函式的引數為儲存型別。在這種情況下,如果你沒有向函式中傳入儲存引用,編譯器將會抱怨。
問:EVM呼叫和非EVM呼叫之間有什麼區別呢?
答:
EVM呼叫是智慧合約中的函式呼叫,它觸發函式執行並需要燃料。
非EVM呼叫讀取公開可見的資料,不需要燃料。
問:如何設定智慧合約的以太幣餘額限制,如果向有餘額限制的智慧合約中傳送超額的以太幣會發生什麼?
答:
pragma solidity ^0.4.19;
contract yourContract{
uint256 public balanceLimit = 999;
function () payable{
if (this.balance + msg.value > balanceLimit) {
throw;//超額後會回滾。
}
}
}
問:如何在智慧合約帳戶中設定msg.val的值?
答:msg.val => msg.value =
隨訊息傳送的wei的個數。
(4)DApp和web3.0常見問題
問:DApp是什麼?
答:去中心化應用程式(DApp)是在點對點網路的計算機上而不是單臺計算機上執行的應用程式。去中心化應用程式自點對點網路出現以來就已經存在,它是一種旨在以不受任何實體控制的方式存在於Internet上的軟體工具。
去中心化應用程式不一定需要在區塊鏈網路上執行。 BitTorrent(去中心化下載軟體)、Popcorn Time(去中心化視訊軟體)、BitMessage(去中心化通訊協議)、Tor(洋蔥路由)都是在點對點網路上執行的傳統去中心化應用程式,它們都沒有在區塊鏈上執行(區塊鏈是一種特殊的點對點網路)。
與簡單的智慧合約相反,在比特幣的經典使用場景,即使用者A向用戶B匯款,去中心化應用程式的參與者可以是市場中的任意一個人。
問:DApp與智慧合約有何不同?
答:去中心化應用程式是一個基於區塊鏈的網站,其中智慧合約允許它連線到區塊鏈中。說起來有點繞,為了更好地理解去中心化應用程式和智慧合約,讓我們先來了解傳統網站的工作方式。
傳統的Web(網路)應用程式在前端使用HTML,CSS和Javascr