亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 專題 > 區(qū)塊鏈 > 正文

如何開(kāi)始學(xué)習(xí)以太坊智能合約

2020-02-25 19:28:18
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

       我已經(jīng)智能合約領(lǐng)域工作了4年,主要在比特幣區(qū)塊鏈上。我參與的一些項(xiàng)目包括存在證明,bitcore(比特核心)以及Streamium. 過(guò)去這個(gè)月,我探索了在以太坊平臺(tái)上進(jìn)行開(kāi)發(fā)。

       我決定制作一個(gè)簡(jiǎn)短的指南服務(wù)未來(lái)想要學(xué)習(xí)以太坊開(kāi)發(fā)的程序員。手冊(cè)分為兩個(gè)部分:如何開(kāi)始以太坊智能合約開(kāi)發(fā),智能合約安全簡(jiǎn)述.

       如何開(kāi)始學(xué)習(xí)以太坊智能合約

       0.基礎(chǔ)概念

這個(gè)指南假設(shè)你已經(jīng)有了一些密碼學(xué)貨幣和區(qū)塊鏈的基礎(chǔ)技術(shù)背景。 如果你沒(méi)有,我建議快速過(guò)一遍Andreas Antonopoulos的《完全掌握比特幣》(Mastering Bitcoin),Consensys的《用剛剛夠的比特幣來(lái)搞懂以太坊》(Just Enough Bitcoin for Ethereum),或者至少看看Scott Driscoll的短片。 為了繼續(xù)讀下去你得了解公鑰和私鑰,為什么區(qū)塊鏈需要礦工,如何達(dá)成去中心化的共識(shí),以及交易腳本和智能合約的概念。

另外兩個(gè)在你開(kāi)始進(jìn)行以太坊開(kāi)發(fā)之前需要了解的重要的,相關(guān)的概念是以太坊虛擬機(jī)和汽油(gas)。以太坊的目的在于成為一個(gè)智能合約平臺(tái)。它的起源可以被追溯到Vitalik Buterin對(duì)比特幣做為智能合約平臺(tái)具有的局限性的評(píng)論。以太坊虛擬機(jī)(EVM)是以太坊智能合約執(zhí)行之處。與比特幣相比,它為撰寫合約提供了更具表現(xiàn)力和完整性的語(yǔ)言。事實(shí)上,它是一個(gè)圖靈完備的編程語(yǔ)言。一個(gè)比較好的比喻是,EVM是一個(gè)執(zhí)行智能合約的分布式的世界電腦。由于智能合約由EVM執(zhí)行, 必須存在一種限制每個(gè)合約占用資源的機(jī)制。EVM內(nèi)運(yùn)行的每一步操作實(shí)際上同時(shí)在被所有節(jié)點(diǎn)所執(zhí)行。這是為什么需要有汽油(gas)存在。一個(gè)以太坊合約代碼交易可以引發(fā)數(shù)據(jù)讀寫,密碼學(xué)原語(yǔ),調(diào)動(dòng)(發(fā)送信息給)其他合約等等昂貴的運(yùn)算。每個(gè)此類運(yùn)算都有用汽油計(jì)量的價(jià)格,每筆交易所耗費(fèi)的汽油單元需要用以太幣來(lái)支付,根據(jù)隨時(shí)變化的汽油和以太幣的匯率計(jì)算。相應(yīng)的價(jià)格會(huì)從提交交易請(qǐng)求的以太坊賬戶中扣除。同時(shí)每筆交易對(duì)可使用的汽油會(huì)設(shè)置上限參數(shù),用以防止編程錯(cuò)誤導(dǎo)致耗干賬戶中資金。點(diǎn)擊這里閱讀更多關(guān)于汽油。

       1.設(shè)置你的環(huán)境

好了,你已經(jīng)知道了那些基礎(chǔ)的,讓我們趕緊把環(huán)境搞起來(lái)寫代碼吧。為了開(kāi)始開(kāi)發(fā)以太坊app(或者dapp,去中心化應(yīng)用的簡(jiǎn)稱,許多人喜歡這樣叫),你需要安裝一個(gè)客戶端來(lái)接入主網(wǎng)。它會(huì)成為你進(jìn)入這個(gè)分布式網(wǎng)絡(luò)的窗口,提供一個(gè)觀察區(qū)塊鏈的方法,那里所有EVM(以太坊虛擬機(jī))狀態(tài)被顯示出來(lái)。有很多與條款兼容的客戶端,最受歡迎的是geth,用Go語(yǔ)言實(shí)現(xiàn)。但它并不是最開(kāi)發(fā)者友好的客戶端。我目前找到最好的選擇是testrpc節(jié)點(diǎn)(是的,名字起得很糟糕)。相信我,它會(huì)節(jié)省你很多時(shí)間。安裝它,運(yùn)行它:

 

