區塊鏈技術中從 0 到 1 建立自己的開發山寨幣

來源:互聯網
上載者:User

區塊鏈愛好者(QQ:53016353)

自從 2009 年 Satoshi Nakamoto 發布了 Bitcoin 的開源項目,區塊鏈技術作為其背後的支撐技術也在慢慢發展,2014 年以來,越來越多的科技巨頭和產業資本逐漸進入了這個領 域,對區塊鏈技術的發展也起到了極大的促進作用。

我們可以把 bitcoin 看做基於區塊鏈技術的第一個金融應用,它是一個去中心化、無需 信任單個節點、隱私又透明、在共識機制下由人人維護的貨幣系統和支付清算網路。這樣 的一個去中心化的清算網路正在成為另外一種互連網的基礎設施,就像計算能力、頻寬是 互連網的基礎設施一樣,比特幣的支付網路正成為另外一種互連網基礎設施—“信任”, 這樣的一個基礎設施每天由全世界的礦工共同維護,並越來越散發出迷人的魔力,並成為 Fintech 創新的溫床和基礎設施,也吸引了越來越多的資源進入該領域。


除了在支付和金融領域的應用,區塊鏈作為一種去中心化的、共用的、無需信任單個節 點的公開透明的數字賬本,也在逐漸應用到物聯網、身份認證、供應鏈管理、版權管理、 去中心化的應用等眾多領域。區塊鏈技術解決了電腦領域著名的“拜占庭將軍”問題, 使得在無需信任單個節點的情況下,建立一個去中心化的共識網路。


目前大多數和區塊鏈技術相關的項目都在國外,國內區塊鏈技術的開發和應用相對滯後, 因此計劃在閑暇時間寫一些簡單的開發手冊,希望可以協助到從事這個行業的個人或者小 公司。


暫訂寫作計劃分為兩部分


第一部分:《從 0 到 1,建立自己的區塊鏈》 :重溫比特幣網路的發布過程,並發行自 己的區塊鏈網路(私鏈)


第二部分:《從 0 到 1,開發區塊鏈的應用》 :在公有鏈和私人鏈上,開發自己的區塊 鏈應用。


第一部分:從 0 到 1 建立自己的區塊鏈 目錄:


1.1 從模仿開始,初識區塊鏈
1.2 區塊鏈的基礎:共識機制剖析
1.3 共識機制的設計原理和設計方法
1.4 如何快速複製一條區塊鏈
1.5 如何把比特幣變成自己的私鏈–分叉比特幣
1.6 如何把以太坊變成自己的私鏈–分叉以太坊
1.7 如何把 Ripple 變成自己的私鏈–分叉 ripple
1.8 如何把 stellar 變成自己的私鏈–分叉 stellar 1.9 如何搭建一個礦池,並挖出自己的創始區塊
1.10 如何開發自己的區塊鏈錢包(Windows 和 MAC) 1.11 如何開發自己的區塊鏈錢包(Android 和 IOS) 1.12 如何開發一個類似於 blockchain.info 的線上錢包 1.13 如何增加自己的區塊鏈網路的安全性和魯棒性 1.14 如何利用 coind 來處理儲值提現業務
1.15 如何利用資金池搭建一個混幣服務
1.16 如何設計一種新的挖礦演算法


 


1.1 從模仿開始,初識區塊鏈
 


對理工科的人來說,學習的最好方式就是直接上手,區塊鏈的概念我們瞭解了很多,今 天就讓我們解開區塊鏈的神秘面紗,讓我們直接動工吧,讓我們自己從零開始發布自己的區塊鏈,並且在發布過程中學習!


目前主流的共識機制有 POW,POS,Dpos,還有 ripple 和 stellar 的共識協議,以及ethereum 的共識協議等等,其實還有一些 altcoin 也有一些獨特的共識協議,目前關注的人 較少(這些共識協議,我們會在後面具體剖析)。


模仿需要一個源碼,考慮到 Bitcoin 源碼經過 6 年來的迭代,已經和最初版本有較大的差 異,我們選取 sunny king 大神的 pos 協議為基礎,來發布自己的區塊鏈,這裡我們在 github 上面選取一個較好的程式碼程式庫:cravecoin 的原始代碼伺服器配置:阿里雲租用 Ubuntu14.04 版本伺服器 2Core 4GB 登陸伺服器 root@your password
從 github 上面下載樣本源碼:




