从0到1建立自己的区块链

写作阐明

自从 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 上面下载示例源码:

wget https://github.com/industrialcoinmagic/crave/archive/bbf8914fef9bff080ce0826e4ee6b5b76ac4690a.zip
解压下载的文件 unzip bbf8914fef9bff080ce0826e4ee6b5b76ac4690a.zip

其间 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 来发布一条区块链区块链吧。

从0到1建立自己的区块链

咱们把 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 时刻

http://tool.chinaz.com/Tools/unixtime.aspx

一起也需求修正 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

从0到1建立自己的区块链
从0到1建立自己的区块链

这段代码会检测是否有开创区块发生,假如没有,就会发生一个开创区块。并把开创区块信息打印出来, 咱们能够后边运用。 一些最简略的参数修正现已完结,下面咱们开端装备编译环境。

首要需求更新 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 写到这儿,忘了一件事情有没有。。。

从0到1建立自己的区块链

咱们还没有修正这个 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 编码表修正:

https://en.bitcoin.it/wiki/List_of_address_prefixes

./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 我会告知你。。

从0到1建立自己的区块链

Hmm 咱们的项目 还没有一个 logo。。意味着到时分客户端没有 logo。找到一个 logo 在这儿

从0到1建立自己的区块链

下面咱们来编译让人头痛的 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。为什么这么快? 由于我一向编译过啊 

从0到1建立自己的区块链

Cool?

到/src/qt/res/images/ 里边修正 logo 吧

能够到这儿生成 logo 文件 https://iconverticons.com/online/

Windows 下面 wget http://download.oracle.com/berkeley-db/db-4.8.30.tar.gz

berkley db4.8 用来生成 wallet.dat file

然后修正路径:export PATH=/root/mxe/usr/bin/:$https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpgPATH};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 开端编译。

假如你榜首次就编译成功了,你能够去买菜票。假如你没有编译成功,恭喜你。你需求花好几天弄理解到 底是什么原因。

可是假如你认为你编译成功,就能够发布自己的虚拟钱银或许区块链服务了,那你太单纯了。要不然 中本聪怎么叫做大神 大神(=@__@=)呐。前后各种版别 100 万行的 bitcoin 代码不是盖的。。假如真想学 习 satoshi nakamoto,一步一步来吧。。这个是科普读物。。上圈套了吧?

从0到1建立自己的区块链

明日接着写。

作者:帅初Let me know if you have any questions, thank you

Contact me: email or wechat Email: Patrickcrypto@gmail.com欢迎邮件沟通、交流: patrickcrypto@gmail.com

1.2 区块链的根底:一致机制分析

本文链接:https://www.8btc.com/article/72660
转载请注明文章出处

从0到1建立自己的区块链

写作阐明

自从 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 上面下载示例源码:

wget https://github.com/industrialcoinmagic/crave/archive/bbf8914fef9bff080ce0826e4ee6b5b76ac4690a.zip
解压下载的文件 unzip bbf8914fef9bff080ce0826e4ee6b5b76ac4690a.zip

其间 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 来发布一条区块链区块链吧。

从0到1建立自己的区块链

咱们把 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 时刻

http://tool.chinaz.com/Tools/unixtime.aspx

一起也需求修正 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

从0到1建立自己的区块链
从0到1建立自己的区块链

这段代码会检测是否有开创区块发生,假如没有,就会发生一个开创区块。并把开创区块信息打印出来, 咱们能够后边运用。 一些最简略的参数修正现已完结,下面咱们开端装备编译环境。

首要需求更新 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 写到这儿,忘了一件事情有没有。。。

从0到1建立自己的区块链

咱们还没有修正这个 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 编码表修正:

https://en.bitcoin.it/wiki/List_of_address_prefixes

./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 我会告知你。。

从0到1建立自己的区块链

Hmm 咱们的项目 还没有一个 logo。。意味着到时分客户端没有 logo。找到一个 logo 在这儿

从0到1建立自己的区块链

下面咱们来编译让人头痛的 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。为什么这么快? 由于我一向编译过啊 

从0到1建立自己的区块链

Cool?

到/src/qt/res/images/ 里边修正 logo 吧

能够到这儿生成 logo 文件 https://iconverticons.com/online/

Windows 下面 wget http://download.oracle.com/berkeley-db/db-4.8.30.tar.gz

berkley db4.8 用来生成 wallet.dat file

然后修正路径:export PATH=/root/mxe/usr/bin/:$https://bicoin8.com/wp-content/uploads/2023/04/202304211cHpE0.jpgPATH};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 开端编译。

假如你榜首次就编译成功了,你能够去买菜票。假如你没有编译成功,恭喜你。你需求花好几天弄理解到 底是什么原因。

可是假如你认为你编译成功,就能够发布自己的虚拟钱银或许区块链服务了,那你太单纯了。要不然 中本聪怎么叫做大神 大神(=@__@=)呐。前后各种版别 100 万行的 bitcoin 代码不是盖的。。假如真想学 习 satoshi nakamoto,一步一步来吧。。这个是科普读物。。上圈套了吧?

从0到1建立自己的区块链

明日接着写。

作者:帅初Let me know if you have any questions, thank you

Contact me: email or wechat Email: Patrickcrypto@gmail.com欢迎邮件沟通、交流: patrickcrypto@gmail.com

1.2 区块链的根底:一致机制分析

本文链接:https://www.8btc.com/article/72660
转载请注明文章出处

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注