$ sudo npm install -g ethereumjs-testrpc$ testrpc

你應(yīng)該在一個(gè)新的終端中運(yùn)行‘testrpc’,并且在你開(kāi)發(fā)的過(guò)程中一直讓它運(yùn)行。每次你運(yùn)行testrpc,它會(huì)生成10個(gè)包涵模擬測(cè)試資金的新地址供你使用。這個(gè)不是真錢,你可以安全得用這些進(jìn)行任何實(shí)驗(yàn),不會(huì)有損失資金的風(fēng)險(xiǎn)。在以太坊中撰寫智能合約最受歡迎的語(yǔ)言是Solidity,因此我們會(huì)使用這個(gè)語(yǔ)言。我們也會(huì)用Truffle開(kāi)發(fā)框架,它會(huì)幫助創(chuàng)造智能合約,編譯,部署以及測(cè)試。讓我們開(kāi)始吧

 

# First, let's install truffle首先,讓我們安裝truffle$ sudo npm install -g truffle# let's setup our project$ mkdir solidity-experiments$ cd solidity-experiments/$ truffle init

Truffle 會(huì)生成一個(gè)示范項(xiàng)目所需要的文件,包括MetaCoin,一個(gè)token合約的例子。你應(yīng)該能夠通過(guò)運(yùn)行truffle compile指令來(lái)編譯示范合約。然后,你需要通過(guò)我們?cè)谶\(yùn)行的testrpc節(jié)點(diǎn)用‘truffle migrate’指令來(lái)在模擬網(wǎng)絡(luò)部署合約。

 

Compiling ConvertLib.sol...Compiling MetaCoin.sol...Compiling Migrations.sol...Writing artifacts to ./build/contracts$ truffle migrateRunning migration: 1_initial_migration.js  Deploying Migrations...  Migrations: 0x78102b69114dbb846200a6a55c2fce8b16f61a5dSaving successful migration to network...Saving artifacts...Running migration: 2_deploy_contracts.js  Deploying ConvertLib...  ConvertLib: 0xaa708272521f972b9ceced7e4b0dae92c77a49ad  Linking ConvertLib to MetaCoin  Deploying MetaCoin...  MetaCoin: 0xdd14d0691ca607d9a38f303501c5b0cf6c843fa1Saving successful migration to network...Saving artifacts...Note to Mac OS X users: Truffle is sometimes confused by .DS_Store files. If you get an error mentioning one of those files, just delete it.

我們剛剛往測(cè)試節(jié)點(diǎn)上部署了我們的示范合約。哇!很簡(jiǎn)單,對(duì)吧?是時(shí)候?qū)懳覀冏约旱暮霞s了!

       2.撰寫你的第一個(gè)以太坊只能合約

在這個(gè)指南里面,我們會(huì)寫一個(gè)存在證明只能合約。就是創(chuàng)造一個(gè)存有用于證明存在的文件哈希的電子公正機(jī)關(guān)。用‘truffle create:contract’來(lái)開(kāi)始:

 

$ truffle create:contract ProofOfExistence1

從你的編譯器里面打開(kāi)合約/ProofOfExistnece1.sol(我用的是帶Soilidity語(yǔ)法高亮顯示的vim)

 

// Proof of Existence contract, version 1contract ProofOfExistence1 {  // state  bytes32 public proof;  // calculate and store the proof for a document  // *transactional function*  function notarize(string document) {    proof = calculateProof(document);  }// helper function to get a document's sha256  // *read-only function*  function calculateProof(string document) constant returns (bytes32) {    return sha256(document);  }}

我們將從一段簡(jiǎn)單但是有錯(cuò)誤的代碼開(kāi)始向一個(gè)更好的解決方案靠近。這是一份Solidity合約定義,有點(diǎn)像其他語(yǔ)言中的類別(class)。合約中有狀態(tài)(state)和函數(shù)(functions)。區(qū)分合約中可能出現(xiàn)的兩種函數(shù)非常重要。

  • 只讀(常數(shù))函數(shù):這些函數(shù)不對(duì)任何狀態(tài)(state)進(jìn)行改變。他們只讀取狀態(tài),進(jìn)行計(jì)算,并且返回?cái)?shù)值。因?yàn)檫@些函數(shù)可以在每一個(gè)節(jié)點(diǎn)內(nèi)本地解決,他們不回花費(fèi)任何的汽油(gas)。他們被用‘contant’關(guān)鍵詞標(biāo)出。

  • 交易函數(shù):這些函數(shù)對(duì)狀態(tài)進(jìn)行改變,轉(zhuǎn)移資金。因?yàn)檫@些變化需要在區(qū)塊鏈中被反應(yīng)出來(lái),執(zhí)行交易函數(shù)需要向網(wǎng)絡(luò)提交交易,這會(huì)消耗汽油(gas)。