其中 crave.pro 是 QT 用戶端編譯需要的檔案Doc


是一些基本的 docs,包含在源碼裡面


Share has some needed libs build’s used by the build system so we always need it


Src 包含用戶端編譯所需要的源碼,以及映像和 logo


Pro 檔案為用戶端編譯所需要的檔案,在阿里雲 Ubuntu14.04 上面,我們可以編譯 Linux 錢包用戶端和 Windows 錢包用戶端


為了 alive 自己的區塊鏈,我們需要把 CRAVE 的區塊鏈,替換成自己的的區塊鏈,因為 NEO 是中是《TheMatrix》正義的化身和代言人,我們為 NEO 來發布一條區塊鏈區塊鏈吧。


Snip20151109_26


我們把 crave.pro 重新命名成為 neocoin.pro (這裡你可以重新命名為任何你喜歡的名字,比如 Xcoin or bankcoin. Or your company coin)


從 POS2.0 協議開始,區塊鏈網路的參數儲存在 chainparams.cpp 中,在最原始的 pos 源碼中,網路 參數儲存在 main.cpp and main.h,從 2014 年以後,主流的 pos 協議都在採用這種方式。


nano chainparams.cpp 開啟 chainparams.cpp 檔案


修改一個區塊鏈最重要的是要修改 pchMessage,後面的 16 進位標識符,是區塊鏈的一個 ID,用來區別兩條不一樣的區塊鏈。否則,如果不修改,會發生自己的區塊鏈同步到其他區塊鏈上面的情況。 源碼中為:


chMessageStart[2] = 0x05;
chMessageStart[2] = 0xa5;
chMessageStart[2] = 0xb6;
chMessageStart[2] = 0x1b;
其中 0x 保持不變,數字範圍 0-6,字母範圍 a-f 我們修改為:


pchMessageStart[0] = 0xaf;
pchMessageStart[1] = 0x25;
pchMessageStart[2] = 0x04;
pchMessageStart[3] = 0x32;
現在我們區塊鏈有一個唯一的 ID 了
const char* pszTimestamp = 8 Mar 2015 The rebirth starts.這裡一般用來記錄區塊鏈 alive 的那一天發生的大事情,大家知道中本聰在這裡寫的什麼嗎?


你猜?


下一步我們需要修改 txNew.nTime = 1426700641; 這個時間如何得到呢?
txNew.nTime 代表區塊鏈發布的 unix 時間,可以在這裡把北京時間轉換成為 unix 時間




同時也需要修改 genesis.nTime = 1446708703


把 genesis.nNonce = 17113 修改成為 genesis.nNonce = 0 區塊從 0 開始,nNonce 用來計算,計算 找到第一個 block 需要的區塊數,一旦找到創始區塊,將會重新計數 block


下一步我們需要移除舊的創始區塊和 merkle 的值 (remove the old genesis and merkle) Old merkle 是:


