大年初二已憋不住想寫代碼的心!來來來教你僅用15分鐘在以太坊編寫一個區塊鏈Web應用
大年初二了,程序員們該叫囂「手癢,好想寫代碼」了。
今兒,我們先來聊聊區塊鏈中炙手可熱的以太坊,這之後來點實戰演練。
truffle是以太坊最受歡迎的一個開發框架,今兒,咱們來學學如何用15分鐘用truffle來編寫一個區塊鏈Web應用。
作者 | 汪曉明
以太坊是什麼
以太坊是一個全新開放的區塊鏈平台,它允許任何人在平台中建立和使用通過區塊鏈技術運行的去中心化應用。就像比特幣一樣,以太坊不受任何人控制,也不歸任何人所有——它是一個開源項目,由全球區塊鏈愛好者共同創建。和比特幣協議有所不同的是,以太坊的設計十分靈活,極具適應性。
比特幣 vs 以太坊
如果對比特幣和以太坊,一個形象的比喻是計算器和智能手機,計算器只有一些內置的加減乘除功能,智能手機可以安裝實現各種功能的App。因此,比特幣會在金融支付等特定領域發揮價值,而以太坊可以為各行各業提供解決方案。
以太坊發展歷史回顧
2013年末以太坊創始人Vitalik Buterin第一次描述了這個項目,作為他研究比特幣的成果。不久後,Vitalik發表了以太坊白皮書,書中詳細描述了以太坊協議的技術設計和基本原理,以及智能合約的結構。2014年1月,Vitalik在美國佛羅里達州邁阿密舉行的北美比特幣會議上正式宣布了以太坊。
與此同時,Vitalik開始和Gavin Wood博士合作共同實現以太坊。2014年4月,Gavin發表了以太坊黃皮書,作為以太坊虛擬機的技術說明。按照黃皮書中的具體說明,以太坊客戶端已經有8種編程語言實現。
從2014年6月開始,以太坊藉助42天公開的以太幣預售活動對第一批以太幣進行了分配,共籌集31591個比特幣,當時價值1843萬美元,交換出大約6000萬以太幣。眾籌所得主要用於回報開發者們數月以來的努力,以及資助以太坊的持續開發。這筆資金為以太坊後續的發展提供了充足的的資金保證。
經過兩年的快速發展,在以太坊平台上創立新的應用十分簡便,隨著Homestead的發布,任何人都可以安全地使用該平台上的應用。
以太坊核心概念之虛擬機(EVM)
以太坊是可編程的區塊鏈。它並不是給用戶一系列預先設定好的操作(例如比特幣交易),而是允許用戶按照自己的意願創建複雜的操作。這樣一來,它就可以作為多種類型去中心化區塊鏈應用的平台,包括加密貨幣在內,但並不僅限於此。
以太坊狹義上是指一系列定義去中心化應用平台的協議,它的核心是以太坊虛擬機Ethereum Virtual Machine(EVM),可以執行任意複雜演算法的編碼。在計算機科學術語中,以太坊是「圖靈完備的」。開發者能夠使用現有的以JavaScript和Python等語言為模型的其他友好的編程語言,創建出在EVM上運行的應用。熟悉JVM的同學很好理解,EVM就是一個程序運行的容器。
和其他區塊鏈一樣,以太坊也有一個點對點網路協議。以太坊區塊鏈資料庫由眾多連接到網路的節點來維護和更新。每個網路節點都運行著EVM並執行相同的指令。因此,人們有時形象地稱以太坊為「世界電腦」。
以太坊如何工作?
以太坊合併了對比特幣用戶來說熟悉的特徵和技術,同時自己也進行了修正和創新。比特幣區塊鏈純粹是一個關於交易的列表,而以太坊的基礎單元是賬戶。以太坊區塊鏈跟蹤每個賬戶的狀態,所有以太坊區塊鏈上的狀態轉換都是賬戶之間價值和信息的轉移。賬戶分為兩類:
1. 外部賬戶(EOA),由私鑰控制;
2. 合約賬戶,由它們的合約編碼控制,只能由外部賬戶「激活」
對於大部分用戶來說,兩者基本的區別在於外部賬戶是由人類用戶掌控——因為他們能夠控制私鑰,進而控制外部賬戶。而合約賬戶則是由內部編碼管控。
如果他們是被人類用戶「控制」的,那也是因為程序設定它們被具有特定地址的外部賬戶控制,進而被持有私鑰控制外部賬戶的人控制著。「智能合約」這個流行的術語指的是在合約賬戶中編碼——交易被發送給該賬戶時所運行的程序。用戶可以通過在區塊鏈中部署編碼來創建新的合約。
只有當外部賬戶發出指令時,合約賬戶才會執行相應的操作。所以合約賬戶不可能自發地執行諸如任意數碼生成或應用程序界面調用等操作——只有受外部賬戶提示時,它才會做這些事。這是因為以太坊要求節點能夠與運算結果保持一致,這就要求保證嚴格確定執行。
和比特幣一樣,以太坊用戶必須向網路支付少量交易費用。這可以使以太坊區塊鏈免受無關緊要或惡意的運算任務干擾,比如分散式拒絕服務(DDoS)攻擊或無限循環 。交易的發送者必須在激活的「程序」每一步付款,包括運算和記憶儲存。費用通過以太坊自有的有價代幣,以太幣的形式支付。
交易費用由節點收集,節點使網路生效。這些「礦工」就是以太坊網路中收集、傳播、確認和執行交易的節點。礦工們將交易分組(包括許多以太坊區塊鏈中賬戶「狀態」的更新),分成的組被稱為「區塊」,礦工們會互相競爭,以使他們的區塊可以添加到下一個區塊鏈上。礦工們每挖到一個成功的區塊就會得到以太幣獎勵。這就為人們帶來了經濟激勵,促使人們為以太坊網路貢獻硬體和電力。
和比特幣網路一樣,礦工們有解決複雜數學問題的任務以便成功地「挖」到區塊,這被稱為「工作量證明(POW)」。一個運算問題如果在演算法上解決比驗證解決方法需要更多數量級的資源,那麼它就是工作證明的極佳選擇。為防止比特幣網路中已經發生的,專門硬體(例如特定用途集成電路ASIC)造成的中心化現象,以太坊選擇了難以存儲的運算問題。如果問題需要存儲器和CPU,事實上理想的硬體是普通的電腦。這就使以太坊的工作量證明具有抗特定用途集成電路性,和比特幣這種由專門硬體控制挖礦的區塊鏈相比,能夠帶來更加去中心化的安全分布。
以太坊基礎使用指南
以太坊上線之前計劃的初始開發路線圖主要有以下幾個里程碑:
1. 預發布:Olympic testnet —— 2015年5月
2. 發布第一版:Frontier —— 2015年7月30日
3. 發布第二版: Homestead —— 2016年3月14日(π日)
4. 發布第三版: Metropolis —— 預計2017年上半年
5. 發布第四版:Serenity——未知
通過本節可以獲取用戶參與以太坊項目中的基本方法。首先,要想成為網路中的節點,需要運行一個以太坊客戶端。
以太坊客戶端的選擇與安裝
為什麼有多個以太坊客戶端?
以太坊客戶端與Java虛擬機和.NET運行環境類似,能夠讓你在電腦上運行「以太坊程序」。以太坊客戶端按照書面說明(黃皮書)執行,可以彼此協作,因此,你可以使用Go、C++、Java等熟悉的語言來參與以太坊網路。
項目早期,在眾多不同的操作系統中就有多個可以彼此協作的客戶端實現,客戶端的多樣性對於整個生態系統來說是巨大的成功。它使我們能夠證明協議是明確清晰的,為後續創新打開了空間,也讓我們都保持誠實。但是對終端用戶來說,沒有通用的「以太坊安裝程序」可供他們使用,可能引起他們的困惑。
進入到Homestead階段以後,Go客戶端佔據了主導地位,但情況並不一直是這樣,將來也說不定。除了EthereumH,其他客戶端都有Homestead兼容的版本。目前有8種客戶端:C++、Go、Python、Java、JavaScript、Haskell、Rust、Ruby。
公有鏈、聯盟鏈、私有鏈
當今大多數以太坊項目都選擇了以太坊公有鏈,公有鏈可以接觸到更多用戶、網路節點、貨幣和市場。但有些領域則更偏好私有鏈或聯盟鏈(在一群值得信任的參與者中)。例如,銀行、保險領域的很多公司都希望以太坊作為他們私有鏈的平台。
三種區塊鏈在許可方面的區別:
1. 公有鏈:所有人都可以閱讀和發送交易,合法信息都會被包括在內。任何人都能參與到共識形成過程——決定在鏈條上添加什麼區塊以及現狀是怎樣的。作為中心化或准中心化信任的替代品,公有鏈受加密經濟的保護,加密經濟是經濟激勵和加密驗證的結合,用類似工作量證明或權益證明的機制,遵循的總原則是人們影響共識形成的程度與他們能夠影響的經濟資源數量成正比。這類區塊鏈通常被認為是「完全去中心化」。
2. 聯盟鏈:共識形成過程由預先選擇的一系列的節點所掌控,例如,設想一個有15個金融機構的團體,每個機構都操作一個節點,為了使區塊生效,其中的10個必須簽署那個區塊。閱讀區塊鏈的權利可能是公開的,或僅限於參與者,也有混合的路徑,比如區塊的根哈希和應用程序編程介面一起公開,使公共成員可以進行一定量的查詢,重獲一部分區塊鏈狀態的加密證明。這類區塊鏈被認為是「部分去中心化」。
3. 私有鏈:寫入許可權對一個組織保持中心化。讀許可權可能是公開的或者限制在任意程度。應用很可能包含對單個公司內部的資料庫管理,審查等,因此公共的可讀性在很多情況下根本不必要,但在另一些情況下人們又想要公共可讀性。
在未來的區塊鏈行業解決方案領域,聯盟鏈可能會扮演很重要的角色。
以太坊賬戶管理
賬戶在以太坊中發揮著中心作用。前面我們講了共有兩種賬戶類型:外部和合約賬戶。這裡重點講一下外部賬戶,以下會簡稱為賬戶。如果我們把以太坊限制為只有外部賬戶,只允許外部賬戶之間進行交易,我們就會進入到「代幣」系統,這樣就類似於一個比特幣網路。
鑰匙文件
每個賬戶都由一對鑰匙定義,一個私鑰和一個公鑰。 賬戶以地址為索引,地址由公鑰衍生而來,取公鑰的最後20個位元組。每對私鑰和地址都編碼在一個鑰匙文件里。鑰匙文件是JSON文本文件,可以用任何文本編輯器打開和瀏覽。鑰匙文件的關鍵部分是賬戶私鑰,通常用你創建帳戶時設置的密碼進行加密。鑰匙文件可以在以太坊節點數據目錄的keystore子目錄下找到,一定要確保經常給鑰匙文件備份。
創建鑰匙和創建帳戶是一樣的,在此過程中:
1. 不必告訴任何人你的操作
2. 不必和區塊鏈同步
3. 不必運行客戶端
4. 不必連接到網路
當然新賬戶不包含任何以太幣,但它將會是你的,大可放心,沒有你的鑰匙和密碼,沒有人能進入。轉移備份整個目錄或任何以太坊節點之間的個人鑰匙文件都是安全的。
創建賬號
使用geth account new
一旦安裝了geth客戶端,創建賬號就只在終端執行 geth account new指令就可以了。
注意不必運行geth客戶端或者和區塊鏈同步來使用geth account指令。
$ geth account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase:
Repeat Passphrase:
Address:
警告:記住密碼並「備份鑰匙文件」。你必須同時有鑰匙文件和密碼才能從賬號發送交易,包括發送以太幣。確保鑰匙文件有個備份並牢記密碼,儘可能安全地存儲它們。如果鑰匙文件丟失或忘記密碼,就會丟失所有的以太幣。沒有密碼不可能進入賬號,也沒有忘記密碼選項,所以一定不要忘記密碼。
要列出目前在你的keystore文件夾中的鑰匙文件的所有賬號,使用geth account指令的list子指令:
$ geth account list
account #0:
account #1:
account #2:
使用geth控制台
也可以通過控制台創建新賬號,我們必須先在控制台模式開啟geth
> geth console 2>> file_to_log_output
控制台使你能夠通過發出指令與本地節點互相作用。比如,試一下這個列出賬號的指令:
> eth.accounts
{
code: -32000,
message: "no keys in store"
}
這就表明你沒有賬號。你可以從控制台創建一個賬號:
> personal.newAccount()
Passphrase:
Repeat passphrase:
我們剛剛創建了第一個賬號。如果再次試著列出賬號,就可以看到新創建的賬號了。
> eth.accounts
案例演示:通過命令行做轉賬操作
安裝完以太坊客戶端,就可以使用命令了,以Go語言客戶端為例。
查看幫助命令:
geth –h
列出賬戶:
geth account list
指定目錄啟動一個節點:
geth --datadir "~/ethdev" —dev
進入控制台:
geth --dev console 2>> file_to_log_output
列出賬戶:
> eth.accounts
指定密碼為123456,創建一個賬戶
> personal.newAccount("123456")
> eth.accounts
創建第二個賬戶
> personal.newAccount("123456")
> eth.accounts
取出第一個賬戶,賦值給user1
> user1 = eth.accounts[0]
取出第二個賬戶,賦值給user2
> user2 = eth.accounts[1]
查看user1初始餘額
> eth.getBalance(user1)
查看user2初始餘額
> eth.getBalance(user2)
查看當前區塊號
> eth.blockNumber
啟動挖礦
> miner.start()
查看當前區塊號
> eth.blockNumber
查看user1當前餘額
eth.getBalance(user1)
查看user2當前餘額
eth.getBalance(user2)
停止挖礦
> miner.stop()
查看當前區塊號
> eth.blockNumber
user1轉賬給user2(會報錯,請看下一步)
> eth.sendTransaction()
轉賬涉及到資金支出,需要提供密碼解鎖轉出賬戶
> personal.unlockAccount(user1, "123456」)
重新執行轉賬操作:
> eth.sendTransaction()
轉賬成功以後,查看user1和user2餘額
> eth.getBalance(user1)
> eth.getBalance(user2)
好了,一個完整的命令行轉賬功能就完成了。
15分鐘編寫一個區塊鏈Web應用:truffle開發入門
以太坊是區塊鏈開發領域最好的編程平台,而truffle是以太坊最受歡迎的一個開發框架。實戰是最重要的事情,這一節不講原理,只搭建環境,並運行一個區塊鏈程序。
【安裝truffle】
$ npm install -g truffle
【依賴環境】
訪問https://nodejs.org 官方網站下載安裝NodeJS
推薦Mac OS 系統,不建議使用Windows,會碰到各種各樣的問題,導致放棄。
需要安裝Ethereum客戶端來支持JSON RPC API調用開發環境,推薦使用EthereumJS TestRPC: https://github.com/ethereumjs/testrpc
安裝命令:
$ npm install -g ethereumjs-testrpc
【新建第一個項目】
$ mkdir zhaoxi
$ cd zhaoxi
$ truffle init
默認會生成一個MetaCoin的demo,可以從這個demo中學習truffle的架構
項目一級目錄結構如下:
/Users/bob/workspace/zhaoxi/
app/
contracts/
migrations/
test/
truffle.js
項目所有文件目錄如下:
/Users/bob/workspace/zhaoxi/
app/
images/
javascripts/
app.js
stylesheets/
app.css
index.html
contracts/
ConvertLib.sol
MetaCoin.sol
Migrations.sol
migrations/
1_initial_migration.js
2_deploy_contracts.js
test/
metacoin.js
truffle.js
【編譯項目】
$ truffle compile
bob@192 zhaoxi % truffle compile
Compiling ConvertLib.sol...
Compiling MetaCoin.sol...
Compiling Migrations.sol...
Writing artifacts to ./build/contracts
【部署項目】
部署之前先啟動TestRPC
$ testrpc
$ truffle deploy
bob@192 zhaoxi % truffle migrate
Running migration: 1_initial_migration.js
Deploying Migrations...
Migrations: 0x43d6a4e2196dcc73fe146edc73d2ebd8f15b5a7a
Saving successful migration to network...
Saving artifacts...
Running migration: 2_deploy_contracts.js
Deploying ConvertLib...
Linking ConvertLib to MetaCoin
Deploying MetaCoin...
MetaCoin: 0xd90058c2b73fa50403b1368d2f48c601576b8b40
Saving successful migration to network...
Saving artifacts...
【啟動服務】
$ truffle serve
啟動服務後,可以在瀏覽器訪問項目:
http://localhost:8080/ ,網頁界面如圖1所示。
圖1 網頁服務界面
好了,第一個Web區塊鏈程序跑起來了,後面可以不斷地實踐深入學習了。
【參考資料】
以太坊官方網站:https://ethereum.org/
汪曉明的博客:http://wangxiaoming.com/
以太坊開發視頻:http://ethcast.com/
以太坊愛好者:http://ethfans.org/
作者簡介:汪曉明,朝夕網路創始人,前Beltal CTO。十年互聯網產品技術經驗,區塊鏈、以太坊早期的探索者,目前致力於培養區塊鏈技術人才,推動區塊鏈應用的落地。維護著區塊鏈技術開發視頻網站(EthCast.com)。


※OKcoin創始人徐明星發飆了!怒斥神奇少女王凱馨:「典型的詐騙,請大家立即報警」
※比特幣跌破9000美元;工信部發布《區塊鏈數據格式規範》;迅雷ICO在美遭集體訴訟;歐盟啟動新機制「擁抱」區塊鏈
TAG:區塊鏈大本營 |