我們的合約中兩種函數(shù)各有一個(gè),已在注釋中標(biāo)注。下一段我們將會(huì)看到我們使用函數(shù)的類型會(huì)如何改變我們與智能合約交互。這個(gè)簡(jiǎn)單的版本每次只儲(chǔ)存一個(gè)證明,用數(shù)據(jù)類型bytes32或者32bytes,跟sha256哈希的大小一樣。交易函數(shù)‘notarize’允許我們?cè)诤霞s的狀態(tài)變量‘proof’里存儲(chǔ)一個(gè)文件的哈希。這個(gè)變量是個(gè)公開(kāi)變量,是我們合約的用戶認(rèn)證一個(gè)文件是否被公正的唯一途徑。我們一會(huì)就會(huì)自己做一下,但是首先。。。
讓我們把ProofOfExistence1部署到網(wǎng)絡(luò)上!這次,你需要通過(guò)編輯移動(dòng)文檔(migration file)(migrations/2_deploy_contracts.js)讓Truffle部署我們的新合約。用以下的來(lái)代替內(nèi)容:

 

/* * migrations/2_deploy_contracts.js: */module.exports = function(deployer) {  deployer.deploy(ConvertLib);  deployer.autolink();  deployer.deploy(MetaCoin);  // add this line  deployer.deploy(ProofOfExistence1);};

你也可以選擇性的刪除有關(guān)ConvertLib和MetaCoin的語(yǔ)句,這些我們不會(huì)再用了。為了再次運(yùn)行這個(gè)移動(dòng),你需要使用重啟標(biāo)簽確保它再次運(yùn)行。

 

truffle migrate --reset

更多的關(guān)于Truffle移動(dòng)如何工作的內(nèi)容可以看這里。

       3. 與你的智能合約互動(dòng)

現(xiàn)在我們已經(jīng)將智能合約部署好了,讓我們擺弄擺弄它!我們可以通過(guò)函數(shù)調(diào)用來(lái)給它發(fā)信息或者讀取它的公開(kāi)狀態(tài)。我們通過(guò)Truffle操縱臺(tái)來(lái)完成:

 

$ truffle console// get the deployed version of our contracttruffle(default)> var poe = ProofOfExistence1.deployed()// and print its address truffle(default)> console.log(poe.address)0x3d3bce79cccc331e9e095e8985def13651a86004// let's register our first "document"truffle(default)> poe.notarize('An amazing idea')Promise { <pending> }// let's now get the proof for that documenttruffle(default)> poe.calculateProof('An amazing idea').then(console.log)Promise { <pending> }0xa3287ff8d1abde95498962c4e1dd2f50a9f75bd8810bd591a64a387b93580ee7// To check if the contract's state was correctly changed:truffle(default)> poe.proof().then(console.log)0xa3287ff8d1abde95498962c4e1dd2f50a9f75bd8810bd591a64a387b93580ee7// The hash matches the one we previously calculated

注意所有函數(shù)調(diào)用都會(huì)返回一個(gè)Promise,當(dāng)Promise被解決如果我們想要檢驗(yàn)它我們可以通過(guò)‘.then(console.log)’來(lái)輸出。
我們要做的第一件事是獲得一個(gè)我們部署合約的表達(dá),并把它存儲(chǔ)在一個(gè)叫做‘poe’的變量之中。
然后我們調(diào)用交易方程‘notarize’,這會(huì)涉及一個(gè)狀態(tài)改變。當(dāng)我們調(diào)用一個(gè)交易方程,我們得到的是一個(gè)被轉(zhuǎn)化為交易id的Promise,而不是函數(shù)返回的值。記住為了改變EVM狀態(tài)我們需要消耗汽油(gas)并且向網(wǎng)絡(luò)提交一個(gè)交易。這是為什么我們會(huì)得到交易id做為Promise的結(jié)果,從改變狀態(tài)的那項(xiàng)交易那里得到。在這里,我們對(duì)交易id不感興趣,所以我們可以把Promise丟掉。不過(guò)當(dāng)我們真正寫app時(shí),我們會(huì)想要把它存起來(lái)用以檢查相應(yīng)的交易,捕捉錯(cuò)誤。

接下來(lái),我們調(diào)用只讀(常數(shù))函數(shù)‘calculateProof‘. 記得用’constant‘關(guān)鍵詞來(lái)標(biāo)記你的只讀函數(shù),否則Truffle會(huì)試著創(chuàng)造一個(gè)交易來(lái)執(zhí)行這個(gè)函數(shù)。這個(gè)是我們告訴Truffle,我們并沒(méi)有跟區(qū)塊鏈交互而只是在讀取。通過(guò)這個(gè)只讀函數(shù),我們會(huì)得到’An amazing idea‘文件的sha256。

我們現(xiàn)在需要把這個(gè)和我們智能合約的狀態(tài)進(jìn)行對(duì)比。為了檢查狀態(tài)的改變是否正確,我們需要讀取‘Proof’這個(gè)公開(kāi)狀態(tài)變量。要獲得一個(gè)公開(kāi)狀態(tài)變量的值,我們得調(diào)用具有同樣名字的一個(gè)函數(shù),它會(huì)返回一個(gè)Promise。我們這次,輸出的哈希值是一致的,所以一切都如我們所料得進(jìn)行了 :)

