談起這幾年最熱的技術,必定少不了區塊鏈。按說新技術的出現本是稀鬆日常的事情,但區塊鏈的出現和發展,卻有那麼一點讓人不淡定:程序員
其一,區塊鏈的表明應用比特幣,其 價格在這七八年間翻了上百萬 倍。2010年有人花10000個比特幣買了兩塊披薩,在比特幣最高價位時,這兩塊披薩至關於近兩億美圓。算法
其二,由於區塊鏈項目的大熱,相關從業人員的需求激增, 崗位薪資也水漲船高 ,讓一衆程序員們蠢蠢欲動。編程
正所謂人紅是非多,關於區塊鏈以及數字貨幣的爭論一直不斷。支持者認爲區塊鏈將會是有一項 改變世界 的新技術,而反對者則認爲它不過是又一個更高級的 龐氏騙局 罷了。網絡
我以爲,對於一個新興事物,不必過早地下結論。尤爲在還不瞭解它的狀況下,就憑本身的固有觀念來站隊打標籤,這是很不明智的。分佈式
因而,和大家學習Python同樣,我也在不斷學習新的技術,而區塊鏈就是我最近關注較多的一項。在這裏分享下我對區塊鏈的一些認識和理解。函數
說區塊鏈就不能不說比特幣。它們好像雞和蛋的關係: 區塊鏈是比特幣的技術基礎,但區塊鏈的相關研究倒是由比特幣開始 。學習
比特幣的特殊之處在於,它經過區塊鏈實現了一種新的 記帳方式 :除了創世區塊外,每一個帳本(區塊)都記錄了上一個帳本的 特徵信息 (哈希值),一個個帳本構成了一整個鏈條。同時這個鏈條存在於整個網絡的每一個人手上。這樣一來,若是要修改已有的數據,就會致使後續帳本上的信息都不對了。若是你想對之前的一筆交易動手腳,則必須把後續帳本上的記錄都修改掉,並獲得其餘人的承認。區塊鏈
而比特幣的另外一項設計,就是每一個帳本上必須附帶一個特殊的數字,這個數字的特色是難以計算但很容易驗證。計算這個數字的過程就是咱們常聽到的「挖礦」。因此挖礦並非指挖比特幣,而是爲了記帳。只不過對於成功算出數字的人,會給予必定比特幣的獎勵。這個精妙的設計,使得前面說的篡改記錄變得不可能—你沒法擁有足夠的計算能力去修改這些帳本,這保證了整個鏈條的可信。spa
上圖是 哈希算法 的示意圖。假設咱們想找到一個數字,使它加上帳本上的信息,能知足算出的哈希值以4個0開頭,是很是耗時的(挖礦);但若是給定了數據,驗證它的哈希值是否以4個0開頭,則很是容易(驗證)。設計
比特幣沒有咱們一般意義的帳戶,它的帳本上的內容是一條條 轉帳記錄 ,收款人是一個個 數字地址 。除了持有地址對應口令的人以外,沒法知道這些地址的主人是誰。所以比特幣交易從技術上是 匿名的 。只要你有口令,你就能轉走裏面的比特幣。丟了口令,你的幣就再也找不回來了。
綜上, 比特幣提供了一種去中心化的、不可篡改的、匿名的記帳方式 (而並不是一種以實體存在的「幣」,即使在網絡上,也沒有「一個比特幣」)。而逐漸人們又發現,比特幣背後的區塊鏈蘊含着更大的想象空間。
以太坊 就是 區塊鏈 的另外一個熱門應用。它最大的優點是提供了「 智能合約 」。若是說,比特幣解決了交易記錄的可靠性問題,那麼智能合約就更進一步,避免了賴帳的問題。
智能合約至關於一段代碼,它能夠像交易記錄同樣被添加到區塊鏈上,又能夠 在條件知足時被觸發執行 。這從技術上解決了交易雙方的信任問題,提供了點對點的合約,沒有中間商賺差價。以太坊也再也不是一個單純的帳本,而成爲一個去中心化的應用平臺。在這個平臺之上,開發能夠構建更加複雜分佈式應用,無需自行實現便可擁有區塊鏈的功能。
從程序員的視角來看,以太坊是一個 虛擬機 。在這個虛擬機之上,咱們能夠用代碼開發本身程序(智能合約)。寫好的程序被上傳到區塊鏈上,等待條件觸發執行。前面說過,區塊鏈的產生是須要有人來計算的,所以在以太坊 部署和執行代碼須要支付費用(以太幣) ,以維持這個系統。
以太坊使用的開發語言叫 Solidity ,它與 JavaScript 相似,也借鑑了 C++ 和 Python。它因以太坊而生,所以是面向合約的,並自帶支付功能。我們做爲一個編程類的乾貨公衆號,此處必須得來一段代碼了。
Talk is cheap. Show me the code.
寫一個 Solidity 的 HelloWorld 並不難。咱們在官方文檔的例子上稍做修改:
pragma solidity ^0.4.10; contract HelloWorld { string greeting; function set(string s) public { greeting = s; } function get() public constant returns (string) { return greeting; } }
這是一段很基礎的面向對象代碼, 合約(contract) HelloWorld 有一個變量 greeting,get/set 兩個方法分別獲取和修改這個變量。第一行 pragma 則是指明使用的 solidity 版本。
要執行這段代碼,可使用在線開發環境 remix.ethereum.org。將代碼複製到編輯區,點擊「 Compile 」-「 Start to compile 」,就獲得了編譯好的可執行代碼。
在「 Run 」頁面,選擇「 JavaScript VM 」做爲環境。 Account 中,已經爲咱們準備好了幾個餘額(以太幣)充足的帳號。點擊「 Create 」,合約就被部署到了區塊鏈上,而相應的帳號也被扣去部署費用。同時,下方出現咱們定義的 set/get 方法。
在「Set」後面的框裏輸入 "Hello World, Crossin" (同py2同樣,別少了英文引號),點擊「Set」,帳號再次被扣去執行的費用。從控制檯能夠看到合約執行的詳細信息。
點擊「Get」,則會看到咱們剛剛寫入的 Hello World, Crossin 。由於 Get 定義的是 常函數(constant) ,不會修改區塊鏈中的數據,所以不消耗費用。
這就是用 solidity 實現的一個最簡單的智能合約。
看到這裏,你是否對區塊鏈有了更多的認識?
但所謂術業有專攻,在區塊鏈領域,我也只是一個學習者。理解上如有誤差,歡迎你們留言指正和討論。
════
其餘文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | Python單詞表
歡迎關注: Crossin的編程教室