P2Pool
Links: http://p2pool.in/ - https://github.com/forrestv/p2pool - https://en.bitcoin.it/wiki/P2Pool - https://bitcointalk.org/index.php?topic=18313
P2Pool creates a new block chain in which the difficulty is adjusted so a new block is found every 30 seconds. The blocks that get into the P2Pool block chain (called the "share chain") are the same blocks that would get into the Bitcoin block chain, only they have a lower difficulty target. Whenever a peer announces a new share found (new block in the P2Pool block chain), it is received by the other peers, and the other peers verify that this block contains payouts for all the previous miners who found a share (and announced it) that made it into the P2Pool share chain. This continues until some peer finds a block that has a difficulty that meets the Bitcoin network's difficulty target. This peer announces this block to the Bitcoin network and miners who have submitted shares for this block are paid in the generation transaction, proportionally to how many shares they have found in the last while. - Unknown author
P2Pool 会创建一个新的block chain(称为share chain),然后动态调整难度系数以保证1 block/30s的速度.share chain中的block和提交到bitcoin block chain中的block是一样的,区别只是share chain中的block难度系数低些。一旦有节点声称发现新的share,其他节点也会收到广播,然后其他节点会核查该block中的payout收款人是否包含上次发现share并提交到share chain的miners.如此循环往复,直到发现的share的难度系数符合BTC网络的难度系数。然后发现该share的节点将发现的share提交到btc网络,然后所有为找到该block而提交过share的所有miner都会在下笔交易按上一轮提交的share比例获得分成。
Decentralized payout pooling solves the problem of centralized mining pools degrading the decentralization of Bitcoin and avoids the risk of hard to detect theft by pool operators.
P2Pool nodes work on a chain of shares similar to Bitcoin's blockchain. Each node works on a block that includes payouts to the previous shares' owners and the node itself, which can also result in a share if it meets P2Pool's difficulty.
Contents
[ hide]Overview
Payout logic
Stales
There are two reported kinds of stales in P2Pool: "DEAD ON ARRIVAL" shares and orphan shares. Dead shares were too old by the time they arrived at your local P2Pool. Very high dead rates can indicate miner misconfiguration. Orphan shares are shares which were not extended by the rest of the P2Pool network, because some other miner's share was accepted first. Very high orphan rates may indicate network connectivity problems.
2012-01-07 20:57:51.797420 Pool stales: 13% Own: 13±2% Own efficiency: 100±2%
When you first start P2Pool claimed efficiency will be low and the error bounds on this estimate will be large, but as it runs the numbers will converge to their correct values.
Joining the pool
- Run Bitcoin with the RPC interface enabled: edit bitcoin.conf to include:
- 打开RPC接口,运行bitcoin:编辑bitcoin.conf,引入如下内容
rpcuser=USER rpcpassword=LONG_RANDOM_SECRET_VALUE server=1
-
- Replace LONG_RANDOM_SECRET_VALUE with something long and random like the output of smashing your keyboard for a bit like fju4M78yAj3ds39pak92raK. You don't need to be able to remember it. If your RPC port becomes exposed to the internet a thief could steal your bitcoin if they could guess it, or use a brute force attack in order to find it.
- Bitcoin 0.8.5 or later is required
- It's important that your Bitcoin client be fully synchronized before starting. It's also better if you have the Bitcoin port forwarded
- 替换LONG_RANDOM_SECRET_VALUE为某些随机的长字符串,例如随机敲击键盘产生的字符串。你不需要记住这个字符串。如果你的RPC端口对internet公开,那窃贼很容易能猜到你的rpcpasword或者暴力破解方法而盗走你的BTC。
- Bitcoin 0.8.5或者更新版
- 确保你的bitcoin客户端已经同步完成,通过bitcoin forwar到其他可用的bitcoin上也行。
- Download p2pool:
- Windows binary: See http://forum.bitcoin.org/index.php?topic=18313.0
- Source download: https://github.com/forrestv/p2pool/tags
- git: git clone git://github.com/forrestv/p2pool.git
- 下载p2pool,windows版:http://forum.bitcoin.org/index.php?topic=18313.0
- 源码下载:https://github.com/forrestv/p2pool/tags
- git下载:git://github.com/forrestv/p2pool.git
- Run p2pool: (See below for additional options.)
- Windows py2exe: run_p2pool.exe
- Source: python run_p2pool.py
- 运行p2pool
- windows,执行run_p2pool.exe
- 源码:python run_p2pool.py
- Run a miner daemon with long polling connecting to 127.0.0.1 (or the IP of the host running p2pool if it isn't on the same computer as the miner) on port 9332 with any username and password
- bfgminer -O u:p -o http://127.0.0.1:9332/ --submit-stales
- 运行miner守护线程,long poll连接127.0.0.1(如果miner和p2pool不在同一电脑运行,IP指的是运行p2pool的电脑的IP)端口9332,任意username和password均可。
Dependencies if running from source:
- Python 2.6 or higher (but not 3.x)
- python-argparse
- Twisted (Ubuntu package python-twisted)
- 从源码运行的依赖:Python 2.6或更新版(3及以上不行)
- python-argparse
- Twisted (Ubuntu package python-twisted)
Frequently Asked Questions
A: "Once every ~10 seconds is normal. That is how often p2pool shares are generated (as opposed to ~10 min for bitcoin blocks) - cabin"
A: They shouldn't - It's normal for some fraction of everyone's shares to end up orphaned or dead. Because payouts are calculated by counting how many shares you have relative to others, everyone with normal configurations is equally "hurt" by this. However, if you have a large proportion of stales, your payout will be hurt. You can see how well you're doing by looking at P2Pool's "Efficiency" (ex: Efficiency: ~110.6% (40-111%)). If 100% doesn't lie within the confidence interval at the end, something is probably wrong (with 95% confidence).
A: Make sure the computers you're running P2Pool and the miner on have enough memory and CPU time. If you have a lot of dead shares or the "Local dead on arrival" number is higher than a few percent, that means that something is wrong with your miner. Check to make sure that it is one of the working versions in the Miners section on this page. Lower the intensity or raise the FPS of your miner. If you have a lot of orphan shares, something is wrong with P2Pool's P2P connection. Decrease the load on your internet connection or enable QoS (Quality of Service) on your router.
A: Pay-Per-Last-N-Shares is a payout method that is completely resistant to pool hoppers.
A: The P2Pool difficulty is hundreds of times higher than on other pools. It can take time to get a share. P2Pool displays an estimate of how long you have to wait in the console output.
A: The real P2Pool difficulty is hundreds of times higher than on normal pools, but p2pool essentially lies to your miner and tells it to work on relatively easy shares so that it submits shares every few seconds instead of every few hours. P2Pool then ignores any submitted shares that don't match the real share difficulty. By doing this, P2Pool can more accurately report your local hash rate and you can see if you are having problems with too many stale shares quickly
A: You're using an incompatible miner. See the miners section here, increase your FPS on the miner, decrease the intensity, upgrade your miner, or try a different miner.
A: A block solution is only worth anything because its hash matches Bitcoin's target. Altering anything within the block will change its hash and make it worthless. If you are concerned about the pool operator stealing a block, you should try to inspect the source code of each new version.
A: P2Pool includes payouts in generation transactions, which must mature (taking 120 blocks or 20 hours) before they can be spent. The reason for this is that a block could be orphaned, which would make its payout invalid and could reverse transactions.
A: Yes. They are split among P2Pool miners.
A: These are subsidies that people who support the idea of P2Pool send to miners.
A: See end of this page.
A: Yes. Your node needs to be able to independently make decisions about what transactions to mine.
Q: How do merged mining payments work?
A: Merged mining is handled entirely by namecoind, so you're solo mining and payouts will go into namecoind's wallet.
Miners
- bfgminer, cgminer, and ufasoft work perfectly without any extra options.
- DiabloMiner works fine after commit 3b731b9.
- Phoenix works fine after commit a658ef2.
- Poclbm works fine after commit 5e994e7.
Tips to configure bfgminer to reduce stale/doa:
- "gpu-threads" : "1", (2 by default)
- "queue" : "0", (1 by default)
On most cards best is diablo and phatk kernel, looks like poclbm kernel have unstable rate.
Useful features
- If upgrading P2Pool or changing its configuration, you can start another instance of P2Pool in parallel with the first. It will start normally, but realize that the worker and P2P listening ports are busy and keep trying to bind to them in the background. Thus, you can do almost-completely-seamless upgrades of P2Pool.
- 如果要升级p2pool或修改它的配置,你可以先启用另一个p2pool的实例,保持并行。新p2pool实例启动正常,但是当发现worker和p2p监听端口处于busy状态,它会在后头不断尝试绑定到这个端口上。因此你可以保持pool无间断工作的同时升级p2pool.
- If you run multiple P2Pool nodes or have trusted friends that run P2Pool, you can use -n to establish a constant extra P2P connection to them.
- 如果你运行多个P2Pool节点后者有可信的朋友在运行p2pool,你可以使用-n 建立连接到额外的节点
- You can make P2Pool use a configuration file by running run_p2pool.py @FILENAME, with FILENAME being the path to a file containing the command-line arguments (newlines are ignored) Example:
- 你可以让p2pool从配置文件运行,方法是run_p2pool.py @FILENAME FILENAME 是包含运行p2pool命令行的文件路径。(忽略换行符)
--net bitcoin -n 1.2.3.4
- Setting the username of your miner connecting to P2Pool to a Bitcoin address will make it mine to that address instead of the one requested from bitcoind or set by -a
- 设置miner的username为BTC收款地址可以让挖矿收益打到这个地址而不是从bitcoind查找打款地址,也可以-a参数指定收款地址
- Appending "/1000" to a miner's username will increase the difficulty of producing a P2Pool share to at most 1000. This is useful to large miners because doing this can make it easier for small miners while minimally impacting the large miners themselves. See recommended values.
- 追加"/1000"到miner的username后可以调高p2pool的难度到1000(最高值)。这对大型矿机很有利,因为这样做降低了p2pool最低难度值对大型矿机的影响。
- Appending "+1" (for example) after that will make P2Pool always give your miners work with a difficulty of 1
- 追加"+1"将会让p2pool总是给你的矿机分得的工作难度为1。
Web interface
- /static/ - Lots of information from shares to graphs to payouts.
- shares的payouts图表信息
- /rate
- /users
- /fee
- /current_payouts
- /patron_sendmany - Gives sendmany outputs for fair donations to P2Pool 给p2pool捐赠
- /global_stats
- /local_stats
- /peer_addresses
- /payout_addr
- /recent_blocks
- /uptime
- /web/log - Some different stats collected over the last day 从昨天开始的各种统计信息
Included README
Requirements:安装p2pool依赖的包和安装方法 Generic: Bitcoin >=0.6.0rc4 or Bitcoin >=0.5.4 (for BIP16 support) or Litecoin Python Twisted python-argparse (for Python <=2.6) Linux: sudo apt-get install python-zope.interface python-twisted python-twisted-web sudo apt-get install python-argparse # if on Python 2.6 or older Windows: Install Python 2.7: http://www.python.org/getit/ Install Twisted: http://twistedmatrix.com/trac/wiki/Downloads Install Zope.Interface: http://pypi.python.org/pypi/zope.interface/3.8.0 Unzip the files into C:\Python27\Lib\site-packages Running P2Pool: To use P2Pool, you must be running your own local bitcoind. For standard configurations, using P2Pool should be as simple as:要使用p2pool,你必须先运行你本地的bitcoind。使用标准配置,使用p2pool命令很简单,如下: python run_p2pool.py Then run your miner program, connecting to 127.0.0.1 on port 9332 with any username and password.然后运行你的miner,连接到127.0.0.1:9332,填上username和password If you are behind a NAT, you should enable TCP port forwarding on your router. Forward port 9333 to the host running P2Pool.如果你用的NAT,你需要开启路由的TCP端口转发功能。将端口9333转发到运行p2pool的主机 Run "python run_p2pool.py --help" for additional options.python run_p2pool.py --help查看帮助和更多其他选项 Notes for Litecoin: Requirements: In order to run P2Pool with the Litecoin network, you would need to build and install the ltc_scrypt module that includes the scrypt proof of work code that Litecoin uses for hashes.要让p2pool运行在litecoin网络,你需要build和运行ltc_scrypt module用于引入基于scrypt 的POW。
Linux: cd litecoin_scrypt sudo python setup.py install Windows: Install MinGW: http://www.mingw.org/wiki/Getting_Started Install Python 2.7: http://www.python.org/getit/ cd litecoin_scrypt C:\Python27\python.exe setup.py build --compile=mingw32 install If you run into an error with unrecognized command line option '-mno-cygwin', see this: http://stackoverflow.com/questions/6034390/compiling-with-cython-and-mingw-produces-gcc-error-unrecognized-command-line-o
如果执行过程中遇到error:unrecognized command line option '-mno-cygwin',请参考如下地址:
Running P2Pool:
Run P2Pool with the "--net litecoin" option.
Run your miner program, connecting to 127.0.0.1 on port 9327.
Forward port 9338 to the host running P2Pool.转发9338端口到p2pool的主机
Litecoin's use of ports 9332 and 9332 conflicts with P2Pool running on
the Bitcoin network. To avoid problems, add these lines to litecoin.conf Litecoin使用9332会和运行在btc网络的p2pool端口冲突。为避免此问题,添加如下命令行到litecoin.conf
and restart litecoind:
rpcport=10332
port=10333
Option Reference
usage: run_p2pool.py [-h] [--version] [--net {bitcoin,litecoin}] [--testnet] [--debug] [-a ADDRESS] [--datadir DATADIR] [--logfile LOGFILE] [--merged MERGED_URLS] [--give-author DONATION_PERCENTAGE] [--iocp] [--irc-announce] [--no-bugreport] [--p2pool-port PORT] [-n ADDR[:PORT]] [--disable-upnp] [--max-conns CONNS] [-w PORT or ADDR:PORT] [-f FEE_PERCENTAGE] [--bitcoind-address BITCOIND_ADDRESS] [--bitcoind-rpc-port BITCOIND_RPC_PORT] [--bitcoind-p2p-port BITCOIND_P2P_PORT] [BITCOIND_RPCUSERPASS [BITCOIND_RPCUSERPASS ...]] p2pool (version 0.11.1-8-ged9359d) optional arguments: -h, --help show this help message and exit显示帮助信息并退出 --version show program's version number and exit --net {bitcoin,litecoin}连接的哪种网络(bitcoin,litecoin..),缺省是bitcoin use specified network (default: bitcoin) --testnet use the network's testnet是否连接到testnet --debug enable debugging mode是否开启debug模式 -a ADDRESS, --address ADDRESS payouts到此地址,缺省从bitcoind获得 generate payouts to this address (default: <address requested from bitcoind>) --datadir DATADIR store data in this directory (default: <directory run_p2pool.py is in>/data)存储数据到此目录(缺省为run_p2pool.py所在目录/data) --logfile LOGFILE log to this file (default: data/<NET>/log)日志文件路径(缺省 data/<NET>/log) --merged MERGED_URLS call getauxblock on this url to get work for merged mining (example: http://ncuser:ncpass@127.0.0.1:10332/)merged mining的getauxblock地址 --give-author DONATION_PERCENTAGE donate this percentage of work towards the development of p2pool (default: 0.5)捐赠比例(缺省0.5) --iocp use Windows IOCP API in order to avoid errors due to large number of sockets being open使用windows的IOCP API避免因为过多端口打开造成的错误 --irc-announce announce any blocks found on irc://irc.freenode.net/#p2pool --no-bugreport disable submitting caught exceptions to the author禁用提交异常信息给author --disable-upnp don't attempt to use UPnP to forward p2pool's P2P port from the Internet to this computer禁止通过UPnP转发从internet过来的p2p端口到此电脑 p2pool interface: --p2pool-port PORT use port PORT to listen for connections (forward this port from your router!) (default: bitcoin:9333, litecoin:9338)通过此端口监听连接(路由要转发此端口)(缺省:bitcoin:9333,litecoin:9338) -n ADDR[:PORT], --p2pool-node ADDR[:PORT] connect to existing p2pool node at ADDR listening on port PORT (defaults to default p2pool P2P port) in addition to builtin addresses连接到已存在的p2pool节点(缺省为p2pool-port) --max-conns CONNS maximum incoming connections (default: 40)最大连接数(缺省40) worker interface: -w PORT or ADDR:PORT, --worker-port PORT or ADDR:PORT listen on PORT on interface with ADDR for RPC connections from miners (default: all interfaces, bitcoin:9332, litecoin:9327)miner连接端口(缺省:所有接口,bitcoin:9332,litecoin:9327) -f FEE_PERCENTAGE, --fee FEE_PERCENTAGE charge workers mining to their own bitcoin address (by setting their miner's username to a bitcoin address) this percentage fee to mine on your p2pool instance. Amount displayed at http://127.0.0.1:WORKER_PORT/fee (default: 0)对worker收费的费率,具体情况通过http://127.0.0.1:WORKER_PORT/fee查看 bitcoind interface:bitcoind接口参数: --bitcoind-address BITCOIND_ADDRESS connect to this address (default: 127.0.0.1)连接到此地址bitcoind,缺省127.0.0.1 --bitcoind-rpc-port BITCOIND_RPC_PORT connect to JSON-RPC interface at this port (default: bitcoin:8332, litecoin:9332 <read from bitcoin.conf if password not provided>) JSON-RPC接口的访问端口(缺省bitcoin:8332,litecoin:9332,如果没有提供password从bitcoin.conf读取) --bitcoind-p2p-port BITCOIND_P2P_PORT connect to P2P interface at this port (default: bitcoin:8333, litecoin:9333 <read from bitcoin.conf if password not provided>)连接p2p端口(缺省:bitcoin:8333,litecoin:9333,没有提供password从bitcoin.conf读取) BITCOIND_RPCUSERPASS bitcoind RPC interface username, then password, space- separated (only one being provided will cause the username to default to being empty, and none will cause P2Pool to read them from bitcoin.conf)bitcoind RPC接口username和password,空格分隔。(只提供一个会导致username默认为空,不填会导致p2pool从bitcoin.conf读取)
Interoperability table 兼容性
P2pool works fine with most hardware. This lists some of the hardware confirmed to work and any special configuration required.
- ASICminer blade 10GH/s (Requires adding +1 to username or proxy)
- Avalon 110nm 60-110 GH/s (All batches)
- Avalon based 55nm 200 GH/s (specific makers?)
- Avalon prototype 55nm 120GH/s (~ 20 exist)
- Cointerra Terraminer IV (very low stale rate, maybe the lowest of any mining asic)
- Icarus FPGA
- Bitfury strikes back H-card and M-card (instructions)
- Bitmain Antminer S1 180GH/s (Requires 20131226 firmware.)
- BFL SC Jalapeno, SC Single 30, 50, & 60 GH/s
(Various GPU and most FPGAs other than BFL single FPGAs work fine too)
Protocol description
P2Pool's protocol mirrors Bitcoin's P2P protocol in many ways. It uses the same framing (prefix, command, length, checksum, payload) and similar commands:
- version - sent to establish a connection - contains (version, services, addr_to, addr_from, nonce, sub_version, mode, best_share_hash)
- setmode - sent to update the mode sent in the version message - contains (mode)
- ping - sent to keep connection alive - contains ()
- addrme - request that the receiving node send out an addr for the sending node - contains (port)
- addrs - broadcast list of nodes' addresses - contains (addrs)
- getaddrs - request that the receiving node send count addrs - contains (count)
- getshares - request that the receiving node send the shares referenced by hashes and parents of their parents, stopping at any share referenced by stops - contains (hashes, parents, stops)
- shares - broadcast message of the contents of shares - contains (shares)
History
This project was announced on June 17, 2011 by Forrest Voight[1].
The pool began testing against mainnet in mid-July, 2011. The pool was reviewed on a Bitcoin Miner post on July 26, 2011[2].
The software author's address for donations can be found in the signature section of his forum profile.
Donating to P2Pool miners
In order to encourage people to mine to P2Pool you can donate to the recent miners in proportion using a sendmany:
~/src/bitcoin/src/bitcoind sendmany "" "$(GET http://127.0.0.1:9332/patron_sendmany/10)"
You can replace "" with "accountname" if you want to pay from some specific bitcoind account, and you need to replace 127.0.0.1 with the address of your P2Pool node if you're not running one locally.
Note that the amount you donate will be allocated to recent miners in proportion to the amount of work they've done in the last 24 hours or so, but all the miner whose shares of the donated amount are less than 0.01 BTC will have their shares combined into a single amount which is awarded to one of them at random, with the chance of winning this 'lottery' weighted by the miner's recent amount of work done. You can change this 0.01 BTC threshold like this, for example, which says to pay 10 BTC, but to share it amongst more miners that the default, cutting off at 0.001 BTC instead of at 0.01 BTC.
~/src/bitcoin/src/bitcoind sendmany "" "$(GET http://127.0.0.1:9332/patron_sendmany/10/0.001)"
If you decide to donate you should announce it on the forums so that your donations provide the most incentive possible.
Sponsors
Thanks to:
- The Bitcoin Foundation for its generous support of P2Pool
- The Litecoin Project for its generous donations to P2Pool
See Also
External Links
- P2Pool forum
- p2pool project on GitHub
- IRC Web #p2pool discussion and support
- p2pool.info stats page (appears broken since May 2014 and as of June 2014 - you can use http://ANY.NODE:9332/static/graphs.html )
- p2pool.hostv.pl Public list of P2Pool BTC/LTC nodes.
- p2pool-nodes.info Another public list of P2Pool (BTC) nodes.
- whatisp2pool.com An easy introduction to mining and P2Pool.