像你從上面的片段看到的,我們第一版存在證明智能合約似乎可以工作!干得好!但是它每次只可以注冊(cè)一個(gè)文件。讓我們做一版更好的。

       4. 合約代碼迭代

讓我們修改合約來(lái)支持多個(gè)文件驗(yàn)證。把原文件復(fù)制到名為contracts/ProofOfExistence2.sol的新文件中,并且采取以下改變。主要的變化包括:我們把‘proof’變量變成了bytes32的數(shù)組,并且命名為‘proofs’,我們把它變成私有,然后加入一個(gè)通過(guò)循環(huán)訪問(wèn)數(shù)組來(lái)檢查一個(gè)文件是否被公正的函數(shù)。

 

// Proof of Existence contract, version 2contract ProofOfExistence2 {  // state  bytes32[] private proofs;  // store a proof of existence in the contract state  // *transactional function*  function storeProof(bytes32 proof) {    proofs.push(proof);  }  // calculate and store the proof for a document  // *transactional function*  function notarize(string document) {    var proof = calculateProof(document);    storeProof(proof);  }  // helper function to get a document's sha256  // *read-only function*  function calculateProof(string document) constant returns (bytes32) {    return sha256(document);  }  // check if a document has been notarized  // *read-only function*  function checkDocument(string document) constant returns (bool) {    var proof = calculateProof(document);    return hasProof(proof);  }  // returns true if proof is stored  // *read-only function*  function hasProof(bytes32 proof) constant returns (bool) {    for (var i = 0; i < proofs.length; i++) {      if (proofs[i] == proof) {        return true;      }    }    return false;  }}

讓我們與新的函數(shù)互動(dòng)一下:(不要忘了更新migrations/2_deploy_contracts.js來(lái)加入新的合約并且運(yùn)行‘truffle mirgrate--reset’)

 

// deploy contractstruffle(default)>  migrate --reset// Get the new version of the contracttruffle(default)> var poe = ProofOfExistence2.deployed()// let's check for some new document, and it shouldn't be there.truffle(default)> poe.checkDocument('hello').then(console.log)Promise { <pending> }false// let's now add that document to the proof storetruffle(default)> poe.notarize('hello')Promise { <pending> }// let's now check again if the document has been notarized!truffle(default)> poe.checkDocument('hello').then(console.log)Promise { <pending> }true// success!// we can also store other documents and they are recorded tootruffle(default)> poe.notarize('some other document');truffle(default)> poe.checkDocument('some other document').then(console.log)Promise { <pending> }true

這一版比第一版強(qiáng),但是仍然有些問(wèn)題。注意每一次我們想要檢查一個(gè)文件是否有被公正過(guò)時(shí)都需要循環(huán)訪問(wèn)所有存在的‘proofs’。儲(chǔ)存proofs更好的結(jié)構(gòu)會(huì)是用映射(map)。走運(yùn)的是,Solidity支持映射結(jié)構(gòu),在這個(gè)語(yǔ)言里稱此結(jié)構(gòu)為mappings。另外一個(gè)我們會(huì)在這一版代碼做出的改進(jìn)是我們會(huì)去掉那些多余的標(biāo)識(shí)只讀(read-only)或交易(transactional)函數(shù)的那些注釋。我想現(xiàn)在你已經(jīng)都知道這些了:)下面是最終版本,我想應(yīng)該不難理解,因?yàn)槭菑闹暗陌姹疽稽c(diǎn)點(diǎn)變過(guò)來(lái)的:

 

