lfx区块链博客


lfx 微信:chen1048258,全球区块链职业教育布道师,通信和信息技术培养工程区块链高级授课专家。


微信
技术交流群

不管是链圈,还是币圈,你都应该了解矿工、加密货币、矿池生态系

用电脑…挖矿?

电脑挖矿

所谓挖矿就是让电脑执行特定程序,迭代找出某个值nonce代入符合HashFunction(TXs+nonce)< TargetDifficulty的解来给自己「挖出」一些加密货币。Bitcoin用的函数是两次的SHA256,而Ethereum则是使用自己发明的Ethash算法。

挖矿的本质就像买乐透,尽管内存块奖励是先抢先赢,算力强的矿工也只是「较有机会」挖到矿,小矿工理论上仍能取得成比例的报酬。但随着全世界的人不断不断的投入资源、建置更多的挖矿设备,现在以个人之力挖到矿的机率已经非常非常小。

Ethereum为例,一张中高阶显卡每秒可以做三千万次Hash,但挖到矿平均需要一千两百兆次的尝试(2017/7/16),算起来平均要1.26年才会挖到一次,普通矿工根本没办法承受如此不稳定的收入。

凭个人之力挖矿太看天吃饭,矿工们合起来建造了矿池。

孔壹学院

基本上,矿池要解决的是矿工收入不稳定的问题,它把散落的运算资源整合起来一起挖矿,挖到之后再按照每个矿工的贡献比例分钱下去,概念上就像集资包牌买乐透,用众人之力把收入的机率分布摊平。此外,矿池负责维护节点运作,矿工可以专心在运算上,也降低了挖矿的成本,矿池则收取少量手续费。

理想的矿池和矿工之间的分工大致是这样:矿池藉由连接内存块链网络的节点接收交易信息,产生待打包的内存块广播给矿工,并分配每个矿工负责寻找nonce的范围。通常矿池会设定一个比较低的门坎,可能是实际target difficulty1/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
  • 「区块链部落」官方公众号

版权声明:博客中的文章版权归博主所有,未经授权,禁止转载,转载请注明出处,合作请联系:chen1048258(微信)

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