BCH原链可以直接复用BTC/BCH的矿池代码库,搭建矿池作为基础设施。
unomp的主体代码是2014、2015年开发完成的,要依赖nodeljs,而且还不能用最新的版本。
sudo apt-get update
sudo apt-get install software-properties-common
sudo apt-get install npm
sudo apt-get install python
sudo apt-get install build-essential libssl-dev npm nodejs nodejs-legacy
curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh
source ~/.profile
nvm是nodejs的版本管理器,这里也比较挑剔。
nvm install 0.10.25
nvm use 0.10.25
现在可以下载并安装unomp了。
git clone https://github.com/UNOMP/unified-node-open-mining-portal.git unomp
cd unomp
npm update
为了保证矿池的访问效率,unomp内部也使用了redis内存键值数据库,参考文档: https://www.digitalocean.com/community/tutorials/how-to-install-and-use-redis
sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install tcl8.5
wget http://download.redis.io/releases/redis-stable.tar.gz
tar xzf redis-stable.tar.gz
cd redis-stable
sudo make
sudo make test
sudo make install
cd utils
sudo ./install_server.sh
make test时可能会有一点报错(不影响后继安装):
*** [err]: Active defrag in tests/unit/memefficiency.tcl
defrag didn't stop.
Cleanup: may take some time... OK
Makefile:262: recipe for target 'test' failed
make[1]: *** [test] Error 1
make[1]: Leaving directory '/home/gotolab/unomp/redis-stable/src'
Makefile:6: recipe for target 'test' failed
make: *** [test] Error 2
make test结束正常的提示是:
\o/ All tests passed without errors!
用下面两条命令启动和停止redis服务(现在启动就行了):
sudo service redis_6379 start
sudo service redis_6379 stop
用下面命令将redis设置为开机自动启动:
sudo update-rc.d redis_6379 defaults
上面就完成了整个安装过程,为了将程序跑起来,需要修改一些配置文件。首先在unomp文件夹下找到config.json.example文件,复制为config.json。
cp config.json.example config.json
config.json里有许多配置选项,不明白的保持默认值,我修改的地方用##标注。
"logLevel": "debug",
"logColors": true,
"cliPort": 17117,
"clustering": {
"enabled": true,
"forks": "auto"
},
"defaultPoolConfigs": {
"blockRefreshInterval": 1000,
"jobRebroadcastTimeout": 55,
"connectionTimeout": 600,
"emitInvalidBlockHashes": false,
"validateWorkerUsername": true,
"tcpProxyProtocol": false,
"banning": {
"enabled": true,
"time": 600,
"invalidPercent": 50,
"checkThreshold": 500,
"purgeInterval": 300
},
"redis": {
"host": "127.0.0.1",
"port": 6379,
"db": 0,
"password": "" ## 正式运行的矿池需要设置redis的密码
}
},
"website": {
"enabled": true,
"host": "0.0.0.0",
"siteTitle": "UNOMP Beta by shenlb", ## 网站的标题
"port": 8000, ## 改成自己喜欢的端口,放开云服务相应端口,不建议用80端口,容易跟其他服务冲突
"stratumHost": "pool.unomp.org", ## 改成自己的域名,无域名直接用IP
"stats": {
"updateInterval": 60,
"historicalRetention": 43200,
"hashrateWindow": 300,
"graphColors": ["#058DC7", "#50B432", "#ED561B", "#DDDF00", "#24CBE5", "#64E572",
"#FF9655", "#FFF263", "#6AF9C4"]
},
"adminCenter": {
"enabled": true,
"password": "password" ## 修改密码
}
},
"redis": {
"host": "127.0.0.1",
"port": 6379,
"db": 0,
"password": ""
},
"switching": {
"switch1": {
"enabled": false,
"algorithm": "sha256", ## 这是比特币工作量证明的算法
"ports": {
"3333": {
"diff": 10, ## 初始难度
"varDiff": {
"minDiff": 16,
"maxDiff": 512,
"targetTime": 15,
"retargetTime": 90,
"variancePercent": 30
}
}
}
},
"switch2": {
... ## 其它的挖矿算法,这里略过
},
"switch3": {
... ## 其它的挖矿算法,这里略过
}
}
},
"profitSwitch": {
"enabled": false,
"updateInterval": 600,
"depth": 0.90,
"usePoloniex": true,
"useBittrex": true
}
cd ~/unomp/coins
vi bcc.json
文件粘贴以下内容即可:
{
"name": "BitcoinCashBCC",
"symbol": "BCC",
"algorithm": "sha256"
}
在pool_configs文件夹下还需要编辑好一个相应币种的json,新建一个文件名bcc.json。
地址是要改成自己矿池服务器生成的地址(并注意备份好私钥):
{
"enabled": true,
"coin": "bcc.json",
"auxes": [ ],
"address": "13y2PJGyYJLUU2TsPMZoxHcXT6iSLtFuhZ", ## 挖出来的币先由这个地址保存,再按贡献度派发给矿工
"rewardRecipients": {
"19uNEdfLYZmnLXQktRj6wBPCapqtdCu3dw" : 1.0 ## 将1%的币发给这个地址,作为矿池手续费收入
},
"paymentProcessing": {
"enabled": true,
"paymentInterval": 600,
"minimumPayment": 0.01,
"daemon": {
"host": "127.0.0.1",
"port": 8332,
"user": "x", ## 与bitcoind的rpcuser和rpcpassword相对应
"password": "x"
}
},
"ports": {
"3032": {
"diff": 8
},
"3008": {
"diff": 64,
"varDiff": {
"minDiff": 8,
"maxDiff": 512,
"targetTime": 15,
"retargetTime": 90,
"variancePercent": 30
}
},
"3256": {
"diff": 4123456
}
},
"daemons": [
{
"host": "127.0.0.1",
"port": 8332,
"user": "x", ## 与bitcoind的rpcuser和rpcpassword相对应
"password": "x"
}
],
"p2p": {
"enabled": false,
"host": "127.0.0.1",
"port": 19333,
"disableTransactions": false
},
"mposMode": { ## mpos我没有配置
"enabled": false,
"host": "127.0.0.1",
"port": 3306,
"user": "me",
"password": "mypass",
"database": "ltc",
"checkPassword": false,
"autoCreateWorker": false
}
}
启动矿池 如果配置无误,现在可以正常启动了。
nvm use 0.10.25
node init.js
然后在浏览器 访问服务器的8000端口,一个矿池就搭建完成了。
用非root账号安装,导致启动失败,可以试下运行以下命令:
nvm use 0.10.25
npm rebuild
npm update
node init.js
如果服务器重启,矿池不会自动启动,按以下步骤运行矿池
第一步先检查bitcoind是否启动,检查区块同步
第二步:
source ~/.profile
nvm use 0.10.25
nohup node init.js >/dev/null 2>&1 &
./bitcoin-cli getwalletinfo
{
"walletversion": 130000,
"balance": 0.00000000,
"unconfirmed_balance": 0.00000000,
"immature_balance": 0.00000000,
"txcount": 0,
"keypoololdest": 1560044643,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"hdmasterkeyid": "61648c21139a50081c325e2821944f8f22be3dba"
}
immature_balance:已经出块但还未成熟的余额,比特币规定出块后100个块,铸币成熟方可使用
分叉(fork)是在软件开发的过程中,复制了一份代码并进行了修改,都称为分叉,即改出来的代码视为原来代码的一个分支。这是一种非常普遍的行为,在开源社区,任何开源代码都是公开的,任何人可以拷贝一份回来自己改,改出来一个不同的分支版本。把分支版本上传后,在你的分支版本基础上,其他人还可以继续分叉。
随着分叉的增多,一个软件的分叉呈现树形结构,有些软件因为参与开发的人很多,呈现出枝繁叶茂的分叉树形态。
在一个版本里面有很多修改,这个版本的差异跟上一个版本就会很大,一个版本有10个修改,跟有10个分叉,每个分叉有一个修改,从软件工程的角度,可以精确测试每个修改的变动,便于定位错误、测试、修订。因为开源社区,对同一份代码进行修改的人不同,而且互相不认识,所以不需要征得原作者同意,直接分叉出来,即可获得一份自己具有修改权限的分叉版本,等开发出来好用的功能代码,再提交给原作者审核合并到他的发行版本里面,或者自己独立发行。
我们人类对未知的探索需要有大量的摸索、试错、实验,我们无法预设一条完美路径,然后去走,在科学创造、技术研发领域,真实情况是万箭齐发,全面探索,然后最后撞到“大运”,发现(发明)了有用的东西。分叉允许不同的思路和方法并行探索,任何人都可以去探索一条路子,扩大我们未知的知识图谱,因为人类认知的天然缺陷,我们无法完美预见未来,所谓伟大的发明,都是一将功成万骨枯。在技术史上,我们看到很多大企业及其利益联盟展开的史诗级的技术研发,投入了巨量的资源,经过充分的技术和市场论证,结局仍然是遭遇史诗级的彻底失败,这是开源运动得以兴起的原因之一。
开源软件社区的协作是一种共产主义式的社会化生产,如果没有版本管理和分叉,是进行不下去的。以github为代表的开源代码托管平台,提供了完整的代码库版本和分叉权限管理功能,让全社会所有人,都可以从上面获得代码,并进行开发劳动、上传代码。不同的分叉独立探索,也可以合作,探索的成果还可以共享,探索的过程以子分叉的形式进行,而好的成果被合并形成主干分叉版本。
以Linux为例,有Ubuntu、Debian、Centos、redhat、fedoro等大的分类版本,还有桌面版、服务器版、嵌入式版、精简版、稳定版、测试版、不稳定版、预览版等等的子分类版本。这些不同的linux满足了不同场景的差异化需求。这类版本介绍在网上的信息很多,这里就不详细展开阐述。
比特币是由软件实现的,而且也是开源的。比特币的代码一样是枝繁叶茂的各种分叉。任何人都可以修改代码,形成自己的分叉。这些比特币的代码分叉,有一些功能会被纳入”共识版本”,被所有比特币的使用者所使用,而有些代码无法进入“共识版本”,只用于少数范围内的测试调试。
决定哪些代码纳入共识版本的因素有:
这些因素决定了绝大部分使用者同意的代码,才是共识版本。每一次共识版本的升级,都通过以上因素决定,到目前为止,比特币已经发布过几十次共识版本,相对于最初的版本,里面包含了至少几百项的改动和改进。
我们知道,比特币不仅仅是一种软件,我们更多的是把比特币当成一种“币”,如果每一种版本里面的“币”都不同,那么哪个是比特币,这个问题就产生了,而这对于比特币的“货币属性”是有极大的影响的,“币”的基础属性要求就是稳定和一致,随便印的币,会造成流通混乱,最后无法被信任使用。比特币通过“共识版本”解决这个问题,我们认为共识版本的比特币就是比特币。
代码不断迭代,共识版本有多个,如果不同的共识版本都是互相兼容的,老版本和新版本可以同时使用,所有的版本都保存同一种币,即比特币。而如果共识版本前后不兼容,麻烦就来了,老版本和新版本不能同时使用,新老版本保存两种不同的币。面对这种麻烦,可以争论到天昏地暗,上升到哲学层面去展开,包括什么忒修斯之船之类的哲学理论,都未必能够解决。
因为技术、哲学没法为这个问题提供确定性的标准,所以,基于现实(政治)考虑,目前比特币的共识版本升级已经确立了“永远软分叉”的技术升级路线,即每一个新版本必兼容老版本的共识版本。这不是某个人或组织主观的标准定义,而是多方政治博弈形成的事实上的形势。即一个新版本的(候选)共识版本如果不兼容老版本,导致老版本和新版本会形成2种币,那么这个共识版本基本上无法通过成为共识版本。详细的阐释见【论比特币“永远软分叉的开发路线”】
不用上升到哲学层面去解释,任何版本的比特币钱包,均只保存一种币,即比特币。是比特币获得“币”属性增强的有效手段,包含“存续时间信用”、“稳定形态表现信用”、“不可造伪信用”,这些属性对于货币都是极其重要的。
否则的话,比特币就很可能会成为“一种点对点的在线支付记账软件”,而不是“一种币”。理解这两者之间的差异,对理解比特币的分叉有至关重要的意义。“币”是什么,大部分人也许不能精确解释,但是绝大部分人都能感觉到“币”是什么。本文无意陷入经济学、哲学议题,只是对现状的关注和分析。
比特币的代码上的分叉是随意进行的,但能够被选择进入“共识版本”的代码,必须经过强有力的“共识决策”过程,不兼容的版本会产生两种币,乃至多种币,比特币的分叉已经超越了代码分叉、软件分岔的涵义,我们在谈论比特币分叉币逻辑和历史,不是讲比特币代码分叉的逻辑和历史,而是讲绕开共识版本制造“分叉币”、伪装共识版本、共识版本争议等分叉币的逻辑和历史。
任何复制了比特币代码,在做了修改之后发布的币种,均可称为分叉币。比特币的分叉币有以下三类:
复制比特币的代码并修改进行分叉,但从Block 0重新开始挖矿,“新币”和比特币没有交集,早期的莱特币、狗狗币、域名币、点点币,都属于这一类。
复制比特币的代码并修改,同时复制比特币的区块数据,在某个区块高度继续开挖新币,“新币”在block x之前的币属于旧币的持有者,而新币由矿工新挖。
比特币现金(Bitcoin Cash)、比特币糖果(Bitcoin Candy)、比特币披萨(Bitcoin Pizza)、比特币上帝(Bitcoin God)、比特币信仰(Bitcoin Faith)、比特币钻石(Bitcoin Diamond)、比特币黄金(Bitcoin Gold)、比特币原子(Bitcoin Atom),都属于这一类。
原链分叉币其实不是分叉币,它是“被分叉币”,是非常特殊的一种存在。目前为止,比特币并不存在原链分叉币,其它币种出现原链分叉币有ETC(ETH的原链)和BCC(BCH的原链),因为ETC已经硬分叉升级了,原链也不存在了,而BCC是目前唯一存在的原链分叉币,是我们研究的一个对象。A币分叉出B币,然后B币使用了A币的名字,这时候好像产生了一种新币X,其实它就是原来的A。
针对比特币可能发生的分叉,交易所会上线“期货”分叉币,充值1个BTC到交易所,可以兑换为1个BT1、1个BT2,然后两个币分别可以交易,这种分叉币其实并不存在,只是交易符号,bitfinex在2017年开过2次这样的盘子,其中Segwit 2X的分叉最后没有发生,所交易的B2X直接注销,也就说买了B2X这个交易符号的分叉币,在截止之日,如果没有事实上发生分叉,这种分叉币期货直接归零。BCH和BSV分叉的时候也有类似的期货,如果到期之后BSV取消了,没有创造出来,也是类似这种情况。
比特币在2009年产生,而在2011~2013年期间,已经有了数千种币,这些币大部分只是复制比特币的代码,并作了一小部分的修改,甚至只是改一个名字,就发布出来了。所以这些币,都可以视为比特币的分叉币。这类分叉币主要是复制比特币的代码,修订算法,发行总量等参数,各自的主链独立,但都没有复制比特币的区块数据,而是重新从block 0开始挖矿。这类分叉币均各自独立命名,各自规划各自的开发路线,被市场视为全新的币种,在2015年之后,随着用以太坊发行Token的兴起,有一些币种放弃主链条成为了以太坊上面的Token存在。
这一时期创造的币,在市值前100百名以内的,只有莱特币、狗狗币等寥寥无几的品种,其他大部分因为找不到存在的意义,已经走向消亡或式微。
2017年,以大矿工为主导的BCH分叉,是第二类分叉币的第一个品种,之后在一年内这一类分叉币冒出来45个品种甚至更多。这类分叉,因为将block x之前的“新币”空投给了比特币持有者,也因此获得了一些比特币的用户。
这两年创造的这批分叉币,大部分同样因为找不到存在的意义,已经走向消亡和式微。
所有的分叉币都有独立的名字,但是有一些分叉币展现出了宏大的理想,期望领先实现比特币的目标,并取代比特币的名号。在2017年BCH出现之后,它的名字是bitcoin cash,接着出现了BCH才是真正的比特币这个呼声,类似的呼声现在还有BSV才是真正的比特币。因此,展开了比特币夺名分叉的历史,这里面包含了一系列轰轰烈烈,甚至可歌可泣的奋斗历程。
我们知道,软件的分叉可以枝繁叶茂,Linux分为Ubuntu、Debian、Centos、Redhat等几大分支,每个分支还有很多细小的分支,但是这些分支都没有夺名的动机,都可以和平共处,共用Linux的内核,这种开源软件的名字,应该没有商标所有权的问题,没有任何一个公司、个人、组织拥有Linux、比特币的法律商标专利权。在软件分叉里面没有发生的问题,在币圈发生了,也证明了,币圈的分叉跟软件的分叉是有显著的差异的,在夺名的背后,是因为“币”的属性更要强于其软件的属性。
“名”本质上是虚无的,但对于“币”而言,“名”有现实上的意义,因为有了意义,便产生了争夺。从软件的角度,Ubuntu、Debian、Centos、Redhat都可以称自己为linux,没有毛病,同理,一千种分叉币,其实也可以称自己为比特币,也没有毛病。差别在于比特币是要花钱去买的,而linux是可以无偿使用的,所以比特币之“名”必然只能属于一种币,而不能属于多种币,用软件的思维套在“币”上,矛盾出现了。
比特币夺名的动机其实来源于比特币自身,比特币类似一个魔戒,它采用数学系统实现自身属于胜者的定义,算力最强者获得出块奖励。这种奖励系统背后的意图是制造一个博弈论上的囚徒困境,矿工拼死争夺比特币,但产出恒定,迄今为止,比特币的算力已经上涨千亿倍(12位数),但是10分钟一个块(统计学上的意义)没有变,矿工投入更多,所得没有增加,而且不增加还会吃亏,这类始于各国的军事竞赛,增加军备不会扩大领土面积,但是不增加也不行。比特币有一个解决“拜占庭将军的难题”的理论,使矿工可以合作团结出块,但却设置囚徒困境,使矿工无法达成同步减低算力的共识(现实中同步裁军也很难进行)。
深陷囚徒困境的大矿工联合部分利益群体开启了一项冒险事业,即重造一个比特币,以及发起夺名运动,这群比特币的囚徒发起了进攻。这第,是夺名动机的来源,不过矿工很快发现,重造一个比特币,消灭一个比特币,等于重现了原来的囚徒困境,两币齐挖、多币齐挖貌似更好。
归根结底,这是由于利益格局造成的动机,其他的各种理由和说法,都是服务于这个动机的。当有人发现夺名有好处的时候,就会夺名,当发现夺名没有实质好处的时候,就会取消夺名,今天夺名的动机已经从大矿工转移到了交易市场的投机者身上。在未来,一旦有人发现,树立比特币的唯一性正宗地位,具有潜在的利益,原来主张夺名的人,也完全可能转变为支持全力消灭分叉币。总而言之,随着形势风向多变,追求利益最大化的本质动机没有变。币圈的极端主义很多都是伪极端主义,根本靠不住,形势一变,完全可能来个180度大转弯。
在2016-2017年的时候,有一群人找各种理由让比特币硬分叉,表面上看起来是主张某种技术路线,产生了大量的争论,这些争论表面上看也是技术争论,但是我们知道,从来不会有人带领1000个不懂技术的人去linux社区争论内核的CPU线程优化机制,应该采取何种方式为佳。出现这种情况,解释来解释去的,归根结底是有深刻的改变利益格局的考虑,假如有人想好了,就是要制造两个比特币,一边一个,那么硬分叉原链算力高,他就会去挖新链,反过来新链算力高,他就会去挖原链。对于意图突破囚徒困境的大矿工而言,用什么版本不重要,分叉成两个比特币很重要。
比特币的产生是空前的,而后要再造一个比特币,显然很难,通过分裂然后进行夺名,则相对可行。夺名的最佳时机点,在于比特币有一个共识版本要进行升级,且这个共识版本里面包含了两种可能性(由算力或节点投票选择),选择的结果互相不兼容,也就是硬分叉的升级。在升级的时刻,算力兵分两路,分别选择两种可能性,最终产生了两种币,而且用的是同一版本的节点客户端,一个共识版本的客户端对应两条链条,谁是真正的比特币?可能彻底混乱了,谁是原链?谁是新链?开始吵翻天,在这种混乱之中,产生了一个极佳的操纵时间窗口,包括舆论、算力、节点都可能被引导,利用这个机会,营造出决斗的场面感,某一方利益群体可以一举夺下比特币名号。
所以说,强制性的客户端升级、同时存在不兼容的多种升级选项,都是风险,有人把这种观点称为硬分叉恐惧论,不管怎么表述,这种担忧是客观存在的。共识版本不能包含不兼容的选项,包含不兼容的选项,则无法形成共识版本,所以在一个共识版本里面,要写入两种区块大小的标准,且互不兼容,在社区有基本的理性的前提下,看不到通过的希望。
比特币在2017年最终确立了软分叉的升级路线,分裂无望,于是BCH直接出现了。BCH出现一段时间,开始有人把BTC定义为BCE,然后也没把BCH称呼为BTC,更多的是称呼为BCH,这种思路脑洞是有点大的,但也挺新奇,让人看到感觉眼前一亮,我有时也在网上搜集BCE的信息。还有人把BTC称为Bitcoin Core,后来真有人做了一个币称为Bitcoin Core。
到了2019年,分叉自BCH的BSV出现了,BSV并没有主张自己是正宗的BCH,而是主张自己是正宗的BTC,在很多关于BSV的文章的前面,一般可见这么一句话:下文的BTC指的是BSV的BTC,不是那个你懂的BTC的BTC。这个逻辑浅显易懂,比BCE有了很大的进步。
没有谁能够规定哪种币应该叫做比特币,这其实是一种约定成俗,所有人都同意某种币称为比特币,其实也没有人反对,一小部分主要另外一种币是比特币,就要经过奋斗乃至战斗,去争取其他人的支持,让他主张的那种币被绝大部分人认为是比特币,比特币对此没有意见,而这类人除了有发财的想法之外,其实也没有其他的想法来实现他的目标。
哪种币应该持有比特币之名没有一个硬性的标准,比特币的创立者(早就跑路了)也没有制定这个标准。在比特币圈子里面,主要有以下各种说法:
其实这些说法,也没有绝对的共识,后来又有了支持大区块才是比特币的说法,BCH的区块大小为8MB,后来逐步扩容为32MB,而BSV一步到位扩大到了128MB,大有以区块大小论比特币的感觉。这些逻辑,总归是有一部分人相信的,所以只要有人信了,就有市场,所以在夺名运动中,只要有一个逻辑有人认可,就会有人想办法迎合这个逻辑,BCH直接延用BTC的难度系数,这样看起来它就很像是比特币的一次共识版本硬分叉,但它改了难度调整方式,迅速下降了难度,又有点不像了。BCH因为宣传了大区块的好处,逐步扩容到32MB,但实际区块利用率只有0.3MB。
这些关于比特币的标准,我们不知道哪种靠得住,夺名者也很难自圆其说,有些说法如同儿戏。
从常识角度,凡是“币”在稳定性和一致性方面有很刚性的需求,这是其信用价值的基础,比如白金,各方面指标比黄金好,但是黄金毕竟流行千年,在货币信用这方面,黄金是强于白金的。比特币因为有先发优势,且逐步确立了永远软分叉的技术路线,大体上来说,其各项指标优势,只要没有被全方位超越,其积累的时间信用极有可能成为事实上的标准。
在中国的历史上,六祖慧能终止了佛教的衣钵传承,即六祖之后便无七祖,他认为得到坛经的人,人人可以具见自己的佛性。衣钵就是佛教之名,名是为虚,终止传名,而转为传实,是慧能大师对佛教的巨大提升。同理,只有不再追求比特币之名,才能够回到提升比特币之实的道路上来。谁能够夺名成功?一定是放弃了夺名的人。
在币圈原链分叉币的出现是非常麻烦的事情,如【论比特币的永远软分叉开发路线】所言,永远软分叉从技术上可以规避原链分叉币的出现,而硬分叉的升级,每一次都可能会导致原链分叉币的产生。
我们今天看到,其实产生的原链分叉币也不多,是因为原链分叉币的产生有几个前提条件:
比特币任何一个共识版本的升级经过广泛的社区化讨论和论证,在没有新的共识版本推出之前,或者推出的共识版本里面没有需要决定激活的修订选项,所有矿工只能挖原链一种选择。比特币具有去中心化的形态,不能随便推出一个版本就成为比特币共识版本,上一次扩容升级,争论了整整2-3年,最后软件发布了,还耗费了整整一年多完成了算力投票、激活,而且这还是软分叉升级,共识版本里面并没有存在不兼容的选项。在比特币领域,共识版本的硬分叉升级,已经有6年没有发生了,且可以预见接下来相当长时间也不会发生。而在BCH和BSV阵营,也在对硬分叉的升级路线进行反思,不排除也会转变升级方式,所以原链分叉的产生机会其实不多。
算力投票都是有成本的,一般来说矿工倾向于抱团作战,投入相同的成本分别获得两种币,差价数十倍,显然,都会扎堆去挖高价的币。挖矿都是真金白银的投入,因此除非有非常显著的分歧,否则分叉币很难诞生出来。有很多时候,分歧本身并不重要,而是有人期望有分歧,这跟现实一样,挑起战争的一方都会宣称自己是正义的,而结束战争的手段也必然是战争,利益格局的变动,哈希战争目前还看不到完全消停的时刻。
比特币的算力难度是13位数,有50E的算力投入,才能够10分钟挖出来一个块,BCH的算力难度是12位数,有2.5E的算力投入,才能够10分钟挖出来一个块。要知道1E=1000P,1P=1000T,而现在顶级的矿机算力为50T/台,这样的矿机有100万台在挖比特币,5万台在挖BCH。而比特币的算法是2016个块调整一次难度(约14天),一条分叉链条,难度系数没有调整,要出块需要很大的算力支撑。新链条(硬分叉)可以修改降低难度,或者自动调节难度的机制,而原链条是老版本代码,总得用原来的难度继续往下挖。如果只有10%的难度投入,那么需要140天~280天时间才能够恢复正常出块,技术10%成本是巨大的,算力获得的产出奖励也变小了。如果是1%,那么难度调整的周期长达1400天~2800天。
BCH对于比特币而言是新链条(硬分叉),难度系数不变,但采用了EDA机制,进行难度调节,这是其能较快恢复出块的原因(在算力低的情况下)。而后该链条在下一次硬分叉升级的时候,继续出块,也是依赖了这个机制,目前使它成为了一条原链。
比特币的分叉历史上,“币思维”是完全占据主导位置的,而“开发思维”、“技术思维”是其次的,如上所述,更多的分叉、更多的开发路线,对于比特币的研发而言,是百花齐放,多路探索,从进化论角度,这增加了获得成功的概率。
用“技术思维”和“开发思维”去看待每一条链条,都可以进行摸索,而且有其独特的开发价值。比特币的创新是突破性质的,但是我们知道人类的突破性创新,都是厚积薄发,哪来天天有革命性的成果,无数细微的迭代累积和生态化反,最终可能产生有价值的应用场景,即使没有找到有价值的应用场景,任何技术的探索都可以成为人类知识库的储备。中本聪正是在密码学领域寻找到了新的应用场景,并将之实现,在他没有实现之前,不能说这些数学的知识储备毫无意义。币圈的各种经验主义、教条主义,与这些朴素的发展观有矛盾,都是需要批判和反思的,以求进步。
随着我们对“币思维”的总结和反思,技术中立论、知识中立论有必要重新得到认真的看待。
分叉币之间的斗争是客观存在的,类似军阀混战时期,还没有一种强而有力的“主义”,可以实现求同存异,将各种势力统战到一个目标里面。比特币社区已经是一个大型“组织”,稳定的路线和激进的路线的并行探索本不矛盾,放大到整个社会,其实比特币仍然是很“弱小”的一个APP,绝大部分人并没有实际使用比特币,作为一种社会化的实验,比特币社区的实践范围应该是面向整个社会的大社区,而不应该着眼于所谓币圈的小社区。
分叉币的纷争,很多都是币圈小社区内的乱战,给社会造成的观感是混乱,对于面向社会的大社区这个概念而言,没有太多的增益。通过对分叉币的研究,我们认为很多币的产生是基于自私,但是自私也是一种力量的来源,而且这种来源稳定且充沛,使很多事务不会流于乌托邦式的空想。换个角度说,这也是比特币发展起来的主要力量来源。基于现实的考虑仍然是第一位的,新一阶段的社区治理策略在这个基础上,可以实践一些更包容,更符合个体利益、小社区利益、大社区利益、以及整个人类社会利益的治理模式,按需使用通证,面向技术,面向价值,面向未来,打破狭隘的单一币思维,所谓原链和新链、分叉,均可以包容并发,更加开放。当然回归现实,这不是靠批判的武器来实现,而是需要通过实打实的武器的批判,来推动这一转变的发生。
本文尝试从客观事实入手,分析比特币的“永远软分叉路线”是否已经在事实上确立,并且分析该路线形成的可能性来源,以及进一步探讨该路线的未来发展。本文有意避免直接引用大量的技术文档,以免使本文的易读性下降。如有错漏,欢迎指正。
回顾一下比特币的的共识版本历史,我们看到在2013年3月份(0.8.1版本)之后,比特币共识版本已经没有再进行过任何一次硬分叉:
TENTATIVE semantic version number | Software release | Change type | BIP(s) |
---|---|---|---|
0.1.0 | wxBitcoin 0.1.0 | original | NULL |
0.1.1 | wxBitcoin 0.3.1 | softfork | mostly-redundant 1 MB block size limit |
0.1.2 | wxBitcoin 0.3.5 | softfork | fixes CVE-2010-5141 |
0.1.3 | wxBitcoin 0.3.6 | softfork | OP_NOPs made explicit |
0.2.0 | wxBitcoin 0.3.7 | hardfork | scriptSig + scriptPubKey evaluations separated |
0.2.1 | wxBitcoin 0.3.10 | softfork | fixes CVE-2010-5137 and CVE-2010-5139 |
0.2.2 | wxBitcoin 0.3.12 | softfork | fixes CVE-2010-5138 |
1.0.0 | Bitcoin Core 0.6.0 | softfork | fixes CVE-2012-1909 |
1.1.0 | Bitcoin Core 0.6.0 | softfork | BIP16 |
1.0.1 | Bitcoin Core 0.7.0 | softfork | BIP34 |
1.0.2 | Bitcoin Core 0.8.1 | softfork | fixes CVE-2013-3220 by adding txid change limit |
2.0.0 | Bitcoin Core 0.8.1 | hardfork | removed BDB lock limit & txid change limit |
2.0.1 | Bitcoin Core 0.9.2 | softfork | BIP42 |
2.1.0 | Bitcoin Core 0.10.0 | softfork | BIP66 |
2.2.0 | Bitcoin Core 0.10.4 | softfork | BIP65 |
2.3.0 | Bitcoin Core 0.12.1 | softfork | BIP68, BIP112, BIP113 |
2.4.0 | Bitcoin Core 0.13.1 | softfork | BIP141, BIP143, BIP147 |
2.4.1 | Bitcoin Core UASF 0.14.0 | softfork | BIP148 |
2.4.2 | Bitcoin Core 0.16.3 | softfork | fixes CVE-2018-17144 |
至今六年,比特币的共识版本一直且只进行软分叉,对于此形成直接的结果就是:
BIP是比特币的改进草案,凡是涉及功能上的变更都首先会以提交BIP草案的形式进行技术论证,我们查阅了近两年的BIP,大体上有如下情况:
基于以上情况,我认为比特币的共识版本开发的“永远软分叉”路线,已经得到事实上的确立。
在比特币必然要进行硬分叉的可能性来于:
除了这两种情况,比特币没有其它情况必然需要进行硬分叉,在协议底层协议稳定之后,关于比特币升级的功能,包括并不限于:
均可以同时采用软分叉或硬分叉的方式进行升级,也就是硬分叉不是必要的,用软分叉也可以实现这些功能的升级。软分叉可以将中本聪协议修改为绝对最小(可能除了少数涉及块头,如SHA256 PoW和Merkle Tree),并实现一组全新的规则。
随着比特币解决掉早期发现的bug,在稳定运行的情况下,进行硬分叉的必要性消失殆尽。
比特币的成熟过程中,参与各方的核心动力转向经济利益,如其他研究者所指出,这是成熟政治格局的基础。“这种成熟生态强调的核心是给各方带来持久的经济利益,其他如去中心化、安全、便利、自由、抗审查等都服务于此,并因为有利益支撑才能够长期保持。”也就是说接纳比特币的人群在扩大,经济利益是主要动因,使比特币进一步融入社会经济系统。因此比特币的代码迭代,从技术为主导逐步转向政治为主导,这类似于国家建立之后,从军队管制逐步过渡到行政司法立法体制。
早期的比特币由少数的技术人员把控,有什么修改直接就发布了,随着社区的壮大代码审计流程越趋严格。作为开源项目,任何一个人都可以发布比特币的代码,节点软件。但这些软件是否被认为是“比特币”,是一个关键的问题,因为比特币有很多“分叉币”(关于分叉币的历史将另外整理),这些分叉币都不会被认为是比特币。比特币的社区经历“制宪”流程,相当去中心化,中本聪消失后并没有实质上的控制人,它能够运行良好,在于其核心机制是靠数学,即区块链即治理,由算力自行决定比特币的版本选择。比特币代码的部署大体上是这么一个流程,这个流程并非唯一的标准,而是经过多方博弈之后形成的事实:
看起来挺复杂的,但相当科学,可保证三个透明及代码安全:
政治由各种纷繁复杂的路线分支组成,因为利益动机的不同,任何一个改动,都可能陷入无休止没完没了的争论,不同的政治主体、政治主张,他们之间互相攻击对方激进、有风险,以及主张自身更符合比特币的远景目标,同时展开激烈的控制权、话语权争夺等等。社区政治化,是比特币发展遇到的最大挑战,也是必经之路。
比特币社区的政治活动广泛展开后,促成了“永远软分叉的技术路线”得到了更广泛的认可,这不是某个人或少部分人的主观意识决定的,而是被公众寻找出来并认可的最大公约数。因为比特币首先是一种“币”,如上所述,参与各方的核心动力转向了经济利益,在对比特币的属性定位上,绝大部分人认为它是一种“币”,而软件只是是其实现方式。任何代码的发布,用户最关心的是它会不会分裂成比特币A、比特币B,假如新版本与旧版本不兼容,现有版本的钱包里面的币还是不是比特币?谁说了算?凭什么他说了算?等等这些问题都会浮现出来。政治不是无源之水,需要面对现实,顺势而为,任何成为主流的政治路线,都必有其群众基础。
任何政治主张,政治路线,不管其理念如何高远、伟大、光明、正确,如果在政治实践中,没法走通,都不足以成为有效的政治路线。而选择“永远软分叉”的路线,在经历2017年比特币社区的路线政治斗争之后,被实践出来,是可以走通的。
在2017年之前两三年,比特币社区一直在研究“扩容”的议题,因为网络爆满,这当然是好事,是用户量增加的结果。不同的技术力量和参与者,均展开了研究,提出了各自不同的见解和方案,中间当然也有互相磨合的情况,最终分岐聚焦在2个核心问题上:
其中扩区块大小是硬分叉方案,而隔离验证是软分叉方案。软分叉方案我们知道升级后,老版本还是可以用的,新版本、老版本都是同一种币,必然是比特币,而硬分叉方案,是新老版本不兼容,升级后,有一种风向,就是新版本是一种币,老版本是一种币。但是主张的双方都在提出各自充分的理据,争论非常激烈,旷日持久,到了2017年的时候,其中隔离验证的技术,已经形成了完整的BIP(BIP141),激活方法,代码开发,这证明该技术经过了严格的论证、审计和测试,而大区块硬分叉扩容方案,迟迟没有看到明确的BIP,技术开发的进展较慢。
客观情况,也就是实施隔离验证的成熟度高于扩大区块大小,当然在主张者眼里,这不是问题,改几行代码的事情,没必要搞那么复杂,其实这是因为大部分比特币的参与者,以前并没有参与过开源社区的运作,参与比特币是基于经济动机,并不了解开源软件的运作。隔离验证在2016年年底全部代码就部署完毕了,其实这是一次软分叉,并且设置了95%矿工算力投票支持才会激活,看起来对现有用户没有实质性的影响,但是社区里面有大量的攻击,到2017年3月份的时候,投票支持的算力只有45%,显然,有一大半的矿工在犹豫,担心这次决策会有问题。当然,没有投票支持激活的矿工,也不见得就支持大区块扩容,只是隔离验证的部署进度已经走在前头。对于硬分叉的方案,在社区里面一样有大量的疑问,比如硬分叉后,怎么保证不会分裂为两条链条,产生两种币,而主张这个方案者,往往只能给出口头上的保证,绝对保证,按着胸口发誓,我们一定不会去挖原链,产生两条链条,而没有技术上的保障,实际上也没法给出技术上的保障,因为硬分叉确实存在两条链并行存活的可能性。我们知道在政治活动中,这种口头保证,其实很难形成实质的说服力,而分裂比特币为双币的动机也是存在的。所以大区块的硬分叉方案也没有形成优势,双方处于胶着状态。我们到此看到的是软分叉方,有45%的算力铁票,而另外55%里面有一部分是中间派,以及一部分支持大区块硬分叉。按照一般政治经验来理解,算力的基本面在支持隔离验证上。
声音太大太杂,不同的表述方式呈现出截然不同的真相。对立双方的选择,如果真相于己有利,则要尽力拨开真相,展现最全面的真相,而如果真相于己不利,则要搞乱局面制造迷雾,最终目的是一样的,就是让大众跟随己方。这种情况很常见,在BCC硬分叉的时候,有一批媒体一面倒地采取官方制作的宣传稿,说硬分叉是不存在分裂出双币的任何可能性,而另外一方则在积聚算力,全力挖掘以继续出块。到这一步,摆在双方政治家面前的目的已经很清晰,一方要逼出真相,一方要全面搅浑。很多时候,我们不知道哪一方是对的。声音大的一方,未必拥有很大的支持率,但是我们没法判断,在获得明确的信息之前,中间派会处于观望摇摆。
2017年3月12号,软分叉路线这方推出了BIP 148,即UASF,由节点发出信号激活隔离验证,节点强制部署,不支持隔离验证的矿工,会导致出块不被支持BIP 148的节点所抛弃。这类似一种投票,让世界上全部的节点自行选择。这种投票一发生,真相就完全浮出水面,有多少节点支持马上部署隔离验证就出来了,那些有影响力的交易所、开发公司的选择也会摆在台面上可见。这个方案出来后,大区块方迅速做出了妥协,不愿意看到这个投票发生,组织了一批公司代表开会,提交了一个临时提案,接收隔离验证方案,并提出未来再投票决定扩大区块到2MB的诉求。在网上看到支持硬分叉的人写的“即便超过 80% 的人都认为应该扩容,并对 core 团队有很大意见,但真正到了分叉的时候,绝大部分人是反对分叉的”,即大区块硬分叉方案的支持方,很清楚真到了投票,硬分叉的低支持率会现出原形。
根据这个临时提案,双方约定在8月份(BIP 148投票发生)之前,部署BIP 91,仍然由算力进行投票,投票达到80%,即激活隔离验证,然后再在11月份投票选择是否扩大区块到2MB。这个BIP 91证明,比特币社区的不同主张,已经有了实践上的争议解决办法,对立双方的提案都进行了表决。结果BIP 91很快超过90%算力支持通过,隔离验证软分叉激活上线运行,证明55%的中间派看清楚了情况,消除了疑虑。到了11月份的时候,扩大区块到2MB的版本也被开发出来了,但没有矿工跟进支持,支持率接近为零,因为大区块的支持方,已经在8月份看到硬分叉无望之后,自主选择出局,去做了独立的BCC/BCH。关于大区块方的利益动机将另外总结。
回过去看,软分叉开发路线在社区政治的实践中积累了很多的经验和成果,被论证是可以走通的。
市场对比特币解决了区块扩容争议,给出了正面的响应,2017年8月之后比特币的市值走出新高。比特币保住了原链的延续性,确保了比特币始终保存在所有版本的钱包里面,所有版本的钱包里面只有一种币,必然就是比特币。
市场的认可情况,对于永远软分叉路线的确立起到了进一步强化的作用。反向地想,比特币的市值被任何一种其它类似的币种大幅度反超,则一定会引发这条路线的彻底反思,甚至被颠覆。市场的声音,一定会影响社区的政治,而社区的政治一定会影响技术开发路线。
比特币有三种投票机制:节点投票、算力投票、用钱投票,前两种是显性的,最后一种也是显性的,很多不看好BTC升级的人,会选择直接卖出BTC,而支持的人可以买入,而且砸钱可以买算力。某种程度上,谁的钱都不是天上掉下来的,所以这种投票也是很客观的。BSV的创始人说要用钱攻击BCH,就是这个道理。比特币的扩容争议尘埃落地之后,如果引发大面积抛售,市价跌倒几十块钱,则会引发升级路线的彻底反思。
凡是投票,都是多数人的暴政,即大多数人投票支持,少数反对的人需要服从,有人指责比特币即使95%以上的支持率的投票,也是对少数人的暴政,是有一定道理的,但如果5%的反对,反过来要求95%服从,好像也不合理。事实上,软分叉的升级,用户可以选择保留老版本,这种多数人的暴政,反倒是更容易出现在硬分叉的升级路线里面,老版本无法兼容,几乎没有回旋的余地。支持硬分叉的人,有一种理论,不用怕发生分叉,市场可以自由选择原链还是新链,而实际上,市场应该有三种选择,不要分叉、原链、新链,剥夺了不要分叉这个选项,也谈不上自由。所以这三个选项并行存在,市场自主地做出选择,我们再根据市场的客观情况来总结。如果市场不是选择不分叉,而有人操纵并通过了不分叉(软分叉)的方案,那么市场应该会出现用脚投票,迅速引发崩盘。
回顾过去,我们尝试表述事情的真相,是市场的诉求和软分叉的升级路线是吻合的,软分叉升级路线在政治上的力量和群众基础,恰恰来源于市场的诉求。
比特币的“永远软分叉”路线,目前没有其它路线可以完全替代它。我们把比特币视为一个社会实验,完全有多条路线去摸索。同样实现区块网络的扩容,可以扩大区块大小,也可以采用辅助块,也可以采用隔离验证构建二层网络等多种思路,哪种思路是对,哪种思路是错的,在结果出来之前并没有结论。从进化论的角度,分裂分化,是增加了成功的概率,任何一条路线达到目标,都是成功,同样从进化论的角度,每条路线都可能进化出其独特的生存能力。
我们不能说支持某条路线,就完全否定另外一条路线,而是每条路线都有其存在的意义,A路线不可以被B路线替代,反之亦然,B路线不可以被A路线替代。还是用进化论的角度来看,某些路线可能会到某个程度消亡,自然界的物种消失的很多,但在其消亡之前恐怕没有人可以预测,而消亡的物种可能其从属的大分支还在蓬勃发展。
“永远软分叉”这条路线目前没有被替代的迹象,而且是比特币的主流思潮,比特币的参与者并非传统开源软件社区建设者,已经渗透到了政治、经济、法律等领域,不是所有人,但是参与的很多人认为比特币是一种“币”,即使没有严格的标准定义,但是认为它是一种“币”的比重远大于它是一种“软件”。且很多人认为比特币只有一种,只有一种币可以称为比特币。我们从研究的角度,可以建立一个“比特币社会实验”的概念,把各种相关的币种都纳入到这个研究范围。但是,市场认可的是事实上的比特币只有一种,这也是客观情况。
这些堪称朴素的想法简单推导出来,形成一种思潮,即认为比特币本身不作死,不要硬分叉,甚至不做改动,什么都不用做,也是一条路线,稳坐先发优势,它自然会慢慢地前进,接近这个目标。随着比特币多次减半,在10几年后如其手续费收入和区块奖励持平,网络仍然可以正常运行,则其千年大计的帷幕缓缓拉开。而任何对它的攻击,都定性为是要“窃取”比特币的价值。这种思潮就是这么自然形成的。“永远软分叉”与这种思潮是高度吻合的,反过来说,“永远软分叉的技术开发路线”是这种政治核心诉求在技术层面的外在表现。因为有这种诉求,才会有这种路线。
在更宏大的视角来看待比特币实验,不同的路线各有优劣,择路而行,任何一种实践摸索都是有用的。不要去主观及贸然地下定论,保守未必是真保守,演进未必是真演进,再次用进化论的视角,有些激进的进化分支反倒最后返祖变弱了。进化具有随机性。有一条路线比如打出探索创新的口号,一开始肯定能吸引眼球,这种激进的创新如果迅速找到爆点,产生了杀手级的应用,或者极大地丰富了生态,当然会得到大量的认可,但是,如果一年过去了,两年过去了,没什么突破性的进展,折腾不出啥东西,喊口号的一方反倒会丧失信用,以至凉凉,被人指责如同儿戏,很多项目前面喊下的口号都是负债,迟早要还。
永远软分叉路线的思想、实现方式、政治实践是完整的,它让比特币作为一种“币”长期存在,用远至千年的眼光,朝着一个明确的目标和方向,逐步前进,可以说是保守,也可以说是稳妥。即使是同一个人,在做一个决定,也会留一条后路,保留一种可能性,总而言之,这条路线目前稳步前进,没有看到任何路线可以替代这条路线。在客观形势面前,攻击这条路线不妥,并且另立路线者,也不得不承认这一点。
比特币渡过了早期底层基础架构期,随着社区政治的成熟,永远软分叉开发路线逐渐得到确立,并且经过一系列的政治实践,论证了这条路线行得通,而市场的认可使这条路线得到进一步强化。经过批判和反思,我认为此路线已经确立起来,且在相当长的一段时间内,没有被撼动的可能性。
技术上的结论,一旦出现极端情况(虽然概率极低),软分叉是随时可以回退的,而硬分叉的回退必然引发新的硬分叉。对于安全性的辩论,甚至可以一直上升到哲学层面,有很多时候,不改变现有的状况,被视为是安全的,这符合人的常识思维,而有些时候,认为随机应变才是安全的。做研究的时候,我们经常发现两种截然不同的观点和论据,努力从中间找到其统一点,举出一个双方都无法反驳的结论,是为共识。
比特币在实施隔离验证之后,Craig(俗称:奥本聪)认为隔离验证会增强51%攻击的动机,他举了一个例子,矿工集团发起51%攻击,然后发出信号,回滚到不使用隔离验证的版本,进而窃取隔离验证交易的资金。他的这种想法,基于比特币安全的核心壁垒51%攻击的安全门槛没有变,其实相当于有人已经占领了银行的金库(51%攻击),可以直接把钱运走,有钥匙开门不用,还要上演一出密码破解。不过这个例子,告诉我们一点是明确的,就是软分叉是向下兼容,随时可以回滚。老版本还能用,新版本万一不安全,还可以用回老版本,用户随时可以选择。而硬分叉则不是这样的,新版本不能用,则必然要升级更新的版本。在查资料的时候,发现网上有人用一些主观色彩很浓的说法,区块污染之类的,都是不符合这种客观情况的。这是两者之间的回退弹性空间的差异。
“永远软分叉的比特币”更像一种“币”,而“硬分叉的比特币”更像一种“软件”。如第二部分所述,大部分参与比特币的人群,基于经济利益动机,来源非常广泛,并非软件开源社区人员。所有版本的钱包只装一种币,而不是所有版本的软件,每种软件的币都不一样,是多种币。这是一种很简单的理解,而且随着非技术人群的扩大,怎么去向普罗大众说明软件分叉的技术,负担是越来越重。而所有版本的钱包都可以收发一种币,即比特币,就没有这种负担。
比特币作为人类社会的一种实验,它的竞争对手是黄金及其它货币,需要在一个千年的时间内去对比,持久性(durable)和持续的历史,需要具有某种永久的特征,以在人类社会建立“币”的信用。软件功能是服务于“币”,如果基于这个目的去发展它,让它成为“币”,它不能只是作为软件,随意地硬分叉,币是要求稳定的,人民币上不能天天增加二维码、全息图像等功能,增加可以播放视频地功能。
假设要实现相同的功能,软分叉的技术实现难度普遍高于硬分叉。硬分叉可以随便改随便编,而软分叉必须基于能够向下兼容,这个大前提。这其实攻击软分叉的一个理由,即软分叉导致开发的门槛很高,只有高手才能玩。相当于科学只有科学家才能玩,其他人玩不了。本质上,软分叉再难,属于党指挥枪,技术必须服务于“币”的这个目的,而不是技术人员说实现不了,必须硬分叉,否则编不下去,然后枪反过来指挥党。
最近的一些软分叉方案(草案),包括Schnorr签名的采用声称给予了网络具有显着的可扩展性和隐私增强功能,因为它们将允许更简单的方法来签署交易。Bitmex Research估计,如果完全实施,使用Schnorr签名可以仅基于UTXO计数节省13.1%的空间。Taproot解决了原始Merkle树的低效率和隐私问题。去年的更新包括改进输出脚本的描述符,以及提供一种新的计算机编程语言PSBT。目前看到的,bitcore core的更新沿着软分叉的路线在进行。
包含矿工、基础设施、研发及应用开发、交易所,现在全球大概有1万个比特币全数据节点(不是钱包),另外有8千多个闪电网络节点(第二层)。如果用硬分叉升级的话,每一次升级,都会引发巨大的网络振荡,即旧节点需要升级,然后收敛同步新的区块数据。到目前为止,网络上有87种不同版本的节点客户端,其中升级到最新版本0.18.0的只有1/3,但是其他版本都还在发挥作用。
对于去中心化的社区而言,没有一个统一的公司组织整体升级,硬分叉升级会使一些节点脱离网络(没法同步数据),对于一个公司组织的统一的升级,则没有这个问题,但不利于社区生态的扩大。
现在有一种分析总结,将永远软分叉的路线归结为理性主义,而硬分叉的路线归结为演进主义。是有一定道理的,即软分叉符合一部分理性主义的特征,而硬分叉符合一部分演进主义的特征。理性主义不仅提供了确定的目标,还提供了简单清晰、易于理解的,很有确定性的实现路线,容易激人奋进,获得大众认同;与理性主义相比,演进主义认为人的理性是有限的,甚至不认同普遍普适真理的存在,认为人类是在一次次短期判断、试错和经验中积累起暂时有效的知识和制度,需要不断通过变革适应外部环境、解决内部问题。重要的不是制定长远的规划,而是充分利用历史积累的知识和制度,不断地优化每一次近期决策。但也不完全是这样,软分叉的升级并非没有演进,而硬分叉也不见得没有确定性。
总而言之,两者的目标其实是一致的,这一点我们要承认。
整个比特币社区经过多年的实践和经验积累,包括理论上的研究深化,对永远软分叉路线的认知其实也在扩大和加深。甚至已经影响到了硬分叉路线的支持者。主要有以下两点体现:
其一,BCH社区出现了回归经典路线的呼声,这个呼声的代表就是Craig博士(CSW,俗称奥本聪),他说
我们不知道BSV会不会彻底倒向永远软分叉路线,而且其本人从未主导过比特币的开发,很多技术见解流于表面信口开河,但稳定底层的声音是在加强的。
其二,分层实现的可能性正在落地,比特币的闪电网络进展良好,容量扩大数十倍计。而吴忌寒也在推特中强调基于底层协议,推进无需许可的二层创新。底层的稳定是扩大生态的重要一环。
对于硬分叉而言,每次升级都如临大敌,匿名算力投入开挖原链,始终是一种威胁,主导技术升级的人还需要耗费巨额算力成本进行保卫,而且不得不将区块重组描述为”挽救丢失的区块”等。这让我们意识到稳定底层更多的现实意义。
犹如政治上划分的左派和右派,会细分不同的流派,左派里面一样可以细分出左派里面左派、左派里面中间派、左派里面靠右派;所谓极左和右倾,反之在右派里面,也一样。在软分叉的路线上,在技术上其实也有激进和保守之分,有一些非常激进的软分叉方法,比如创建辅助块进行扩容,将区块奖励放入辅助块。包括Craig博士的主张,要把几十上百项更新全部回退回去,取消BCH的全部更新,无疑属于永远软分叉的极左路线,这条路线倒是很像现在炒币人群的理念,只要是个币就行了,其他的一切都是白费力气。
应该说涉及到比特币的共识版本的变动,特别是底层规则的修订,整个社区都会非常谨慎,在终目睽睽之下,任何能够上线更新,总结来说具有以下特征:
这些特征不是某个人具体规定出来的,而是经过实践及多方博弈,形成的事实上的一种状况。其他的用论坛投票,召集公司开会签约,都是没有用的。这些特征,决定了某些激进一些的软分叉技术,要在比特币进行上线,也是困难重重。因此,不排除,一些差异化的开发路线的建立、研发、尝试,会有不同社区或项目逐步细分出来。
我们大概听说过很多关于黑客进行区块链51%攻击的报道,比如ETC、BTG在2018年前后,都遭受过51%攻击,其中BTG据说被干掉了38万枚交易记录。但是,我们很少能看到攻击的详细操作细节披露,本实验以BCH原链为基础,在真实的全球网络环境下,完全实战了一次51%攻击,本文将会讲解这次实验完整的操作步骤和细节,并且就攻击的博弈和经济学意义做一些分析。
攻击效果截图:
攻击发生前的最后一个区块截图记录(已经消失):
最少需要2个节点主机,本实验采用2个虚拟机系统,Vmware装Ubuntu 18.04 LTS Server(64bit),各500GB硬盘
可以设置访问控制列表的网关,Ubuntu本身可以设置防火墙,但是我的网络接入设备是Cisco交换机,访问列表是在这上面做的,用于分隔攻击链和诚实链
矿机若干,详细需求见算力测算部分
2个节点主机均同步到最新的区块高度
2个节点主机放在一个独立的VLAN内,网关设置访问列表,只允许与特定主机IP通讯,比如矿机IP、SSH登陆主机IP,其它的访问一律禁止,只样是为了将2个节点主机隔离开。允许通讯的特定主机,均不能运行节点(否则导致隔离失败)。
在2个节点主机中的一台安装CKPOOL矿池服务,用于出块(攻击链),不安装矿池采用Solo挖矿也可以。
算力测算主要用chainwork计算进行,具体计算办法,[最新区块的chainwork删掉最后8位]-[攻击回滚目标的chainwork删掉最后8位],得出一个数值(先把16进制转10进制),该数值即累计难度差。
本实验的攻击前的区块高度是814652,攻击的目标是“删除”762048之后的全部区块,这两个区块之间的累积难度差很低,只有400多万。
有一个简便的算法,难度10000对应的算力大概是75G/10分钟,400万难度差需要调用的算力是75G*400=30T,也就是有30T算力,只需要10分钟时间,就可以追上这个难度差。这个算法是简便的,实际中还需要考虑上诚实链的也在出块增加难度差。
在网关路由器上,关闭2个节点的对外通讯,这里用的Cisco路由器配置,也可以用其它的方式实现网络控制:
!
interface Vlan11
ip address 10.1.102.1 255.255.255.0
ip access-group vlan11-in in
!
Extended IP access list vlan11-in
30 permit ip any host 10.1.101.110
40 permit ip any host 10.1.101.11
50 deny ip any any
控制这两个节点只能与矿机或指定IP通讯,限制其访问任何外网节点。矿机由多台,则依次添加允许IP。
比特币的节点自带隐藏的区块操作命令,invalidateblock,用这条命令指定具体的区块为无效,比如指定区块100为无效,那么100之后的全部区块就会全部无效。我们的目标是期望762048区块及之后区块均重新挖矿,因此查询该区块的hash值为:
000000002b7ad68e8528c20ec8bc8366cdd9a8c2db2b4050e0c9f2c9e39603b0
在两台节点均输入以下命令:
./bitcoin-cli invalidateblock 000000002b7ad68e8528c20ec8bc8366cdd9a8c2db2b4050e0c9f2c9e39603b0
这条命令没有输出,等其运行完毕,运行getinfo查看,确认区块已经回滚:
./bitcoin-cli getinfo
{
"version": 150100,
"protocolversion": 70015,
"walletversion": 130000,
"balance": 0.00000000,
"blocks": 762047,
"timeoffset": 0,
"connections": 0,
"proxy": "",
"difficulty": 1,
"testnet": false,
"keypoololdest": 1559171551,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"relayfee": 0.00001000,
"errors": ""
}
两台主机节点均回滚到了762047区块高度。回滚不要重启进程,否则有可能又需要重新指定无效区块。
这个时候,你会发现它们的connections数为零,因为外网已经隔离。但是连接数位零,是无法挖矿的,用getblocktemplate命令会提示“bitcoin is not connected!”,这是一个节点的常规限制,这也就是为什么我们要设置私链的节点数为2个。用addnode “10.1.102.33:8333” add命令让两个节点建立连接。
开启矿机,将矿机设置指向私链节点中的一个(前提是装好了ckpool矿池,用其它挖矿代理也是一样的),总而言之,矿机算力显示正常即可。
使用getinfo检查出块情况,一旦发现区块高度正常增加,且该高度在外网浏览器查询不存在,则证明新的链条已经生成。
在私链节点上面检查chainwork累积情况:
./bitcoin-cli getblockchaininfo
{
"chain": "main",
"blocks": 775350,
"headers": 775350,
"bestblockhash": "00000000000908a11cbbcfa13f819a82511476d4d02da0315d91e70b0d906188",
"difficulty": 4096,
"mediantime": 1559563362,
"verificationprogress": 0.9999995967199629,
"chainwork": "0000000000000000000000000000000000000000007cb5f9cb5791e6eb380892",
"pruned": false,
"softforks": [
{
"id": "bip34",
"version": 2,
"reject": {
"status": true
}
},
{
"id": "bip66",
"version": 3,
"reject": {
"status": true
}
},
{
"id": "bip65",
"version": 4,
"reject": {
"status": true
}
}
],
"bip9_softforks": {
"csv": {
"status": "active",
"startTime": 1462060800,
"timeout": 1493596800,
"since": 419328
}
}
chainwork数值超过诚实链就代表攻击目标达成,为了稳妥起见,可以等该数值拉开一定距离再进行全网广播。
删除掉网关隔离对外通讯的访问列表限制,两个私链节点就会自动向全网进行广播,因为它们是最长链条,所以会成为新的诚实链。为了加速广播速度,可以手动使用addnode指令,对没有被同步的节点进行握手,如此一来,一传十,十传百,只要短期内没有更强的算力扭转,所有的算力都会自动加入到私链,而私链就自然而然成为了公链。
在节点上面查看原来的区块信息,仍然能够看到原来高度762048及之后的老区块,但是已经成为了孤儿块,确认数为-1:
getblock 000000002b7ad68e8528c20ec8bc8366cdd9a8c2db2b4050e0c9f2c9e39603b0
{
"hash": "000000002b7ad68e8528c20ec8bc8366cdd9a8c2db2b4050e0c9f2c9e39603b0",
"confirmations": -1,
"size": 201,
"height": 762048,
"version": 536870912,
"versionHex": "20000000",
"merkleroot": "9d456740607533c1982b622fdfbca150c4f457de57d539c40b585d63359e3304",
"tx": [
"9d456740607533c1982b622fdfbca150c4f457de57d539c40b585d63359e3304"
],
"time": 1545892389,
"mediantime": 1545892385,
"nonce": 3763299100,
"bits": "1d00ffff",
"difficulty": 1,
"chainwork": "0000000000000000000000000000000000000000007cb5f9cae224127d639b33",
"previousblockhash": "00000000b6cde760c076bc5c5731f70ab17c68ce2676b01a810696992269b169"
}
因为BCH原链节点数不多,节点的同步时间从数分钟到数小时不等。手动addnode进行“握手”,让没有同步的节点尽快同步。
在详细了解51%的攻击之前,重要的是要了解区块链协议基本上是一种治理形式。区块链管理数据的分类帐,例如交易数据。由于区块链协议可以为我们管理,我们不再需要第三方来执行此操作,例如政府或银行。这就是(大多数)区块链去中心化的原因。比特币区块链的协议基于民主自治制度,这意味着网络上的大多数参与者(矿工)将决定哪种版本的区块链代表真相。
去中心化的民主是什么?这就是一个具体的例子,由数学决定一切,没有任何中间人。传统的民主代议制度,不是基于数学的,而是用选举、代理人、议会、行政、司法分权等各种系统和制度来运行,中间有大量的人为因素。而比特币的治理模式非常简单,只有一条最基本的原则,即数学至上,没有任何其它的人为规则,而这也就杜绝了一切的作弊可能性。从比特币的角度,是不存在所谓诚实链和攻击链的,这是我们人为的主观定义,它很简单,算力最强的链条是数学上证明安全级别最强的,代码会自动选择它,不需要说明。
所谓的51%攻击,也只是我们人为的定义,比特币并不需要防范这种情况,它是符合比特币追随最强者的顶层原则的,这种制度恰恰构成了比特币的核心价值,是非常理性的。
好的制度是追求优胜劣汰,而不是反向的劣币驱逐优币,现实的复杂的制度往往存在这种情况,是逆进化论的。比特币的基于数学的治理.没有九九八十一条人为的法律、法规,可谓简单而粗暴,但却是绝对的有效。
挖矿是用算力去挖“币”,本质上,等同于矿工付出了电费、设备成本去兑换了挖出来的币。假设矿工花了1块钱去挖了1个币,也就是矿工认可用1块钱去买一个币的市场价格,而当一个币在市场上的价格为2元时,矿工是不大可能花一块钱就能挖到1个币的,因为那个时候,会有人投资挖矿,然后把这个币卖出去赚钱,直到挖矿的成本和市场的价格相当接近。因为挖矿是一种纯粹的数学,没有门槛,也没有限制任何人参与,是完全市场化的。所以,挖矿的成本等于币的市场价。
从矿工的角度,虽然期望越低的成本挖到越多的币,但是在公开竞争的情况下,他买不到跟市场价差别太大的币。比特币最早几分钱一个,用电脑就能挖,最早挖矿的成本是比特币启动的市场定价,越容易挖,则卖出的价格越低,卖出去的价格越低则越容易挖,反之亦然。
51%攻击实践揭示了一点,没收其他人的币,成本会高于其他人挖矿的成本,比特币没有情感,谁给的钱多,它就属于谁,这个规则是公开公平的,对中本聪也没有例外。
从以上51%攻击我们可以看到,矿工付出成本去“买”币,其实有两种选择,其一,挖私链,并让其成为公链;其二,挖公链。第一种情况,是矿工要占有100%的挖矿产出,而第二种情况,则是与其它矿工合作,联合起来强化链条的安全门槛。挖矿是一种自私的行为,矿工基于利益最大化进行选择,100%的矿工其实都有动机进行51%挖矿(私链),因为100%的矿工有这种动机,且挖矿算法是公开的情况下,矿工会意识到自身无法保证自身挖出来的币的安全,矿工反倒有可能倾向于合作,合作的动机与其占有全网算力的比率成正比,也就是其占有99%的算力,那么挖私链的动机就会上升到99%,代表受到惩罚的风险越低。而其算力比率较低,则会因为挖私链失败导致颗粒无收,相当受到了处罚(浪费了成本)。总结来说,矿工是挖矿算法的人格化,其行为完全可以预测及精确计算出来。
在有少量矿工的情况下,假设有一个矿工用很低的算力(成本)挖了一些币,那么覆盖掉这些币的成本也很低,所以,矿工选择用多少成本去挖矿,其实等于给自己的币加上多少安全外壳,当他用一分钱去挖矿的时候,他即使获得了一万个币,但是这一万个币,会被别人用2分钱给干掉的概率很高。犹如本实验干掉了30万个币。
回滚区块的成本完全是可以预测的,因为公开竞争,只要成本可以被覆盖,那么就会发生区块回滚。BCH原链如此,BCH如此,比特币也是如此。如果回滚一个币的成本是一块钱,并获得一个币,那么矿工就给出了一个市场定价为1块钱,当成本超过其所愿意支付的市场定价时,他自然会停止这种挖矿行为。
所以,最后我们要记住一点,在大部分时候花一块钱挖一万个币,跟花一百块钱挖一个币,所得跟币数关系不大,而跟成本有关,今天花五万块钱去挖一个比特币,跟花五万块钱去挖20个BCH,矿工不会有一种错觉,认为后者所得更多。有很多类似的逻辑漏洞,不知道如何区分必要和充分条件,比如一些分叉币发行量只有几千个,然后就敢号称稀缺性导致市场价值更高。有一个比特币矿工花了2万个比特币去购买了两块披萨饼,其实他在干一件让比特币值钱的事情,而不是比特币自己会值钱。如果他不这么干的话,就像今天在这个世界的各个角落,拥有数万个BCH原链币的持有者一样,连2个披萨饼都买不起。写到这,我笑了。
环境设定:ubuntu 18.04 LTS Server (64bit)
sudo apt-get install build-essential libzmq3-dev
sudo apt install npm
执行:
wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.2/install.sh | bash
再执行:
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
执行完输入nvm查看是否安装完成。
经测试安装bitcore使用V6版本可以通过,而安装bitcore wallet service(钱包服务)使用V10版本可以通过。应用有一个版本同时支持这2个模块,我没有测试。
nvm install v6.17.1
nvm install v10.16.0
需要安装支持bitcore的Bitcoin ABC 0.14.6版本(这是一个特殊版本,包含支持bitcore的RPC命令,直接下载0.14.6发行版本会出现不兼容问题)
sudo apt-get update
sudo apt-get install build-essential libtool autotools-dev automake pkg-config libssl-dev libevent-dev bsdmainutils
sudo apt-get install libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-program-options-dev libboost-test-dev libboost-thread-dev
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:bitcoin/bitcoin
sudo apt-get update
sudo apt-get install libdb4.8-dev libdb4.8++-dev
sudo apt-get install libminiupnpc-dev
sudo apt-get install libzmq3-dev
sudo apt-get install libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libprotobuf-dev protobuf-compiler
sudo apt-get install libqrencode-dev
git clone -b tag0.14.6-bitcore https://github.com/bitprim/bitcoin-abc.git
cd bitcoin-abc
./autogen.sh
./configure
sudo make
sudo make install
nvm use 6
npm install -g bitcore
bitcore create mynode-abc && cd mynode-abc
bitcore install insight-api insight-ui
bitcoincashcn@bitcore-node:~/mynode-bcc$ more bitcore-node.json
{
"network": "livenet",
"port": 3001,
"services": [
"bitcoind",
"insight-api",
"insight-ui",
"web"
],
"servicesConfig": {
"insight-ui": {
"routePrefix": "",
"apiPrefix": "api"
},
"insight-api": {
"routePrefix": "api",
"disableRateLimiter": true
},
"bitcoind": {
"spawn": {
"datadir": "/home/bitcoincashcn/.bitcoin",
"exec": "/usr/local/bin/bitcoind"
}
}
}
}
server=1
rpcuser=x
rpcpassword=x
rpcport=8332
rpcallowip=0.0.0.0/0
rpcbind=127.0.0.1
txindex=1
addressindex=1
timestampindex=1
spentindex=1
usecashaddr=0
zmqpubrawtx=tcp://127.0.0.2:28332
zmqpubhashblock=tcp://127.0.0.2:28332
addnode=5.9.151.109:9333
addnode=104.198.86.113:8333
addnode=35.247.161.53:8333
nvm use 6
cd ~/mynode-abc
bitcore start
如果服务器重启,可用以下命令在后台运行bitcore
nvm use 6
cd ~/mynode-abc
nohup bitcore start >/dev/null 2>&1 &
区块还没同步完成的情况:
区块同步完成的情况:
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot python-certbot-nginx
sudo certbot --nginx
vi /etc/nginx/sites-enabled/default
注释掉原来404那一行,添加配置如下:
location / {
#try_files $uri $uri/ =404;
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
sudo /etc/init.d/nginx restart
sudo apt-get install mongodb
nvm use v10.16.0
git clone https://github.com/bitpay/bitcore-wallet-service.git
cd bitcore-wallet-service
npm install
如果提示需要运行以下命令修复错误,则运行一次:
npm audit fix
config.js配置文件内容如下,其中注意地址格式为legacy、provider为insight,而url则为insight的连接:
var config = {
basePath: '/bws/api',
disableLogs: false,
port: 3232,
storageOpts: {
mongoDb: {
uri: 'mongodb://localhost:27017/bws',
},
},
lockOpts: {
// To use locker-server, uncomment this:
lockerServer: {
host: 'localhost',
port: 3231,
},
},
messageBrokerOpts: {
// To use message broker server, uncomment this:
messageBrokerServer: {
url: 'http://localhost:3380',
},
},
blockchainExplorerOpts: {
bch: {
livenet: {
addressFormat: 'legacy', // copay, cashaddr, or legacy
provider: 'insight',
url: 'http://insight.xuexizu.cn:3001',
},
},
},
};
module.exports = config;
BWS和bitcore insight区块浏览器可以分别安装在2台不同服务器上。
npm start
注意:
目前已经测试能用的版本包括Copay V4.8.1以下的版本。
在创建新钱包之前,删掉启动时创建的BTC钱包,以免混淆。
新建钱包的币种选择“BCH” (必须的)钱包服务地址填写(以下两个任何一个):
可以自行设置密码和保护短语(后面备份时再设置亦可),然后点击创建钱包即可。钱包创建完成后,进入设置备份。
Copay钱包的地址格式并非传统格式的地址,需要转换,复制钱包的接收地址到以下网址即可进行转换显示为传统地址:
https://explorer.viabtc.com/bch/tool/address-converter
注意:
发送成功如下所示:
BCH原链可以直接复用BTC/BCH的矿池代码库,搭建矿池作为基础设施。
daemon=1
rpcconnect=127.0.0.1
rpcuser=x
rpcpassword=x
rpcport=8332
rpcthreads=8
rpcallowip=0.0.0.0/0
rpcbind=127.0.0.1
datadir=/home/BCL/block/
注意:/home/BCL/block为测试用路径,如采用其它路径,以下配置根据实际路径修改。
注意:/home/BCL/ckpool.conf为测试用路径,如采用其它路径,以下配置根据实际路径修改。
apt-get install git #安装git
git clone https://bitbucket.org/ckolivas/ckpool.git #源代码下载
apt-get install build-essential libpq-dev autoconf automake libtool #安装相关的库
cd ckpool
./autogen.sh
./configure
make
make install
{
"btcd" : [
{
"url" : "localhost:8332",
"auth" : "x",
"pass" : "x",
"notify" : false
}
],
"btcaddress" : "128sKcXJV2zAhPx2ExspTAc9UCoewBaqMH", #替换为本地钱包地址
"btcsig" : "/mined by bitcoincashcn/",
"blockpoll" : 100,
"update_interval" : 30,
"serverurl" : "10.1.101.33:3333", #替换为矿池外网地址
"mindiff" : 1,
"startdiff" : 128,
"logdir" : "/home/BCL/logs"
}
logdir设置为固定目录,以便第二步设置Web服务器。
不加nohup则在前台运行,终端断开进程终止。
nohup ckpool -A -c /home/BCL/ckpool.conf &
注意:IP地址和路径为举例,实际变更为本地地址和路径。
apt install apache2
apt install php
apt-get install libapache2-mod-php
/etc/init.d/apache2 restart
创建test.php脚本,保存到/var/www/html目录下,脚本内容为:
<?php
echo "Hellow World";
?>
systemctl enable apache2
访问:http://10.1.101.33/test.php
建立配置文件:/etc/apache2/sites-available/ckpool.xuexizu.cn.conf
<VirtualHost *:80>
ServerAdmin gotolab@gmail.com
ServerName ckpool.xuexizu.cn
ServerAlias ckpool.xuexizu.cn
DocumentRoot /home/gotolab/logs/
ErrorLog /home/gotolab/logs/logs/error.log
CustomLog /home/gotolab/logs/logs/access.log combined
</VirtualHost>
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
如果访问继续报错,需要手动指定目录权限:
chown -R $USER:$USER /home/gotolab/logs/
chmod -R 755 /home/gotolab/logs/
/etc/hosts
10.1.101.33 ckpool.xuexizu.cn
mkdir /home/BCL/logs/logs/
静态模板很简单,而动态模板我也没找到设置说明书。
关闭默认站点:
a2dissite 000-default.conf
启用站点:
a2ensite ckpool.xuexizu.cn.conf
http://ckpool.xuexizu.cn
./bitcoin-cli getwalletinfo
{
"walletversion": 130000,
"balance": 0.00000000,
"unconfirmed_balance": 0.00000000,
"immature_balance": 0.00000000,
"txcount": 0,
"keypoololdest": 1560044643,
"keypoolsize": 100,
"paytxfee": 0.00000000,
"hdmasterkeyid": "61648c21139a50081c325e2821944f8f22be3dba"
}
immature_balance:已经出块但还未成熟的余额,比特币规定出块后100个块,铸币成熟方可使用