assert(hashGenesisBlock == uint256("0x00000a336bf3e2be21c2ce9a3f9bc9849$
assert(genesis.hashMerkleRoot == uint256("0x281554338b643722b01ea689ab6$
我們刪除 unit256(“0x 之後的內容,當我們第一次編譯的時候,會報錯。在 debug.log 裡面會產生一個新 的 value,到時候把新的 value 放入這個地方即可。


然後我們修改 nLastPOWBlock = 10000; 代表 POW 的最後一個 block,這裡的數值可以自己選擇, 取決於挖礦時間的長短。但是如果數值太小,會照成 coin 沒有成熟,從而無法 stake,照成網路停滯。這 裡我修改成了 1000


同時在 chainparams.cpp 檔案中,可以發現一個 testnet,同時修改 testnet 中的區塊鏈標識符


pchMessageStart[0] = 0x1f;
pchMessageStart[1] = 0x22;
pchMessageStart[2] = 0x05;
pchMessageStart[3] = 0x30;
在 bitcoin 的 testnet 網路中,我們可以測試一些新的 BIP 協議,比如我們可以把區塊大小設定成 20MB, 來觀察網路的運行狀態。在自己的 private chain 上面,我們可以測試任何我們想要的功能。而不會對mainnet 形成幹擾 或者破壞 mainnet 的完整性。


同時修改 testnet 的 Genesis block assert(hashGenesisBlock == uint256(“0x00000a336bf3e2be21c2ce9a3f9bc9849$ 刪除 0x 後面的 value


在 source 中 valertpubkey 也非常關鍵,可以增加網路的安全性,可以用來通知新的 block,在我們第 一次運行 daemon 的時間,會產生一個網路的 publickey,publickey 可以由 checkpoint 產生。


下面我們修改網路的連接埠號碼


nDefaultPort = 30104; 為 p2p port,網路用來與 daemons 通訊


nRPCPort = 30105; 為 RPC 連接埠,所有 exchange,pool, explorer 通過 rpc port 與 daemon 通訊 可以修改成為 10000 to 60000 的任何連接埠號碼,我們修改成 26666 和 26667


nDefaultPort = 26666;
nRPCPort = 26667;
修改完成後,ctrl+x 保持檔案,並退出。


然後進入 main.cpp,找到


unsigned int nStakeMinAge = 8 60 60; // 8 hours
unsigned int nModifierInterval = 8 * 60; // time to elaps
這裡是最少的 staketime,在 pos2.0 的協議當中,我們需要 mini stake age,在 pos3.0 協議中,已經不再需 要。通用的是 8 個小時,但是你可以修改成任何時間,通常情況下,為了網路安全,建議時間大於 1 個小 時。但是在 pos3.0 協議中,coin 從 block1 開始 stake!


int nCoinbaseMaturity = 188; 為 coin 成熟的區塊數,可以修改成任何數字。這裡我改為了 100


int64_t nSubsidy = 100 * COIN; 為區塊獎勵的數額,這裡可以修改你想要的 block reward,當然也可以 在這裡設定自己想要的 block reward structure,控制 pow 和 pos 出幣的多少。


static const int64_t nTargetTimespan = 24 * 60; // 24 mins 為區塊難度調整的時間,通常如果是一個 public chain,在 挖礦的剛開始,我們希望難度係數儘快調整,可以防止 instamine。


int nTargetSpacing = 60; 為區塊時間,比特幣這裡是 600s,我們這裡設定為 30s。時間太短,容易分叉網 絡。


下面我們修改 main.h 檔案


static const unsigned int MAX_BLOCK_SIZE = 40000000;為區塊大小,在 bitcoin 的 source code 中這裡為 1MB,我們把 40000000 修改成 20MB,但是我們的網路不會超過 1MB 了。。。


static const int64_t MIN_TX_FEE = 1000; 為網路的傳輸收付費,單位為聰,如果太少,網路可能會停滯。


static const int64_t MAX_MONEY = 2000000000 * COIN;為單次發送的最大量,並不是 total amount


Ok main.cpp done


我們找到 checkpoints.cpp


static MapCheckpoints mapCheckpoints =
boost::assign::map_list_of
( 0, uint256("0x00000a336bf3e2be21c2ce9a3f9bc9849c697475d0de85e201bdc$
為創始區塊的 check points,防止網路分叉,現在我們還沒有這個 value,等待 daemon 第一次運行,會產 生這個 value


const std::string CSyncCheckpoint::strMasterPubKey =
MasterPubKey 告訴網路如何同步節點,為一個 main node,在網路早期,大家需要盡量同步到 main node


Checkpoints 告訴網路某一個特定 hash 值屬於哪個 block


修改完成後,我們 ctrl+x 退出


然後找到 版本管理檔案 clientversion.h


define CLIENT_VERSION_MAJOR 1
#define CLIENT_VERSION_MINOR 2
#define CLIENT_VERSION_REVISION 0
#define CLIENT_VERSION_BUILD 0
代表版本號碼 1.2.0 可以修改成 1.0


下面我們來產生,Genesis block,用下面代碼來產生,把下述產生創始區塊的代碼,粘貼在 nNonce 下面
剛好在 hashGenesisBlock
Snip20151109_27Snip20151109_28


這段代碼會檢測是否有創始區塊產生,如果沒有,就會產生一個創始區塊。並把創始區塊資訊列印出來, 我們可以後面使用。
一些最簡單的參數修改已經完成,下面我們開始配置編譯環境。


首先需要更新 Ubuntu 系統到最新版本 type : apt-get update


安裝編譯環境: apt-get install git build-essential libssl-dev libboost-all-dev git libdb5.1++-dev libminiupnpc-dev make zip
其中


* build essential package (為一個編譯環境最基本的東西)
* libssl-dev :openssl 需要
*libboost :c++ boost libraries for the coin
* libdb5.1 :編譯 wallet.dat files 需要
Miniupnpc:錢包串連網路需要 wallets to look for open ports and connect
make :用來編譯錢包


配置完成後,我們使用 make -f makefile.unix
來進行第一次編譯… Hmm 寫到這裡,忘了一件事情有沒有。。。


Snip20151109_31


我們還沒有修改這個 private chain 的名字有沒有。。。尋找替換你會不會。。? 把所有 Cravecoin or CRAVE or CRAVECOIN 統統替換成你想要的名字。。。。


我們用一個超炫的命令: grep -rl ‘crave’ ./ | xargs sed -i ’s/crave/neocoin/g’ 替換名字 還需要你自己的來替換 CRAVE or Cravecoin。。同樣命令用三次


話說我們 logo 我也忘記了。。後面再替換


一切替換完成後,我們再一次編譯


make -f makefile.unix


忘了我們是雙核的 cpu,我們可以加快編譯速度


make -j2 -f makefile.unix


編譯成功,./neocoind


genesis.nNonce = 95200 把原來的 genesis.nNonce = 0 替換成 95200


得到創始區塊:


genesis.GetHash = 00002acaf860e2ae594becc9ce1f20c4714b9aa7fc153f80585d8f562bba5e 1b


添加到 chainparams.cpp 和 checkpoints.cpp 當中


添加完成後,再次運行 neocoind,這次找到 merkle root,在編譯之前,刪除 用來產生 Genesisblock 的 那一段代碼


運行得到 merkle root: 8465c95064313d48688e08e19d80915c0e03310a9c85c57d97cb355 c04b31b0e


下面我們為 coind 配置一個 config file,然後運行 daemon,配置簡單的連接埠即可。 如果要修改 public key 的首碼地址,可以通過 base58 編碼錶修改:


./neocoind stop 停止
./neocoind getaccountaddress “”


可以得到一個地址 NcrzS8YiRbfmDzza8sQB7CkyEaSttDZy8m 在另一台電腦上同樣編譯,得到一個新的節點,這裡我的節點是:。。。。。 開啟 chainparams.cpp,找到
vSeeds.push_back(CDNSSeedData(“112.74.98.71″, “112.74.98.71″));


添加節點。


然後重新編譯 source,這次我們找到網路的 public key 和 private key。。 Never leak your network private key..否則別人可以控制整個網路,就悲劇了。


編譯完成後,./neocoind makekeypair


得到網路的 publickey:


0403dc07ec3f1215b636179659ed7033015cd775baf5fa76c4f70e5d603002d9a261a3adb3bdcbbb8ddb50f19047 5b3a3cd779d2ba0830d770febcd5d7c310d437
Privatekey 我會告訴你。。


Snip20151109_32


Hmm 我們的項目 還沒有一個 logo。。意味著到時候用戶端沒有 logo。找到一個 logo 在這裡
Snip20151109_33


下面我們來編譯讓人頭痛的 windows 開發環境,而且是在 Ubuntu 系統下面編譯


直接用下面的逆天的命令:


apt-get install \
autoconf automake autopoint bash bison bzip2 cmake flex \
gettext git g++ gperf intltool libffi-dev libgdk-pixbuf2.0-dev \
libtool libltdl-dev libssl-dev libxml-parser-perl make openssl \
p7zip-full patch perl pkg-config python ruby scons sed \
unzip wget xz-utils
會下載一大堆東西,是什麼。。你自己慢慢去 Google 一下,只想說 windows 還好。。到時候編譯 MAC clients 的時候,你會發現有多頭大。


git clone https://github.com/mxe/mxe.git 下載 cross compiler


make -j2 qt5 boost 編譯一個定製化的 QTversion under Linux 需要編譯等待 3-5 個小時


這個時候我已經編譯好了 mac wallet。為什麼這麼快? 因為我一直編譯過啊

Snip20151109_34


Cool?


到/src/qt/res/images/ 裡面修改 logo 吧






berkley db4.8 用來產生 wallet.dat file


然後修改路徑:export PATH=/root/mxe/usr/bin/:${PATH};CC=i686-w64-mingw32-gcc CXX=i686-w64-mingw32-g++


告訴編譯終端使用 MXE gcc and g++


然後 ../dist/configure –disable-replication –enable-mingw –enable-cxx –host x86_64 –prefix=/root/mxe/usr/i686-w64-mingw32.static/
配置 db


然後 type make 開始編譯。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.