// Proof of Existence contract, version 3contract ProofOfExistence3 {  mapping (bytes32 => bool) private proofs;  // store a proof of existence in the contract state  function storeProof(bytes32 proof) {    proofs[proof] = true;  }  // calculate and store the proof for a document  function notarize(string document) {    var proof = calculateProof(document);    storeProof(proof);  }  // helper function to get a document's sha256  function calculateProof(string document) constant returns (bytes32) {    return sha256(document);  }  // check if a document has been notarized  function checkDocument(string document) constant returns (bool) {    var proof = calculateProof(document);    return hasProof(proof);  }  // returns true if proof is stored  function hasProof(bytes32 proof) constant returns(bool) {    return proofs[proof];  }}

       這下看起來(lái)已經(jīng)足夠好了。它跟第二版運(yùn)行起來(lái)沒(méi)有差別。記得更新移動(dòng)文檔(migration file)同時(shí)再次運(yùn)行‘truffle migrate -- reset’來(lái)測(cè)試一下它。這個(gè)教程中的所有代碼都可以在這里找到。

       5.在真正的測(cè)試網(wǎng)絡(luò)上部署

在你用testrpc在模擬網(wǎng)絡(luò)上大量測(cè)試你的合約之后,你就可以在真正的網(wǎng)絡(luò)上測(cè)試你的合約啦!這就需要你有一個(gè)真正的testnet/livenet以太坊客戶端。點(diǎn)擊這里看如何安裝geth的說(shuō)明。
開(kāi)發(fā)的過(guò)程中,你應(yīng)該在testnet模式中運(yùn)行你的節(jié)點(diǎn),這樣你就可以在沒(méi)有損失真金白銀的風(fēng)險(xiǎn)下進(jìn)行所有的測(cè)試。Testnet模式(在以太坊也叫Morden)基本上與真正的以太坊一模一樣,但是這里的以太幣token沒(méi)有任何金錢價(jià)值。不要發(fā)懶,記得永遠(yuǎn)要在testnet模式下開(kāi)發(fā),如果你因?yàn)榫幊体e(cuò)誤而損失以太幣,你會(huì)非常后悔的。
在testnet模式下運(yùn)行g(shù)eth, 打開(kāi)RPC服務(wù)器:

 

geth --testnet --rpc console 2>> geth.log

這會(huì)打開(kāi)一個(gè)你可以輸入基本口令來(lái)控制你的節(jié)點(diǎn)/客戶端的控制器。你的節(jié)點(diǎn)會(huì)開(kāi)始下載testnet區(qū)塊鏈,你可以在eth.blockNumber上查看下載進(jìn)度。區(qū)塊鏈下載的同時(shí),你仍然可以運(yùn)行口令。比如,讓我們?cè)O(shè)置一個(gè)賬戶:(千萬(wàn)要記住密碼?。?/p>

 

> personal.newAccount()Passphrase:Repeat passphrase:"0xa88614166227d83c93f4c50be37150b9500d51fc"

讓我們發(fā)送一些以太幣過(guò)去并且查詢余額。你可以從這里獲得免費(fèi)testnet以太幣:https://zerogox.com/ethereum/wei_faucet. 只需復(fù)制粘帖你剛剛生成的那個(gè)地址,這個(gè)水龍頭就是給你發(fā)送一個(gè)以太幣。想要查詢余額,運(yùn)行以下代碼:

 

> eth.getBalance(eth.accounts[0])0

它會(huì)告訴你沒(méi)有余額因?yàn)槟氵€沒(méi)有與全網(wǎng)絡(luò)同步。在你等待的同時(shí),去testnet block explorer去查詢一下余額。那里,你也可以看到testnet目前最高的塊數(shù)(寫這個(gè)的時(shí)候是#1355293),你可以將這個(gè)信息與eth.blockNumber的信息結(jié)合去判斷你的節(jié)點(diǎn)是否已經(jīng)完成同步。
一旦你的節(jié)點(diǎn)同步好,你就可以開(kāi)始通過(guò)Truffle在testnet上部署你的合約了。首先,解鎖你的主geth賬戶,這樣Truffle就可以使用它。確認(rèn)里面有一些余額,否則你將不能夠把新的合約推向網(wǎng)絡(luò)。

 

> personal.unlockAccount(eth.accounts[0], "mypassword", 24*3600)true> eth.getBalance(eth.accounts[0])1000000000000000000

準(zhǔn)備好了吧!如果這兩個(gè)的某一個(gè)無(wú)法運(yùn)行,檢查之前的步驟以確保你正確的完成了它們?,F(xiàn)在,運(yùn)行:

 

$ truffle migrate --reset

注意這次會(huì)需要更長(zhǎng)的時(shí)間來(lái)完成,因?yàn)槲覀兪窃谶B接到真正的網(wǎng)絡(luò)而不是一個(gè)用testrpc模擬出來(lái)的網(wǎng)絡(luò)。一旦完成,你就可以用之前同樣的方法跟智能合約互動(dòng)。
在testnet上部署的版本ProofOfExistence3可以在這個(gè)地址找到:0xcaf216d1975f75ab3fed520e1e3325dac3e79e05.
我想把如何在以太坊現(xiàn)場(chǎng)網(wǎng)絡(luò)部署合約的細(xì)節(jié)留給讀者。你只應(yīng)該在模擬網(wǎng)絡(luò)和testnet大量測(cè)試你的合約之后再做這個(gè)。千萬(wàn)記得,任何編程錯(cuò)誤都可能導(dǎo)致在livenet上的金錢損失!
以太坊中智能合約的安全性問(wèn)題很具有挑戰(zhàn)性。參見(jiàn) Emin Gun Sirer的 “智能合約挺難弄對(duì)的”。
考慮到智能合約是定義金錢如何移動(dòng)的電腦代碼的性質(zhì),我不得不在安全問(wèn)題上稍做提示。我會(huì)在以后的文章里深度的討論合約安全性問(wèn)題(像這里),但是這里我會(huì)先簡(jiǎn)單的提幾點(diǎn)。

