以太坊教程——深入瞭解以太坊!
以太坊教程:在這個以太坊教程部落格中,我將解釋以太坊架構的內部工作,我還將通過一個簡單的智慧合約向你展示以太坊的實現。我認為以太坊是一種可程式設計區塊鏈,將來會為大多數B2C企業服務。以太坊授予開發人員建立在區塊鏈上執行的複雜模型的自由,而不是將其限制為比特幣區塊鏈等預定義操作。
通過這種方法,以太坊已經成為眾多分散應用程式和組織的平臺,其中包括但不限於加密貨幣。
通過這個“以太坊教程”部落格的執行,我將以詳盡的方式介紹各種主題。這些主題包括:
- 以太坊賬戶
- 以太坊虛擬機器
- 以太坊網路
- 以太和gas
- 以太坊挖礦
以太坊教程:以太坊賬戶
以太坊網路有兩種型別的帳戶,即:
- 外部賬戶
- 合約賬戶
外部和合約的這些帳戶被稱為“狀態物件”並且包括以太坊網路的“狀態”。每個狀態物件都有明確定義的狀態。對於外部帳戶,狀態包括帳戶餘額,而對於合約帳戶,狀態由記憶體儲存和餘額定義。
我將外部帳戶簡稱為帳戶。這些帳戶由網路的外部代理所代表,包括每個普通使用者,礦工,自動代理等。
這些帳戶通常在RSA等公鑰加密演算法的幫助下進行控制。外部帳戶的主要目的是作為使用者與以太坊區塊鏈互動的媒介。
另一方面,合約帳戶是駐留在特定地址的區塊鏈上的程式碼集合。這些合約由外部帳戶或其他合約通過特定的號召性用語功能呼叫。這些合約是用高階指令碼語言編寫的,如Solidity,Serpent或LLL。駐留在以太坊區塊鏈中的每個合約都以稱為EVM(以太坊虛擬機器)位元組碼的特定格式儲存,該位元組碼是以太坊特定的二進位制格式。
以太坊教程:以太坊虛擬機器
Ethereum以質樸的方式定義了一組通用協議,這些協議已成為分散應用程式開發的支柱。其中的核心是以太坊虛擬機器。下圖解釋了架構:
值得注意的是,以太坊虛擬機器不僅完全沙盒化,而且完全隔離。這意味著當前在EVM上執行的程式碼無法訪問網路或檔案系統,並且可以謹慎地訪問其他合約。
現在我們瞭解了平臺的核心,讓我們深入瞭解網路節點。
以太坊教程:以太坊網路
以太坊網路是公共區塊鏈網路。它構成了在網路上執行的所有去中心化的節點應用程式和組織的基礎。網路由兩種型別的節點組成,即完整節點和輕量級節點。
完整節點包含自創世塊以來的整個交易歷史。它們是區塊鏈網路完整性的完整證明。完整節點必須包含根據以太坊規範設定的規則驗證的每個交易。
另一方面,輕量級節點僅包含整個區塊鏈的子集。這些型別的節點主要用於電子錢包,其本質上必須是輕量級的,因此整個區塊鏈不能儲存在它們上面。相反,這些節點不驗證每個塊或交易,也可能沒有當前區塊鏈狀態的副本。他們依靠完整的節點為他們提供缺失的細節(或者只是缺少特定的功能)。輕型節點的優勢在於它們可以更快地啟動和執行,可以在更多計算/記憶體受限的裝置上執行,並且不會佔用幾乎同樣多的儲存空間。
每個公共區塊鏈都附有一種貨幣。以太坊也不例外。讓我們深入瞭解以太坊的加密貨幣。
以太坊教程:以太和gas
以太是用於支付以太坊網路上的交易的加密貨幣的名稱。除了支付一般交易和服務外,Ether還用於購買Gas,而Gas又用於支付EVM內的計算費用。
以太是公制單位,有很多面額,有助於準確支付交易和gas。最小面額a.k.a基本單位稱為Wei。面額及其具體名稱見下表:
如前所述,我們知道EVM負責執行部署在其網路上的程式碼。那麼是什麼阻止某人在EVM上執行無限迴圈並完全超載其記憶體?這就是Gas的概念所在。
gas用作支付網路上的計算資源的度量。網路上的每個合約都有一套可用於計算的最大gas量。這被稱為“gas limit”其他相關gas術語如下:
- gas price:這是以太幣及其他面額等代幣的gas成本。為了穩定gas的價值,gas價格是一個浮動價值,如果代幣或貨幣的成本波動,gas價格變化以保持相同的實際價值。
- gas fee:這實際上是執行特定交易或計劃(稱為合約)所需支付的gas量。 因此,如果有人試圖執行一段永遠執行的程式碼,合約最終將超過其gas限制,並且呼叫合約的整個事務將回滾到其先前的狀態。
現在我們瞭解了貨幣,讓我們來看看產生新貨幣的過程。
以太坊教程:挖礦
與其他公共區塊鏈技術一樣,以太坊通過基於激勵的模型確保安全性。這稱為工作量證明機制。下圖顯示了以太坊採礦的工作原理:
從技術角度來看,所使用的工作量證明演算法稱為Ethash,它是一種受Dagger-Hashimoto演算法啟發的雜湊演算法。
現在我們已經看到了以太坊的工作架構並討論了它的基本元素,讓我們看看現實問題和以太坊方法來解決這個問題。
以太坊教程:去中心化中人們資金使用案例
問題陳述:一個好的“想法”並不是當今世界開展成功企業的一切。實施一個想法需要大量的資金和努力。這就是像“Kickstarter”這樣的組織進入畫面的地方。他們為專案提供捐贈所需的公眾曝光專案以使其獲得執行,但這種動機的集中式架構有其缺點,主要在於獎勵的處理方式。由於集中管理機構做出所有決策,因此係統容易出現以下規則:
- 任何錯過了廣告系列截止日期的人都無法再參與其中。
- 任何改變主意的捐助者都無法離開。
做法:
我們採用幹校的方法來解決問題,如下圖所示:
解決方案:
以下是上述問題陳述的solidity智慧合約。
pragma solidity ^0.4.16; interface token { function transfer(address receiver, uint amount); } contract Crowdsale { address public beneficiary; uint public fundingGoal; uint public amountRaised; uint public deadline; uint public price; token public tokenReward; mapping(address => uint256) public balanceOf; bool fundingGoalReached = false; bool crowdsaleClosed = false; event GoalReached(address recipient, uint totalAmountRaised); event FundTransfer(address backer, uint amount, bool isContribution); /** * Constrctor function * * Setup the owner */ function Crowdsale( address ifSuccessfulSendTo; // the address of the owner when funding is successful uint fundingGoalInEthers; // target amount to raise uint durationInMinutes; //given time uint etherCostOfEachToken; //cost of equity in ether address addressOfTokenUsedAsReward; //token address ) { beneficiary = ifSuccessfulSendTo; fundingGoal = fundingGoalInEthers * 1 ether; deadline = now + durationInMinutes * 1 minutes; price = etherCostOfEachToken * 1 ether; tokenReward = token(addressOfTokenUsedAsReward); } /** * Fallback function * * The function without name is the default function that is called whenever anyone sends funds to a contract */ function () payable { require(!crowdsaleClosed); uint amount = msg.value; balanceOf[msg.sender] += amount; amountRaised += amount; tokenReward.transfer(msg.sender, amount / price); FundTransfer(msg.sender, amount, true); } modifier afterDeadline() { if (now <= deadline) _; } /** * Check if goal was reached * * Checks if the goal or time limit has been reached and ends the campaign */ function checkGoalReached() afterDeadline { if (amountRaised >= fundingGoal){ fundingGoalReached = true; GoalReached(beneficiary, amountRaised); } crowdsaleClosed = true; } /** * Withdraw the funds * * Checks to see if goal or time limit has been reached, and if so, and the funding goal was reached, * sends the entire amount to the beneficiary. If goal was not reached, each contributor can withdraw * the amount they contributed. */ function safeWithdrawal() afterDeadline { if (!fundingGoalReached) { uint amount = balanceOf[msg.sender]; balanceOf[msg.sender] = 0; if (amount > 0) { if (msg.sender.send(amount)) { FundTransfer(msg.sender, amount, false); } else { balanceOf[msg.sender] = amount; } } } if (fundingGoalReached && beneficiary == msg.sender) { if (beneficiary.send(amountRaised)) { FundTransfer(beneficiary, amountRaised, false); } else { //If we fail to send the funds to beneficiary, unlock funders balance fundingGoalReached = false; } } } }
如果你有興趣學習solidity,請檢視我們關於Solidity Programming的部落格,該部落格用於開發個性化智慧合約。
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的互動式線上程式設計實戰教程:
- java以太坊開發教程,主要是針對java和android程式設計師進行區塊鏈以太坊開發的web3j詳解。
- php以太坊,主要是介紹使用php進行智慧合約開發互動,進行賬號建立、交易、轉賬、代幣開發以及過濾器和交易等內容。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- 以太坊入門教程,主要介紹智慧合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括賬戶管理、狀態與交易、智慧合約開發與互動、過濾器和交易等。
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智慧合約開發與部署、使用程式碼與智慧合約互動等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Java程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈儲存、去中心化共識機制、金鑰與指令碼、交易與UTXO等,同時也詳細講解如何在Php程式碼中整合比特幣支援功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解 ,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI介面、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操程式碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裡是 以太坊教程——深入瞭解以太坊!