用电脑…挖矿?
所谓挖矿就是让电脑执行特定程序,迭代找出某个值nonce
代入符合HashFunction(TXs+nonce)< TargetDifficulty
的解来给自己「挖出」一些加密货币。Bitcoin
用的函数是两次的SHA256
,而Ethereum
则是使用自己发明的Ethash算法。
挖矿的本质就像买乐透,尽管内存块奖励是先抢先赢,算力强的矿工也只是「较有机会」挖到矿,小矿工理论上仍能取得成比例的报酬。但随着全世界的人不断不断的投入资源、建置更多的挖矿设备,现在以个人之力挖到矿的机率已经非常非常小。
以Ethereum
为例,一张中高阶显卡每秒可以做三千万次Hash
,但挖到矿平均需要一千两百兆次的尝试(2017/7/16)
,算起来平均要1.26
年才会挖到一次,普通矿工根本没办法承受如此不稳定的收入。
凭个人之力挖矿太看天吃饭,矿工们合起来建造了矿池。
基本上,矿池要解决的是矿工收入不稳定的问题,它把散落的运算资源整合起来一起挖矿,挖到之后再按照每个矿工的贡献比例分钱下去,概念上就像集资包牌买乐透,用众人之力把收入的机率分布摊平。此外,矿池负责维护节点运作,矿工可以专心在运算上,也降低了挖矿的成本,矿池则收取少量手续费。
理想的矿池和矿工之间的分工大致是这样:矿池藉由连接内存块链网络的节点接收交易信息,产生待打包的内存块广播给矿工,并分配每个矿工负责寻找nonce
的范围。通常矿池会设定一个比较低的门坎,可能是实际target difficulty
的1/1000000
,矿工找到符合的nonce
就回报给矿池,矿池验算后就记录为一个share
,再用每个矿工提交的share
估算贡献比例。因为矿工已经筛选出一些不错的nonce
,矿池可以很容易的从中找出够小的值去符合真正挖矿的标准,层层过滤的过程和淘金矿倒有几分相似。
就像跟人包牌买乐透怕被独吞一样,难道矿池不担心矿工把可以挖到矿的nonce
私藏,只把挖不到但符合share
标准的nonce
交出来混钱吗?答案是否定的,因为在开始挖矿之前,我们要先决定好的那个TXs
交易纪录内存块里面,就会标示这个块的miner
是谁,所以当矿工对着矿池给好的数据做运算,找出来的valid share
就具有专一性,即使矿工真的找到某个符合Hash(“TX”+nonce)<TargetDifficulty
的值想要自己私藏拿去领赏,最后仍是矿池会收到钱,这个矿工还会少一个share
,理论上没有动机这么做。
矿池不担心矿工卷款潜逃,但要如何公平地分配收益仍是个困难的问题。目前比较常见的分润模式有:PPS(Pay Per Share),PPLNS(Pay Per Last N Share),RBPPS(Round Base Pay Per Share)
三种,各有优缺点和不同的风险承担角色。
采PPS
模式的矿池会在矿工每次提交share
的时候立刻认列,是最简单好懂的模式。每个share
的价格是预先决定并动态调整的,相当于矿池「买」了这个share
,矿工的收入稳定,而实际挖到的块多寡则由矿池概括承受,所以通常会抽取较高的手续费。
相较之下,PPLNS
模式只会在矿池确定有收入的时候才发钱。每次挖到矿会参照矿工前一段时间的share
数分配收益,波动由矿工和矿池共同承担,通常会用随时间递减的权重计算,收入较为平滑,但实作上会比较复杂一点。
至于RBPPS
则完全由矿工承担风险,它像PPS
一样实时认列,但不直接发钱,而是登记为一个share
,每次挖到块称为一个round
,再依照这个round
期间你占的share
比例分润,矿工收益完全看矿池出块是否稳定。
因为实作起来简单,RBPPS
是目前许多开源矿池采用的模式,但也存在着一些问题,对总算力低的矿池而言出块间隔长短并不稳定,随着矿工们的share
持续累积,继续挖矿的收益期望值会随着分母上升而递减,矿工有经济诱因在很久没出块时切到其他矿池挖矿,等本来的矿池出块后再切回来,但如果每个矿工都这么做,矿池就停摆了。
import random
selfshare = 0.0
totalshare = 0.0
x=0.9
y=0.09
z=0.01
selfreward=0.0
poolreward=0.0
for i in range(10000):
if totalshare <=1:
selfshare+=z
totalshare+=(y+z)
if random.random()<0.1:
selfreward+=5*0.1
poolreward+=5*0.9
selfshare=0
totalshare=0
else:
totalshare+=y
if random.random()<0.09:
selfreward+=5*selfshare/totalshare
poolreward+=5*(1-selfshare/totalshare)
selfshare=0
totalshare=0
else:
selfreward+=5*z/(z+x)
print(selfreward)
print(poolreward)
此外,也有矿池采用类似线上游戏的DKP
制度,矿工每次挖到块会累积credit
,当有块挖出来的时候就由当时credit
最高的矿工全拿,并把他的credit
归零。但这种模式显然对小矿工不利,期望值算起来大矿工会拿到不符比例多的额外收益。
总的来说,不同的分润模式都是在追求矿工收入稳定、公平、低矿池风险之间的权衡。大矿池有足够的资源请工程师优化系统,也较能提供矿工稳定的收入,小矿池则有灵活的优势,可以经营名气尚小的潜质币种。
营运矿池的各种经济考察
通常矿工在意的不外乎是矿池的手续费高低、收入波动、服务器稳定度三项重点。矿池收取的手续费除了要付维护系统跟电费的开支,还要在给矿工发薪水的时候承担链上(on-chain)
交易的手续费,所以一般会在累积到一大笔钱的时候再一次性支付。当矿池规模渐渐扩大的时候,光支付就会产生庞大的交易流量,常常处理不完造成堵车。
最近有Ethereum
矿池尝试用智能合约实现类似Bitcoin
单笔交易包含多地址支付的功能,但似乎会让交易所钱包辨识失败,猜测原因是因为底层节点geth
的监听功能filter
只会对交易的第一组地址有反应,导致后续的交易没被听见,以致于无法触发交易所入账的事件。满期待交易所能改一下构架,否则都不能用智能合约支付,对许多Ethereum
应用来说也挺困扰的。
目前已经可以在GitHub
上找到几组开源的矿池程序
,稍有经验的人都能轻易的架起矿池。但尽管架池简单,经营倒挺困难,要找到足够的矿工和算力加入才能确保收入稳定。比起矿工是单纯的设备成本收入考察,经营矿池有时候更像在经营社群,需要培养一定的群众,提供不错的周边服务,才能让矿工愿意在收益变化的时候不至于军心溃散,肯留下来跟着矿池一起打拼。
原文链接:https://medium.com/taipei-ethereum-meetup/%E5%8A%A0%E5%AF%86%E8%B2%A8%E5%B9%A3%E8%88%87%E4%BB%96%E5%80%91%E7%9A%84%E7%94%A2%E5%9C%B0-21a52c51427f
技术交流
- 区块链技术交流QQ群:
348924182
- 进微信群请加微信:
liyc1215
- 「区块链部落」官方公众号