最新內容會更新在主站深入淺出區塊鏈社區
原文鏈接:Web3與智能合約交互實戰
寫在前面
在最初學習以太坊的時候,很多人都是自己創建以太坊節點后,使用geth與之交互。這種使用命令行交互的方法雖然讓很多程序員感到興奮(黑客帝國的既視感?),但不可能指望普通用戶通過命令行使用Dapp。因此,我們需要一種友好的方式(比如一個web頁面)來與智能合約交互,于是問題的答案就是web3.js
。
Web3.js
Web3.js是以太坊官方的Javascript API,可以幫助智能合約開發者使用HTTP或者IPC與本地的或者遠程的以太坊節點交互。實際上就是一個庫的集合,主要包括下面幾個庫:
web3-eth
用來與以太坊區塊鏈和智能合約交互web3-shh
用來控制whisper協議與p2p通信以及廣播web3-bzz
用來與swarm協議交互web3-utils
包含了一些Dapp開發有用的功能
Web3與geth通信使用的是 JSON-RPC ,這是一種輕量級的RPC(Remote Procedure Call)協議,整個通信的模型可以抽象為下圖。

搭建測試鏈
在開發初期,我們并沒有必要使用真實的公鏈,為了開發效率,一般選擇在本地搭建測試鏈。在本文我們選擇的Ganache(在此之前使用的是testrpc,Ganache屬于它的升級版),一個圖形化測試軟件(也有命令行版本),可以一鍵在本地搭建以太坊區塊鏈測試環境,并且將區塊鏈的狀態通過圖形界面顯示出來,Ganache的運行界面如下圖所示。