一些你應(yīng)該知道(并且避免)的問(wèn)題:

重入攻擊(reentrancy):不要在合約里使用外部調(diào)用。如果迫不得已,確保它是你做得最后一件事。
發(fā)送失?。╯end can fail):發(fā)送資金時(shí),你的代碼應(yīng)該為發(fā)送失敗的情況做好準(zhǔn)備。
循環(huán)可能引發(fā)汽油限制(Loops can trigger gas limit):當(dāng)你在狀態(tài)變量上做循環(huán)的時(shí)候千萬(wàn)當(dāng)心,變量的大小會(huì)增長(zhǎng)這可能導(dǎo)致汽油消耗到達(dá)極限。
調(diào)用棧深度限制(Call stack depth limit):不要使用遞歸,記住任何調(diào)用都可能因?yàn)檎{(diào)用棧到達(dá)極限而失敗。
時(shí)間戳依賴性(Timestamp dependency):不用在代碼的關(guān)鍵部分使用時(shí)間戳,因?yàn)榈V工可以操縱它們。

這些是智能合約中可能導(dǎo)致資金盜竊以及毀壞的一些意外行為的例子。中心思想是:如果你在撰寫智能合約,你就在寫真正處理金錢的代碼。你應(yīng)該加一萬(wàn)個(gè)當(dāng)心!寫測(cè)試,反復(fù)檢查代碼,并且做代碼審核。