從圖中可以看到Ganache會默認創建10個賬戶,監聽地址是http://127.0.0.1:7545
,可以實時看到Current Block
、Gas Price
、Gas Limit
等信息。
創建智能合約
目前以太坊官方全力支持的智能合約開發環境是Remix IDE,我們在合約編輯頁面編寫如下代碼:
pragma solidity ^0.4.21; contract InfoContract { string fName; uint age; function setInfo(string _fName, uint _age) public { fName = _fName; age = _age; } function getInfo() public constant returns (string, uint) { return (fName, age); } }
代碼很簡單,就是簡單的給name
和age
變量賦值與讀取,接下來切換到 run 的 tab 下,將Environment
切換成Web3 Provider
,并輸入我們的測試鏈的地址http://127.0.0.1:7545
,這里對這三個選項做一簡單說明:
Javascript VM
:簡單的Javascript虛擬機環境,純粹練習智能合約編寫的時候可以選擇Injected Web3
:連接到嵌入到頁面的Web3,比如連接到MetaMaskWeb3 Provider
:連接到自定義的節點,如私有的測試網絡。
如果連接成功,那么在下面的Account
的選項會默認選擇 Ganache 創建的第一個賬戶地址。接下來我們點擊Create
就會將我們的智能合約部署到我們的測試網中。接下來 Remix 的頁面不要關閉,在后面編寫前端代碼時還要用到合約的地址以及ABI
信息。
安裝Web3
在這之前,先在終端創建我們的項目:
> mkdir info > cd info
接下來使用 node.js 的包管理工具 npm 初始化項目,創建package.json
文件,其中保存了項目需要的相關依賴環境。
> npm init
一路按回車直到項目創建完成。最后,運行下面命令安裝web.js:
> npm install web3
注意: 在實際安裝過程中我發現web3在安裝完成后并沒有 /node_modules/web3/dist/we3.min.js
文件,這個問題在 issue#1041中有體現,但官方好像一直沒解決。不過可以在這里下載所需的文件,解壓后將dist
文件夾的內容拷貝到 /node_modules/web3
路徑下。
創建 UI
在項目目錄下創建index.html
,在這里我們將創建基礎的 UI,功能包括name
和age
的輸入框,以及一個按鈕,這些將通過 jQuery 實現:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" type="text/css" href="main.css"> <script src="./node_modules/web3/dist/web3.min.js"></script> </head> <body> <div class="container"> <h1>Info Contract</h1> <h2 id="info"></h2> <label for="name" class="col-lg-2 control-label">Name</label> <input id="name" type="text"> <label for="name" class="col-lg-2 control-label">Age</label> <input id="age" type="text"> <button id="button">Update Info</button> </div> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script> <script> // Our future code here.. </script> </body> </html>
接下來需要編寫main.css
文件設定基本的樣式:
body { background-color:#F0F0F0; padding: 2em; font-family: 'Raleway','Source Sans Pro', 'Arial'; } .container { width: 50%; margin: 0 auto; } label { display:block; margin-bottom:10px; } input { padding:10px; width: 50%; margin-bottom: 1em; } button { margin: 2em 0; padding: 1em 4em; display:block; } #info { padding:1em; background-color:#fff; margin: 1em 0; }
使用Web3與智能合約交互
UI 創建好之后,在<script>
標簽中間編寫web.js
的代碼與智能合約交互。首先創建web3
實例,并與我們的測試環境連接:
<script> if (typeof web3 !== 'undefined') { web3 = new Web3(web3.currentProvider); } else { // set the provider you want from Web3.providers web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545")); } </script>
這段代碼是web3.js Github提供的樣例,意思是如果web3
已經被定義,那么就可以直接當作我們的 provider 使用。如果沒有定義,則我們手動指定 provider。
這里可能會存在疑問:為什么 web3 會被事先定義呢?實際上,如果你使用類似 MetaMask(一個 Chrome 上的插件,迷你型以太坊錢包)這樣的軟件,provider 就會被自動植入。
在上面代碼的基礎上,接下來設置默認的以太坊賬戶:
web3.eth.defaultAccount = web3.eth.accounts[0];
在上文中我們使用 Ganache 已經創建了 10 個賬戶了,這里我們選擇第一個賬戶當作默認賬戶。
接下來需要讓我們的web3
知道我們的合約是什么樣的,這里需要用到合約的 ABI(Application Binary Interface)。ABI
可以使我們調用合約的函數,并且從合約中獲取數據。
在上文中我們已經在 Remix 中創建了我們的合約,這時重新回到 Remix,在 Compile 的 tab 下我們點擊Details
出現的頁面中我們可以拷貝合約的ABI
,如下圖所示。

將其復制到代碼中:
var infoContract = web3.eth.contract(PASTE ABI HERE!);
接下來轉到 run 的tab,拷貝合約的地址,將其復制到下面的代碼中:
var info = InfoContract.at('PASTE CONTRACT ADDRESS HERE');
完成這些我們就可以調用合約中的函數了,下面我們使用 jQuery 與我們的合約進行交互:
info.getInfo(function(error, result){ if(!error) { $("#info").html(result[0]+' ('+result[1]+' years old)'); console.log(result); } else console.error(error); }); $("#button").click(function() { info.setInfo($("#name").val(), $("#age").val()); });
以上的代碼就簡單地實現了對合約中兩個函數的調用,分別讀取和顯示name
和age
變量。
到此我們就完成了全部的代碼,完整代碼可以在 InfoContract 中找到。在瀏覽器中打開index.html
測試效果如下圖(輸入名字和年齡后刷新)。

本文的作者是蓋蓋,他的微信公眾號: chainlab
參考文獻
☛ 深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。
第一步 安裝geth
下載地址:https://ethereum.github.io/go-ethereum/downloads/
點擊安裝勾選development tools

第二步 創建您的帳戶
在當前文件夾下創建node1文件夾
創建一個賬戶(也稱為錢包)
Devnet $ geth --datadir node1/ account new
Your new account is locked with a password. Please give a password. Do not forget this password.
Passphrase: 輸入你的密碼
Repeat passphrase: 確認你的密碼
Address: {08a58f09194e403d02a1928a7bf78646cfc260b0}
第三步 geth命令創建您的Genesis文件
生成的文件是用于初始化區塊鏈的文件。第一個塊叫做創世塊,是根據genesis.json文件中的參數生成的。
Geth安裝后目錄下有很多可執行文件如puppeth或bootnode。你可以在Geth github上找到完整的列表。
Puppeth可以創建創世區塊的json文件。
開始使用Puppeth:
1、win鍵 + r 進入cmd命令行,進入到安裝geth的文件夾執行 puppeth 然后順序執行下面操作
2、Please specify a network name to administer (no spaces, please)
> devnet
(這里隨便填寫一個網絡管理名稱即可,如有需要后面可以通過--network重新設置)
What would you like to do? (default = stats)
1. Show network stats
2. Configure new genesis
3. Track new remote server
4. Deploy network components
> 2
(這里選擇2,回車,配置新的創世區塊)
3、Which consensus engine to use? (default = clique)
1. Ethash - proof-of-work
2. Clique - proof-of-authorit
> 1
(這里選擇pow共識機制)
4、Which accounts should be pre-funded? (advisable at least one)
> 0x1234567890123456789012345678901234567890
(這個是設置預分配以太坊的賬戶,建議設置一個有私鑰的地址可以后面測試使用,設置好后再按一次回車)
5、Specify your chain/network ID if you want an explicit one (default = random)
> 666
(這里就是鏈的chainId,可以隨意輸入也可以不輸直接回車默認隨機數字)
6、What would you like to do? (default = stats)
- Show network stats
- Manage existing genesis
- Track new remote server
- Deploy network components
> 2
(管理已擁有的創世塊)
7、 1. Modify existing fork rules
2. Export genesis configuration
3. Remove genesis configuration
> 2
(選擇導出創世配置)
8、Which file to save the genesis into? (default = devnet.json)
> ./genesis.json
(導出的路徑及文件名)
OK,到這里創世json文件創建完成了
第四步 geth命令初始化節點
現在我們有了這個genesis.json文件,可以初始化創世塊了!
進入到geth安裝文件夾下執行
geth --datadir node1/ init genesis.json
第五步 bootnode命令操作
bootnode唯一的目的是幫助節點發現彼此(記住,以太坊區塊鏈是一個對等網絡)
初始化 bootnode
bootnode -genkey boot.Key
啟動bootnode服務
bootnode -nodekey boot.key -addr:30310
隨意使用任何您喜歡的端口,但請避免使用主流端口(例如HTTP)。30303用于公共以太坊網絡。
第六步 geth命令啟動節點
geth --datadir .\node1\ --syncmode 'full' --port 30311 --rpc --rpcaddr '127.0.0.1' --rpcport 8501 --rpcapi 'personal,db,eth,net,web3,txpool,miner' --bootnodes 'enode://ca88962dbcc8eb0c7587789866f21db68cdf32ad1ea890fe0d9f8fe010f7e9afe2e6a88d5c9d418be61a10b8a31b1e7c55213bb426dab91596ae36bd7d559333@127.0.0.1:30310' --networkid 666
參數解釋:
--syncmode 'full' 有助于防止錯誤丟棄錯誤的傳播塊。
--port 是node1的端口
--rpcapi 允許RPC調用的模塊
--bootnodes 要連接的bootnode
--networkId genesis.json文件中的chainId
第七步 與您的節點進行交互
通過RPC方式
$ cd devnet
devnet$ geth attach 'http://localhost:8501'
Welcome to the Geth JavaScript console!
instance: Geth/v1.7.3-stable-4bb3c89d/linux-amd64/go1.9
coinbase: 0x87366ef81db496edd0ea2055ca605e8686eec1e6
at block: 945 (Sat, 10 Feb 2018 21:16:14 CET)
modules: eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
使用Geth控制臺
>net.version
"1515"
> eth.blockNumber
1910
> eth.coinbase
"0x87366ef81db496edd0ea2055ca605e8686eec1e6"
> eth.sendTransaction({'from':eth.coinbase, 'to':'0x08a58f09194e403d02a1928a7bf78646cfc260b0', 'value':web3.toWei(3, 'ether')})
"0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f"
>eth.getTransactionReceipt("0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f")
{
blockHash: "0x212fb593980bd42fcaf3f6d1e6db2dd86d3764df8cac2d90408f481ae7830de8",
blockNumber: 2079,
contractAddress: null,
cumulativeGasUsed: 21000,
from: "0x87366ef81db496edd0ea2055ca605e8686eec1e6",
gasUsed: 21000,
logs: [],
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
status: "0x1",
to: "0x08a58f09194e403d02a1928a7bf78646cfc260b0",
transactionHash: "0x299a99baa1b39bdee5f02e3c660e19e744f81c2e886b5fc24aa83f92fe100d3f",
transactionIndex: 0
}
> exit
(退出)
來自:https://www.haowenbo.com/articles/2019/07/24/1563963176492.html
過去一年的熱門話題沒有什么比區塊鏈技術更火了,但這里面有太多被神話、誤解的地方,本文就詳細從技術層面、極客思維方式(哲學)、社會學和經濟學等多個維度的分析,來洞悉區塊鏈技術的背后真相。
下筆之前我幾乎看過了所有主流媒體上的各種區塊鏈文章,但我覺得沒有一篇寫的通俗易懂又全面。本文以論文的方式來闡述,雖然較長(可能閱讀要花15分鐘以上),不過看完后基本就能明白區塊鏈怎么回事,特別是對到底是不是應該去投資虛擬貨幣會有更清晰的認識。

01 區塊鏈技術分析
本節以比特幣為例來說明區塊鏈技術,如果你對技術不感興趣,直接跳到02章節繼續閱讀,只需要知道結論:區塊鏈就是用來實現一個虛擬貨幣記帳本,擁有比特幣就是在這個帳本里面擁有區塊里面的若干條數據記錄。
1.1 問題
現在的區塊鏈可能出了很多衍生的所謂新技術架構,但最終還是離不開那個不可修改的區塊結構設計,所以這一節就以比特幣來說明這些底層技術架構??赐赀@節,至少你能夠解決以下疑惑:
用普通話和別人講清楚比特幣的底層技術架構是什么?區塊鏈是一種最近才被發明出來的新技術嗎?
挖礦是怎么一回事?
比特幣的交易過程如何?
比特幣錢包和比特幣是什么關系?
1.2 計算機不是前沿科學
這有一個打假重要法則,鼓吹任何形式的單純的計算機技術多么神奇的文章,都要打一個大大的問號。
現在所有計算機都是圖靈機,而圖靈提出圖靈機的論文都快100來年了。計算機領域不是所謂前沿科學,而是一種能大幅提高人們工作效率的工具。所以在信息領域,把從業人員也稱為軟件工程師、硬件工程師、IOS開發工程師和測試工程師等等。
目前區塊鏈技術和人工智能這二項技術已經被專家們吹到天上去了,我今天就先把區塊鏈這層皮高科技的皮給扒了,以后有機會我再扒人工智能的。
其實不管哪種計算機領域的技術都由二樣東西組成:數據 和 算法。
就拿人工智能來說,其實就是統計學在計算機的應用,吹的神乎其神的阿發狗在原理上其實就是蒙特卡洛樹 + 基于貝葉斯網絡的DeepMind,不過DeepMind取了個很牛的名字叫神經網絡。
當然知道原理和能做出來是完全不一樣的,和很多工程建設一樣,需要對應的很多基礎平臺和優秀的工程師,但歸根結底是一個工程問題,不是科學問題。
舉這個例子只是想說明,沒有必要去神話一項軟件技術,計算機領域和很多傳統的行業一樣都是工程問題,甚至可能在工程管理水平上面還不如高鐵和大型橋梁建設。
1.3 比特幣的數據結構
比特幣底層數據結構非常簡單,是只要學過一點點計算機的人都懂的鏈表,特殊在用算法實現了不可修改只能往后追加。塊與塊之前就是鏈表結構,塊內部是一個特殊的二叉樹(Merlin Tree)結構,存了交易的流水信息。至于每一塊里面的具體數據結構細節非專業人員都不要去了解,只要知道想要修改區塊的數據非常的難,因為中本聰設計的非常巧妙,想要修改塊的內容,要將從此塊之后所有的內容全部進行修改。
至于如何做是如何做到的,防止被修改,我在下一節的算法中會詳細介紹。

?。▍^塊鏈數據結構還有NextHash沒有在圖上畫出來)
看到這個表結構,如果你產生一個疑問,鏈條總歸要有開始吧?這個問題非常好,我開始也產生過這個問題。中本聰的解決方案是在程序內部內置了一個創世塊,中本聰本人就是創造比特幣的上帝,然后啟動后只要還有一臺計算機在運行這個程序,塊的生成就不會結束。
還有另一個分布式數據保存特性,也讓修改數據變得幾乎不可能,因為這個數據不光存在某一個人的機器上的,保存在很多臺的機器上,這個應該成為了比特幣故事最大的亮點。
但其實物極必反,在選擇了開放和安全外,必然犧牲效率。因為在比特幣里面不能直接查詢余額的,你只能順著鏈條從頭開始查找所有交易記錄,然后再進行加減計算,得到你當前的余額,這就讓比特幣的效率不可能高。
只要知道區塊ID,很多網站都是可以查對應區塊的信息的,因為數據是公開的嗎。具體我查了一下,btc.com這個礦池其中一個ID的余額,不少有1534呢。
https://blockchain.info/address/1C1mCxRukix1KfegAY5zQQJV7samAciZpv
1.4 基于區塊鏈的文本編輯器
這里用一個比喻就能講明白這個結構的特點了,好比A君用Word在寫一份文檔,每輸入的一個字都要同步給P2P網絡上的所有結點,增加也好刪除也好都要上傳,然后文章的最終稿是不直接保存的,就相當不能直接查詢余額。要得到A君的文章也很簡單,把A君所有的操作全部找出來執行一次就是最終的結果了。
網絡上當然同時也有B君,C君在輸入,還是那個鏈式結構,按先后順序按:誰操作 + 操作內容,依次首尾相連串好。如果你想做區塊鏈創業,用這個區塊鏈的文本編輯器寫個計劃書,制作一個區塊鏈編輯器,將作者的寫作過程全程記錄,說不定也能搞到融資,各位隨意拿走不用算我發明。
當然比特幣的區塊鏈是虛擬幣交易,顯然不能是個人單獨行為,得按交易的形式出現,理解也簡單,就是被執行的主體是多個對象,按交易規則來進行就可以,這個我放到交易里面來詳細說明。
那區塊鏈是如何保證安全的呢?這就要看下一小節的算法部分。
1.5 算法
用到的算法也沒有特別高深的算法,就二個算法:橢圓曲線加密算法和哈希算法。這二個算法一直在互聯網上被廣泛使用,幾乎所有的語言都有函數庫都有。
二種算法的原理網上非常多,這里只介紹作用,第一種非對稱加密,這個算法有下面這種能力。
公開公鑰(Public Key),自己保存私鑰(Private Key),只有私鑰加密過的內容才能被公鑰打開。
用普通話打個形象的比喻,我給你一把鑰匙,然后讓你開鎖,這把鑰匙能打開的鎖就是我造出來的,而且只有我才能造出來。和我們平時的生活習慣有點不一樣對,這個算法的學名叫:橢圓曲線加密算法。
在區塊鏈里面,公鑰字符串就是比特幣帳戶,長這個樣子(Base58編碼過):1C1mCxRukix1KfegAY5zQQJV7samAciZpv 。
還有另一個叫哈希算法,這個算法有三個特性:
1、輸入的值差別很小,但輸出卻完全不一樣。
2、不管輸入多少位,輸出的位置能固定。
3、知道輸出,很難還原輸入。(有中國數學家曾經研究過如何求解輸入,但256位的計算量太大)
有個網站可以試:Lhttps://www.md5hashgenerator.com/ 。比如我MikeZhou和MikeZhou1只差一個數字,但結果完全不同。大家可以上這個網站自己嘗試。
MD5(MikeZhou)=cb19e9b0b3cb8a8e5126677dbe1dbad5
MD5(MikZhou1)=48cc0cd823192ea7bd0aa5f1e60cfdf0
MD5是Hash算法一種,而比特幣用了Double-Hash,就是連續二次SHA的哈希(叫 SHA256d),就是要防止暴力破解求解輸入。
好了,有了數據結構和算法的基本,我們就很容易講清楚挖礦的過程。
1.6 挖礦過程
挖礦其實就是一直在做非常無聊但很有難度的事情,這是中本聰精通博弈論的地方了,這個設計讓比特幣幾乎可以永遠的活下去。
挖礦其實就是大家事先約定的一個猜迷游戲。謎底規則大家事先約定,就是不停的試一串特殊的Hash值,加入的計算的人越多,就就越特殊越難找到。
這里我們要知道的就是:
1、規則大家都知道。
2、誰也不能提前開始,大家開始時間一致。
3、沒有投機取巧的辦法,只能硬算。
4、贏者通吃。

然后就是比誰算的快還有運氣好,然后誰先算出來,直接廣播給所有的結點,所有結點一驗算符合規則,就不再算這一塊的了。
贏的ID將得到:
1、系統約定好的獎勵的特定數量比特幣(最開始是50,目前是12.5,每4年減半);
2、所有在交易內的交易費用。
與之相應的義務:
1、負責寫入生成的當前塊。按比特幣的規則約定,先算出來的人才能發起寫入指令。
因為有交易費用存在,所以礦工們肯定要按正常規則來操作,因為錯誤的東西本身不會被其它結點執行,而且還白白損失交易費用的。
中本聰在這一塊的設計可以堪稱是天才設計,當挖的人多了的時候,計算難度就會自動加大,對比下面的圖一張2009年的,還有一張是今年的,你發現差了好多個0,對這就是難度增加導致。因為上帝當年設計的規則是,要讓SHA256d(時間,上一塊Hash,隨機數)的結果要符合規定個0開頭才行,如果說生成的數字是隨機的。
概率 = (1/16) ^ N 【其中N = 要求0的個數】
2009年的數據是8個0

2018年2月的數據是18個0
那么現在挖礦的難度是當年比特幣新出來的時候約1,099,511,627,776倍,當然這里面有技術進步的因素,從CPU到GPU,再到FPGA,到現在的ASIC,ASIC也不斷從60nm到現在的14nm,越來越快。
而這也是比特幣一直被詬病的地方,空轉消耗大量的電力,1800萬Th/s,按現在最新型的機器礦機規格:消耗2度電/小時產生13.5Th/s算力來算。
年耗電量 = 1800萬 / 13.5 * 2 千瓦時/小時 * 24 小時 * 365天 = 233.6 億度。
而且我是按最新的節能型的機器計算的,還沒有計算機房制冷消耗,所以整個電力算下來,基本相當半個三峽的發電量。
下面是一張總體的算力圖,一直在增加,這也從側面說明在當前比特幣價值情況下,礦工的經濟收益為正,礦機之前賣脫銷也是因為這個原因導致。

當然大家知道贏者通吃的規則后,那么這樣的話,大家的收益不就是波動很大嗎?有人投入了幾千萬在這里面,為了投資回報的穩定,所以就是礦池的產生,就是大家組團來挖,挖好了按一個約定好的規則來分幣。
下面就是一個算力的分布圖,可以看出前3家的占比超過60%了。

1.7 交易過程
這里單純以比特幣的交易來說明區塊鏈的交易過程,不涉及商業上的交易(錢的交換)。
比特幣的交易,有了上面數據結果和算法基本就非常安全了。鏈表結構和算法就是構建一個受大家共同監督安全的不可逆的數據流,基本如下圖所示,小k到大K橢圓加密不可逆,大K到A的SHA256d的也不可逆,雙重保證,基本在現有的計算機構架下是破解是不可能的。
就算哪天有一個礦池擁有了51%的算力資源,最多有可能壟斷挖礦的權利(這是有可能的,后面經濟分析詳細說明),不可能來任意修改數據,這樣就完全不是比特幣了,失去了最初的意義,也就會變成一文不值。
當然為了進一步安全,中本聰在設計之初還制訂了很多其它細的規則,比如:
1、礦工剛挖出來的礦是不能馬上交易,因為離當前塊越遠的數據越安全。
2、利用交易費來調節,優先早生成和交易的比特幣交易。

有了上面的基礎那么交易過程就變得非常簡單,交易中有以下參與方:
1、剛才猜出謎底的礦工:負責校驗交易和寫入交易,并收取交易費。
2、其它分步式結點:負責同步和確認交易正確性。
3、出售方:提供自己的私鑰加密的數據,用私鑰就證明了是擁有方發起的交易。
4、接受方:產生和自己關聯的收入交易記錄。

歸根結底,這么多操作就是往區塊中填入數據,不涉及任何商品和錢的交易,貨幣交易是區塊鏈在虛擬貨幣交易所的衍生交易。暫且記住這個結論,后面經濟分析時使用。
比特的區塊鏈交易 ≠ 貨幣交易
當然實際的流程控制比這個復雜,因為比特幣過于火爆,而開放的分布式天然并發又不夠。所以礦工們研發了交易池,算是BIP計劃的一部分吧。相當去醫院看病,醫生數量有限,病人多,大家先全在大廳等著,然后醫院結合看病時長和給的診療費來計算先給誰看。
這里比喻的看病時長,交易費由交易方在交易前自己輸入,交易“稱重公式
= 148 * number_of_inputs + 34 * number_of_outputs + 10
1.8 比特幣錢包
有了上面的介紹,一句話就能講清楚比特幣錢包,其實就是上面算法里面講的那個公鑰,所以錢包這個概念在區塊鏈中并不單獨存在,而是保存在一條條的交易記錄里面。
因為都是一些沒有任何意義的數字,大家使用起來比較麻煩,于是就誕生了很多比特幣錢包管理程序,但這里有一個安全隱患,如果你自己不知道如何在自己本地生成錢包,而是利用網站去生成公私鑰,理論上網站都有可能把你的私鑰保存一份,當你帳戶(通過公鑰直接查找,數據公開的)有比較多錢的時候,要面臨怎樣的風險誰也不知道。
當然只輸入公鑰在錢包程序里,是沒有安全隱患的,可以很方便查找自己的交易記錄和余額。
一言以蔽之,比特幣錢包是人們虛擬出來的一個詞,在區塊數據中其實就是公鑰。而很多錢包程序就是為了方便一些沒有技術能力的人,讓他們方便的進行虛擬貨幣的交易。
但這里真的給一些正在大額投資虛擬貨幣的人提個醒,如果不是自己本地生成的公私鑰,還真的要當一萬個心。私鑰的保存非常重要,真要丟了,可不是打個客服電話就能要回來的,它就真的永遠消失了。
1.9 P2P網絡技術
這個就是大家以前用過的BT和VeryCD電驢下載,用的技術是一樣的。這個技術就是實現去中心化的網絡傳輸算法,我把網絡交換部分也稱之為算法。
所以,我們發現區塊鏈的關鍵技術是十幾年前就流行過的技術,如果真是什么顛覆性的技術,不會雪藏這么久不出招的。
1.10 金融應用
我2017年就深入調查過區塊鏈技術,主要是看看對我們金融行業有沒有一些新的啟發,調查完發現沒有什么作用后就擱置在一邊了。今天看到身邊好多朋友都想去炒把幣,所以出來寫這個文章。
為什么說沒有用呢?
信任問題:通過電子合同解決了。金融行業用CFCA認證過的合同是有法律效應,而且也做到了不可篡改。
合規問題:只要企業能提供借款人的按法律要求的一些證明文件,事先收集保存到時候提供就可以,一些影相文件和簽字文件,這個用不用區塊鏈存不關鍵。
借款數據:法院不看企業提供的數據作為證明關鍵的數據,都是以銀行提供的流水為準確,A是不是從企業借款,是看銀行是不是有打款記錄,不看企業數據庫或區塊鏈中保存的數據的。
因為合同不可篡改,又有銀行流水記錄,證據非常完善,至于去中心化,那更是完全搭不上邊,哪有我們公司的數據完全對外公開的道理。
1.11 技術總結
區塊鏈其實并不是用了什么新的技術,但將已有的一些技術進行組合,給人們一種全新的用技術來實現一個安全和互信的產品,加上恰逢金融危機后推出,運氣不錯,所以有了今天的地位。
但光了解技術,還是不足于讓我們明白中本聰設計區塊鏈的初衷。我們應該去了解創造區塊鏈背后的極客們的哲學思想,這樣就不至于去犯拿著錘子到處找釘子的錯誤。
02 技術極客的自由烏托邦
這一節將嘗試從哲學層面來分析,創造比特幣的技術極客們,如何用自己擅長的技術領域,按他們的世界觀和價值觀構建出一個虛擬世界。
2.1 新時代的烏托邦
歐洲歷史是就出現過多次烏托邦思潮,提倡無政府主義,現在同樣還有人保有這種思想,但遺憾的是目前也有一些小島是無政府狀態,但基本是過著在原始人的生活。
而區塊鏈最大的特性就是去中心化和開放,這給人一種自由的享受,并且用一系列的技術手段在開放的同時還保證了安全。這就等于構建了一個開放自由并且還保護私有產權的新互聯網模式,難怪這會讓一些大人物們歡呼區塊鏈的時代的到來,而中本聰把第一塊命名為創世塊,也表明也自己希望成為新時代的上帝。
2.2 自由的基因
自由人文主義在西方經歷了幾百年,從圣奧古斯丁思想提出,到現在成為歐美等國家的主要哲學思想。以致于丹尼爾·漢南最近寫的《自由的基因》里面說自由是盎格魯圈的基因。
當看到這個新的去中心化的區塊鏈技術出來以后,又讓一些人內心持有自由主義觀念的人,終于看到一個完全無政府(去中心化)的烏托邦社會(比特幣)的誕生和崛起。這其實非常符合一些出生在中國,受美國教育以及長期生活在美國的名人的價值觀。比如:大科學家張首晟、硅谷投資人吳軍等,他們覺得這是互聯網的分水嶺來臨。
他們當然是我非常尊重的人,在自己的專業領域有非凡的成就,是我不能比的。但就區塊鏈技術的研究,未必有我深入,至少我相信他們沒有時間去Github上下載過C++的區塊鏈源碼來看。但之所以最說區塊鏈被這些專家夸大了,不是因為我看了源碼,而是因為我還做過一些哲學上的分析。
2.3 自由主義的哲學發展
就算我們從哲學的歷史來一步步推導,絕對的自由最后就是必然產生強權,而從現在的比特幣來看,也是一樣的,算力最強的擁有交易寫入權,最后受益方一定是那些強制的一方。
我畫了一張自由的哲學發展史,從笛卡爾提出我思故我在,把人從上帝的附庸中提拔出來以后,到最后黑格爾的強權即公理,到最后尼采的強者邏輯直接給希特勒屠殺猶太人找到了理由。而在受黑格爾和尼采的思想影響下,也直接導致德國發動二次世界大戰。

反觀二戰后,美國的就是用馬歇爾的政策,用的是老子的思想“夫唯不爭,故天下莫能與之爭”,主動犧牲自己利益,扶持歐洲和日韓的發展,當這些國家發展了反過來又進一步促進了美國的發展,才有了今天美國霸主的地位。
講這些哲學邏輯就是想說明一個道理,絕對的自由產生強者權利。完全的去中心化,大家完全按既定規則的投票(比特幣現在邏輯),拿區塊鏈最火應用虛擬貨幣來說,最后就會形成幾大礦池,幾大交易所,他們就是虛擬貨幣領域的無形的希特勒,決定著各種BIP(比特幣改進計劃)向他們有利的一方游走,而小散投資者們就是他們的韭菜。
如果認為這種完全不受政府監管,最后都是強者恒強的形式是互聯網的未來,那可能我們就得同意張首晟所說的目前形式的區塊鏈條是互聯網分岔。
2.4 除虛擬幣貨并無大的區塊鏈應用
再從結果來看,這么重大的技術,區塊鏈至少被這些專家講了5年以上了。我們現在除了看到大家在熱火朝天在炒幣以外,身邊沒有看到任何一個大型的應用是用區塊鏈實現的。
如果真是一個革命性的任務,我想Google,Facebook和BAT公司怎么可能這么多年還沒有具體的應用呢?
如果您剛才認真看完了技術篇幅的加構,便知道區塊鏈不過是:P2P網絡 + 鏈表 + 二種通用加密算法,這幾樣東西的組合,完全不足于顛覆現有互聯網,現在很多大公司不用不是因為不知道和不了解。而是因為現實在有更好的技術,比如分布式關系型數據庫(如Mysql),分布式緩存,分布式消息隊列和分布式文件存儲等。
不管怎么改進區塊鏈技術,都是不可能實現幾億用戶20萬/秒的交易記錄的(支付寶2017雙11的記錄)。
這些技術本身都是分布式的,部署在不同機器上,但同時又實現了中心化的管理,這里面技術難度要遠遠大于區塊鏈的技術難度。
當然還有其它一些利益相關的區塊鏈的支持者,我就一個觀點,如果他鼓吹的東西對自身利益有非常重大的關系,不管他講的如何真誠都可以忽略。非常簡單的道理,若真是好東西,會公開的告訴你嗎?
所以像李X來,薛XX等,比如從事區塊鏈創業圈的人,都不算是區塊鏈支持者,應該說是虛擬貨幣的支持者,其目的就不用我來告訴大家了。
2.5 技術現狀
想想比特幣到今天,絕對超出中本聰當初建設他的目的,每天消耗大量的能源,讓其成為人類新時代的“郁金香”。
03 新時代“郁金香”
這一節從社會學角度來簡單分析虛擬貨幣的現象。
3.1 想象共同體
前文提到了虛擬貨幣是新時代的“郁金香”,這是經過自己的一些分析的。就像赫拉利在《人類簡史》中提到智人最大的進步來自7萬年前的一些基礎突變,讓人具有了講故事了能力。這樣大家不斷的通過講故事,就形成了共同的社會習俗,形成了各自的文化和社會關系。
如今的比特幣不就是完全是大家的一個想象共同體嗎?想象共同體有沒有意義?當然有意義,國家和民族不都是想象的共同體嗎?這個共同體的意義就要看其給我們實際帶來了哪些價值。國家和民族給我們帶來什么價值,就不用過多的闡述。
那么比特幣和交易帶來了什么現實的意義嗎?直接替代現有的支付寶,這是一種舍近求遠的行為。目前的用虛擬貨幣來實現的支付都是要轉換成美元或其它法定貨幣來支付給商家的,這不說等于饒了一個圈子嗎?
虛擬貨幣也好,實際貨幣的價值也好,一個很重要的作用就是交換和流通的。
3.2 虛擬貨幣價值
虛擬貨幣中最大的一家比特幣,最后還是要通過銀行卡來進行交易,但價格波動太劇烈。雖然有一些技術型公司愿意接受比特幣作為支付手段,但賣的肯定是虛擬產品,比如Steam和一些游戲公司,這些公司虛擬對虛擬還是挺對路的,反正公司不會虧。
但凡是有成本的交易,比如蘋果公司賣手機,試試用比特幣結算看看,價格一波動,到時候連供應商的貨款都付不出。
還有一個最大的問題,安全性完全沒有保障。就拿個人來說,試想你把你所有的錢全換成比特幣,你每天睡覺都提心掉膽,放電腦存著吧怕被盜,抄本本上吧怕丟,記吧還又記不住。
如果一家公司呢?所有資產就是一串完全沒有保障的數字,誰保管著私鑰馬上人間蒸發。
當然支付者們可以講,可以不斷改進嗎?對是可改進。但要做到安全穩定不波動,不就是等于重新把現代金融體系重新在虛擬世界重構一次嗎?最后不就又演變成現代的金融制度嗎?
所以我才會說想通過區塊鏈技術來構建一個自由的金融社會是一種烏托邦的設想罷了。
這就很容易得出結論,數字貨幣不過就是一個沒有實際價值的“想象共同體”,和當年的荷蘭“郁金香”最大的區別是當年“郁金香”只在荷蘭流行。但今天虛擬幣貨通過更新的技術和更強的傳播手段,傳播到了全世界,所以這一波應該會漲得更高更持久一些,但泡沫終歸還是要破滅的。
04 誰是贏家
這一節就要嘗試回答,在當前的區塊鏈大環境下,哪些人是受益方。
區塊鏈的生態圈包括哪些角色?
虛擬貨幣會發展成為支付寶那樣的貨幣嗎?
挖礦的經濟價值如何?
4.1 區塊鏈的生態圈
我們來看看區塊鏈生態圈有哪些角色,我們就只羅列直接關系者,背后的供應鏈不在一一列舉了。
炒幣者
早期進行的一些人應該有不少賺錢了,但小散們不可能賺太多,后面我分析原因,現在進去的基本都是韭菜。
礦工
投資者,存在一定風險,但追求的是穩定的回報。
礦機供應商
目前各種礦機供不應求,應該是這波區塊鏈的受益者。
礦池所有者
大的礦池所有者,挖礦得到的交易費是不分成的,所以應該是較大的受益者。
虛擬貨幣交易所
食物鏈的頂端,收割者,不要任何金融牌照,上一個新幣就收幾千萬,反正人傻錢多,不管上什么都有人買,不怕沒韭菜。
技術開發者
賺口飯錢,干什么不是干,不過干了區塊鏈,工資能比其它人高點。
虛擬貨幣發行者
早期的發行者,早已身價不可估量。如今也是賺個微利,還有可能賺的錢不夠付交易所的上幣費。
區塊鏈創業者(除虛擬貨幣從業者以外)
我非常崇拜的一群人,雖然大部分人是拿錘子在到處找釘子,但是有情懷,說不定會找到一些新的業務模式,但應該不是什么顛覆性的。
4.2 礦池的正經濟利益
我本來還想自己統計,結果有人做了一個網站,專門顯示各種挖礦的經濟利益。網址在這里:https://www.coinwarz.com/cryptocurrency/

能看出來挖比特幣不是目前經濟價值最高的,現在要挖萊特幣。對不起,比特幣礦機和萊特幣礦機不同,不能說不挖比特幣去挖萊特幣,當然這個里面受實際價格的影響,但總體來說是賺錢的,但請注意這是對于大的礦池和大的礦廠。
由于比特幣去年的快速上漲,而礦機的供應有點落后,但隨著價格的回落和礦機的供應到位,這個市場的經濟利潤馬上會歸于零。
4.3 投資礦機價值
對于交易所和大礦池的擁有者,當然毫無疑問,他們會想方設法自己或者買通其它人發出各種虛擬貨幣才是未來的新經濟,區塊鏈會顛覆現有互聯網這樣的言論。
對于很多小散投資者,可能買個幾臺幾十臺礦機放家里,然后再自己順便炒一炒,想著自己的發財夢,我先從經濟規律上來分析小礦工們賺不到錢的道理。
學過經濟學的都應該知道下面的成本曲線,當 R(收入)=ATC,大家不再買新的礦機,當R(收入)< AVC (電費+人工費+其它運營費用)。

根據經濟規率:只要經濟利潤為正,就會不斷的有新加入者,直到最后經濟利潤為零,但不同的礦工由于成收入和成本各不相同,當礦池們為零的時候小礦主們可就早就變成負的了。
作出上面的判斷,主要有由于下列原因:
1、小礦工的規?;颍V機的運行效率肯定不如大礦廠,這樣R收入會低。
2、小礦工采購批量小,平均固定成本會高于大礦廠。
3、小礦工電力平均成本和運營成本可能都會高于大礦廠。
4、小礦工無法得到交易手續費分成(目前是這樣)。
基于以上分析,可以得出結論:投資了小規模的礦機最終會因為規模效應虧損。當然如果運氣好遇到比特幣一起漲,那這樣也別折騰,直接買不就好了嗎?
那我就再來分析下直接投資的價值。
4.4 小散投資虛擬貨幣的價值
首先,有一件事實必須承認,虛擬貨幣本身是一段數據,數據被加密來加密去存在多少塊硬盤上,除了被炒來炒去,用來真實商品交易非常少,而且使用起來也非常麻煩,可以說本身不創造任何價值(當然不是說貨幣不產生價值,貨幣最直接的價值就是降低交易成本,而比特幣卻不是)。再次強調,不創造價值不代表沒有價值,只要人們認為他有價值他就能賣得了。正是因為這個原因,現在各種虛擬貨幣才這么火。
用下面的圖來形像的說明吧,比特幣的錢都來自投資者的投入,那么投入的可能是在這的高度,除了付給發行者收益,交易所收的手續費還有礦工的成本,那么進入的錢,等出來時可能只剩一半了。

以最近24小時比特幣的數據來說,24小時的交易量是20億美金,算1%的交易費(交易所直接收的現金)。再以1萬美金/BTC來計算,每天挖出還有礦再加上收走的比特幣交易費,共計2000個比特幣左右。當這二項的收費就4000萬美金/天,再加上被那些創始人賺走的,每天至少在5000萬美金以上的凈支出。
這就相當投一塊錢進去,5毛錢出來,然后我們還想信我在這個市場能賺大錢。
這里有一個概念一定要搞清楚,這里無關比特幣漲跌,比特幣的量是按其規則運行不會變化。但因為比特幣不創造價值,而法定貨幣的平衡和幣的漲跌是沒有關系的,相差5000萬一天這是一個實際貨幣上的平衡。而這個市場又有人不斷的在抽取價值,那么就要靠不斷的更多的投資加入才能維持市場的繁榮。
4.5 如何解釋那些財富自由的人
有一些,極少數沒錯,通過虛擬貨幣實現財富自由的人,想想2009年如果花5000塊買比特幣,現在身價幾個億美金了,怎么能說投資沒有價值呢,這是屌絲逆襲的最好時機了。
我只想說一句,真小散在5000買的時候,漲到1萬的時候基本就賣了。如果在10萬的時候還沒賣,一定是忘記自己買過比特幣了,但對于小散5000塊的投資不太會忘記。如果到了50萬還沒賣,基本上是忘記了密碼。所以不要做這種不可證偽的假設。
當然大家可以指出大量QQ群,朋友的朋友,賺了幾千萬幾個億的。我只能說要真是一個普通人賺了幾個億的人,是不會在Q群里發言,發朋友圈的。最有可能是默默的刪除原來屌絲好友,生怕他們來找自己借錢。所以這種消息聽聽也就罷了,自己賺了還是虧了自己心里還不清楚嗎?
我想信那些1萬多美刀進場的人,最近能感覺到一絲絲的寒意了。只是我們聽多了那些一夜暴富的人,卻忘記了還有更多一貧如洗的人。
4.6 比特幣數量可控嗎?
最后再拆一根支撐小散炒幣的沉重梁,就拿最值錢的比特幣來說,比特幣數據最終固定在2100萬個,不增也不減,最終一定會漲上去的。
好,確實區塊鏈下修改數據是幾乎不可能,但不代表不會增加。復制還是可以的,大家知道BitCoin Cash嗎?一群礦工不滿足1M大小的區塊,要修改為8M,自己就把原來的比特幣數據拷一份,命名為比特幣現金(BitCoin Cash),原來的比特幣帳戶密碼在比特幣現金里面也能用。
你敢相信,就這樣1個變2個了,不是說不能增加的嗎?而且價格之前也到2000多美金了,就硬生生的多出200多億的市值出來。如果想了解細節,可以去百度比特幣分叉,什么分叉,就是硬拷貝好不。
拿阿里巴巴股票市場為例吧,把誰在這個時刻持有阿里巴巴股票的數據記錄下來,然后直接拷一份叫阿里媽媽,繼續明天掛在交易所里排一起交易,體驗到了“強權”的味道了嗎?
反正看上去沒有人有損失,原來持有阿里巴巴的在阿里媽媽里多了一份,沒有任何人受到了損失,這就是完全沒有監管的自由金融市場的樣子。
就算不分叉,來看看全貌,一共93種在市場上交易的貨幣,現在找交易所上個新虛擬貨幣。新貨幣都號稱解決了比特幣的這問題和那問題,還有排第二的萊特幣號稱可以編程,是一個平臺,是所有虛擬貨幣的代幣,玩法層出不窮,連排最近一名的總市場也在500萬美金以上。

我看了幾種主流的虛擬貨幣的技術架構,都基本還是沒有脫離比特幣的區塊鏈技術框架和思路,不過是在效率上更高一些,號稱加了更多的一些功能。
可以在https://blockexplorer.com/market查看。
列舉了這么多,你還相信區塊鏈下的虛擬貨幣神話嗎?一個故事可以講一段時間,但要講長久,關鍵還是要看創造什么樣的價值。
所以,我非常贊成政府對比特幣的嚴格管控,真的是在保護我們普通投資者。
最后、引用老子的一句話:“天之道,損有馀而補不足。人之道,則不然,損不足以奉有馀。”,投資市場就是這么一個“損不足以奉有馀”,所以小散投資者們就是雖然錢少,但還是用來損的,去補那些大的玩家(礦池主,交易市場主人)。
4.7 投資者心態
但我知道,就像當年的3M一樣,只要政府不出手,一直讓他開著,總歸一直會有人加入的,所以我還是相當支持國家來嚴控虛擬貨幣交易的,至少能擋住一部分人吧。
從數據角度講,你只要承認虛擬貨幣不創造價值,進行1塊錢,被分走5毛,然后還要博取100倍、1000倍的收益。只要你認為自己掌握的信息、自己的能力和自己的運氣和別人一樣(實際是這個市場還存在操控),根據正態分布原理:想通過投資虛擬貨幣得到巨大收益的可能性,就和自己手機上安裝一個挖礦程序想挖出比特幣一樣的低。
造成這種現象的原因很簡單,身邊總是留傳著某某個人因為炒幣財富自由了,這種事情我一天都聽到3回了,這種快速賺錢的故事最能相互間快速傳播。但仔細想一想,這種進一塊出五毛的市場如果大家都賺錢了,韭菜在哪里?歪國人都是韭菜?
當然我知道很多投資者還是會加入炒幣,因為
1、用點自己的小錢、比如投入自己財產的10%(一毛錢都不應該送進去)。
2、不懂跟風、博取財富自由(參照我上面的概率分析)。
3、沒什么好的理財項目(那就放貨基,把精力放在提升自己上)。
如果是上面幾種人,我建議有這錢不如陪家人出去旅游一趟,但如果是下面的情況,我就不勸阻了,祝君早日財富自由。
1、我相信在炒幣這件事情上,我的能力比別人強。
2、我相信我有某種神奇的能力,炒幣總能低買高賣。
3、我相信我的運氣總比別人好。
2、我認識帶頭大哥,他有內幕消息。
3、我相信身邊就有大量通過炒幣致富的案例。
有時候我也一直想不通,樂視復盤的第一天,就有不少人在跌停的時候買入樂視,因為絕大部分人肯定認為在5個以上跌停板,但總有一些人對自己特別自信在第一天進入。我反正還是沒特別想通,如果你們有答案可以留言告訴我。

05 總結
第一次在公眾號寫這個萬字長文,也算結合自己的專業和去年學習的知識,從多個維度來分析區塊鏈技術。觀點未必正確,所以歡迎留言討論,但有一點我非??隙?,小散們遠離虛擬貨幣為妙。
另外我接下來還會補充二篇內容來說明:
1、微信的朋友圈也可算是區塊鏈的應用。
2、大部分現有的區塊鏈創業都是在拿錘子找釘子,很多目前用區塊鏈創業項目用中心化的技術方案實現起來更好,用區塊鏈實現就是蹭熱點,為了拿融資方便。
最后看到這里的朋友都不容易,非常感謝大家的支持,如果有興趣或者不同意見,歡迎留言討論。
引用站點和圖片
[1] 比特幣數據結構圖片來源 https://www.researchgate.net/figure/a-Blockchain-structure-b-Smart-contract-structure_309543764
[2] 比特幣區塊數據查詢 https://blockchain.info/
[3] 比特幣交易費用介紹 http://bitcoinfees.com/
[4] 挖礦收益查詢 https://www.coinwarz.com/cryptocurrency/
[5] 比特幣市場價值查看 https://blockexplorer.com/market
[6] Satoshi Nakamoto, Bitcoin: A Peer-to-Peer Electronic Cash System
[7] Andreas M.Antolopolutos, Mastering Bitcoin
來自:
https://new.qq.com/omn/20180203/20180203G04168.html