避免明顯安全問(wèn)題的最好方法就是對(duì)語(yǔ)言有扎扎實(shí)實(shí)的理解。我建議熟讀Solidity文檔,如果你有時(shí)間。我們將會(huì)需要更多更好的工具來(lái)完善智能合約安全。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
亚洲在线不卡| 国产毛片欧美毛片久久久| 亚洲综合在线五月| 欧美在线不卡视频| 亚洲妇女无套内射精| 国产91av在线| 久久国产精品1区2区3区网页| 国产精品久久久久永久免费看| 日韩电影不卡一区| 国产香蕉久久精品综合网| 国产香蕉97碰碰久久人人| 欧美亚洲一区二区三区| 综合电影一区二区三区| 一区二区三区视频免费在线观看| 久久婷婷国产精品| 天堂网av2018| 色就是色欧美色图| 亚洲一区二区三区四区五区黄| 777影院狠狠色| 欧美日韩一区二区三区不卡视频| 国产一区二区三区视频在线| 成人免费网站在线观看视频| 四虎精品一区二区三区| 国产男小鲜肉同志免费| 91传媒在线观看| 国产精品久久久久久久蜜臀| www日本黄色| 一本色道久久综合狠狠躁的番外| 美脚恋feet久草欧美| 男人的天堂亚洲在线| 久久99精品国产一区二区三区| 国产极品模特精品一二| 91精品人妻一区二区三区蜜桃欧美| 青青艹在线观看| 欧美激情2020午夜免费观看| 超碰97久久国产精品牛牛| 亚洲欧洲日韩综合二区| 亚洲成年人电影| 毛片av中文字幕一区二区| 欧美福利小视频| 国产在线麻豆精品观看| 欧美性受xxxx黑人xyx| 97精品国产综合久久久动漫日韩| 中文字幕精品www乱入免费视频| 欧美日韩在线一二三| √最新版天堂资源网在线| 国产一区二区三区四区五区3d| 91精品入口蜜桃| 欧美理论片在线观看| 久久久久久国产精品免费播放| 一二三区精品福利视频| 成人免费毛片嘿嘿连载视频| 亚洲精品偷拍视频| www.av精品| 亚洲女人毛片| 美女黄视频在线观看| 欧美日韩综合| 黄色一级视频免费看| 亚洲ai欧洲av| 狠狠久久五月精品中文字幕| 中文字字幕在线中文乱码| 国产69精品久久久久9999| 狠狠色狠狠色综合| 伊人久久久久久久久久久久久| 精品国产一区二区精华| 可以看污的网站| 黄色网址免费| 久草在在线视频| 在线激情小视频| 国产女人高潮毛片| 五月天激情婷婷| 日韩在线视频国产| 久久一区二区三区喷水| 久久中文字幕国产| 韩日av一区二区| 伊人久久久久久久久久久久久| 日韩精品一卡二卡| 久久这里只有精品免费| 日韩欧美中文在线视频| 国产亚洲精品成人av久久ww| 亚洲一区二区自拍| 日本一区二区欧美| 国产精品亚洲综合天堂夜夜| 午夜69成人做爰视频| 中文在线资源新版官网| 国产成人免费视频一区| 成人亚洲综合| 麻豆成人在线播放| 国产精品99久久久久久久久久久久| 国内成人精品视频| 在线视频欧美日韩| 最近中文字幕mv免费高清在线| 老司机免费视频一区二区| 99视频免费| 中文字幕21页在线看| 性xxxx奶大欧美高清| 色猫猫国产区一区二在线视频| 中文字幕精品综合| 亚洲精品乱码久久久久久不卡| 中文字幕一区二区三区电影| 全国精品久久少妇| 能看毛片的网站| 成人免费一区二区三区视频网站| 久久精品国产2020观看福利| ass精品国模裸体欣赏pics| 一级片免费在线| 折磨小男生性器羞耻的故事| 国产美女精彩久久| 国产91精品久| 国产成人亚洲精品青草天美| 精品熟女一区二区三区| 婷婷久久伊人| 国产成人福利片| 中日韩美女免费视频网址在线观看| 国产精品美女主播在线观看纯欲| 久久一二三四区| 伊人久久大香线蕉成人综合网| 欧美性生活一级| 狠狠色狠狠色综合婷婷tag| 婷婷国产v国产偷v亚洲高清| 欧美色图亚洲天堂| 国产在线精品一区二区三区| h精品动漫在线观看| 欧美日韩国产在线播放| 欧美日韩免费观看中文| 97超碰人人模人人爽人人看| 性生交大片免费看女人按摩| 国产三级黄色片| 欧洲亚洲精品视频| 97se亚洲国产综合自在线| 欧美激情视频一区二区三区不卡| 亚洲第一视频在线观看| 久久婷婷亚洲| 欧美激情乱人伦一区| 亚洲精品一区二区久| ass极品国模人体欣赏| 成人国产精品毛片| 2018天天操夜夜操| 中文字幕一区二区三区四区不卡| 日韩欧美中文| 日韩精品高清在线观看| 欧美一级高清免费播放| www.中文字幕av| 亚洲一二三四五六区| 丰满人妻av一区二区三区| 激情懂色av一区av二区av| 国产女优裸体网站| 极品校花啪啪激情久久| 欧美一区二区三区播放老司机| 成人影视免费观看| 春意影院午夜免费入口| 国产传媒在线看| 91精品国产高清久久久久久| 妞干网免费在线视频| 久久精品国产亚洲一区二区三区| 一区二区成人在线| 国产精品美女久久久久久久久| 日韩激情视频在线观看| 日本欧美黄色片| 欧美大交乱xxxxbbbb| 成人在线视频网址| 亚洲精品在线免费播放| 亚洲成a人片77777精品| 精品久久久无码中文字幕| 青青青视频在线免费观看| 向日葵污视频在线观看| 91蜜桃臀久久一区二区| wwwwxxxx在线观看| 国内精品久久久久久久影视麻豆| 亚洲日本理论电影| 成人污网站在线观看| 亚洲精品视频导航| 日本欧美在线观看| 国产最新精品视频| 五月天婷婷综合| 高清一区二区三区av| 亚洲欧美国产日韩中文字幕| 欧美日本韩国一区| 超碰96在线| 欧美少妇性性性| 欧美美女18p| 国产午夜精品久久久久久久| 国产又大又黄又粗的视频| 不卡中文字幕在线观看| 成人www视频在线观看| 日韩第一页在线| 亚洲国产高清视频| 亚洲国产成人精品久久久国产成人一区| 疯狂欧洲av久久成人av电影| 亚洲sss视频在线视频| 国产理论电影在线观看| 中文字幕电影在线观看| 99re6这里只有精品| 99免在线观看免费视频高清| 中文字幕av在线一区二区三区| 亚洲网友自拍偷拍| jizz视频在线观看| 呦视频在线一区二区三区| 国产日韩欧美日韩大片| 国产精品伦一区二区三区| bbw在线视频| 激情图片小说一区| 天天影视欧美综合在线观看| 91成人在线观看喷潮教学| 国内精品久久久久久久久电影网| 日韩欧美二区| 天天综合中文字幕| 国产精品一久久香蕉国产线看观看| 久久久久久人妻一区二区三区| 麻豆国产精品va在线观看不卡| 在线视频自拍| 国模套图日韩精品一区二区| 久久最新网址| 日韩—二三区免费观看av| 新版中文在线官网| 自拍偷拍亚洲天堂| 午夜在线观看免费一区| 国产精品12| 欧美亚洲视频在线看网址| 日本电影二区| 精品福利在线看| 偷拍亚洲欧洲综合| 日韩成人黄色片| 中文字幕在线不卡一区| 尤物影院在线播放| 亚洲国产高清国产精品| 亚洲人成77777| 国产一区二区在线免费视频| 久久天堂av综合合色| 日本人69视频| eeuss影院18直达| 激情欧美成人久久综合小说| 欧美成人亚洲成人日韩成人| 性欧美大战久久久久久久免费观看| 国产在线拍偷自揄拍精品| 欧美猛男gaygay网站| 国产成人精品免费视频大全软件| 波多野结衣一本| 亚洲精品一区二区三区影院| 极品颜值美女露脸啪啪| 欧美老**bbbb毛片| 成人免费淫片免费观看| 国产精品 欧美在线| h视频在线观看免费完整版| 亚洲欧美日韩综合在线| 性色视频在线| 在线一区视频| 国产视频一二三四区| 日韩在线视频网| 日韩激情av在线| 日韩精品一级二级| 欧美日本一区二区三区四区| 国产一级片91| 日韩成人在线资源| 亚洲理论在线观看| www.色精品| 四虎影视最新网站入口在线观看| 国产一区二区视频在线播放| 亚洲视屏在线观看| 精品一区二区三区日韩| 国产日韩欧美成人| 麻豆中文字幕在线观看| 少妇高潮毛片色欲ava片| 欧美在线一区二区三区四区| 国产在线播精品第三| 黄网站在线观看| 国产三级香港三韩国三级| 超碰在线中文字幕| 国产精品第2页| 99在线观看精品视频| 99久久久国产| 北条麻妃在线观看| 亚洲精品欧美专区| 亚洲999一在线观看www| 国精品**一区二区三区在线蜜桃| 九色成人免费视频| 看免费黄色录像| 国产精品第10页| 国产一二在线播放| www.在线播放| 天天操综合520| 亚洲国产精品久久久男人的天堂| 午夜一区二区三区四区| 久久婷婷中文字幕| 爽爽影院免费观看视频| 高清国产一区二区三区| 黄色大片在线观看| 国产成人在线免费看| 久久久久久毛片免费看| 亚洲av中文无码乱人伦在线视色| 午夜影院在线视频| 男人天堂99| www.91在线播放| 日本精品久久中文字幕佐佐木| 国产欧美综合在线观看第十页| 欧美精品一区二区久久婷婷| 免费国产一区| 欧美视频免费看欧美视频| 三级成人黄色影院| 91在线导航| 97人人澡人人爽人人模亚洲| a级片免费在线观看| 一区二区三区蜜桃网| 欧美成人精精品一区二区频| 亚洲成人网av| 国产精品theporn88| 午夜视频在线观看网站| 福利视频在线| aⅴ色国产欧美| 欧美日韩视频免费在线观看| 日韩欧美一区二区三区视频| 好色先生视频污| 欧美激情自拍| 欧美精品v日韩精品v国产精品| 国产视频二区在线观看| 亚洲精品一二区| 中日韩黄色大片| 欧美性视频在线播放| av无码精品一区二区三区宅噜噜| 日本少妇色视频| 激情成人午夜视频| 国产综合av一区二区三区| 亚洲成人激情视频| 国产很黄免费观看久久| 在线你懂的视频| 久久偷窥视频| 女人帮男人橹视频播放| 国产精品久久久久久9999|