NVC/PPC protocol changes support
[p2pool.git] / p2pool / bitcoin / networks.py
index e059daa..8831470 100644 (file)
@@ -1,79 +1,70 @@
+import os
+import platform
+
 from twisted.internet import defer
 
 from . import data
 from p2pool.util import math, pack
+from operator import *
 
-BitcoinMainnet = math.Object(
-    P2P_PREFIX='f9beb4d9'.decode('hex'),
-    P2P_PORT=8333,
-    ADDRESS_VERSION=0,
-    RPC_PORT=8332,
-    RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
-        'bitcoinaddress' in (yield bitcoind.rpc_help()) and
-        not (yield bitcoind.rpc_getinfo())['testnet']
-    )),
-    POW_FUNC=data.hash256,
-    SYMBOL='BTC',
-)
-BitcoinTestnet = math.Object(
-    P2P_PREFIX='fabfb5da'.decode('hex'),
-    P2P_PORT=18333,
-    ADDRESS_VERSION=111,
-    RPC_PORT=8332,
-    RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
-        'bitcoinaddress' in (yield bitcoind.rpc_help()) and
-        (yield bitcoind.rpc_getinfo())['testnet']
-    )),
-    POW_FUNC=data.hash256,
-    SYMBOL='tBTC',
-)
+def get_subsidy(nCap, nMaxSubsidy, bnTarget):
+    bnLowerBound = 0.01
+    bnUpperBound = bnSubsidyLimit = nMaxSubsidy
+    bnTargetLimit = 0x00000fffff000000000000000000000000000000000000000000000000000000
 
-NamecoinMainnet = math.Object(
-    P2P_PREFIX='f9beb4fe'.decode('hex'),
-    P2P_PORT=8334,
-    ADDRESS_VERSION=52,
-    RPC_PORT=8332,
-    RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
-        'namecoinaddress' in (yield bitcoind.rpc_help()) and
-        not (yield bitcoind.rpc_getinfo())['testnet']
-    )),
-    POW_FUNC=data.hash256,
-    SYMBOL='NMC',
-)
-NamecoinTestnet = math.Object(
-    P2P_PREFIX='fabfb5fe'.decode('hex'),
-    P2P_PORT=18334,
-    ADDRESS_VERSION=111,
-    RPC_PORT=8332,
-    RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
-        'namecoinaddress' in (yield bitcoind.rpc_help()) and
-        (yield bitcoind.rpc_getinfo())['testnet']
-    )),
-    POW_FUNC=data.hash256,
-    SYMBOL='tNMC',
-)
+    while bnLowerBound + 0.01 <= bnUpperBound:
+        bnMidValue = (bnLowerBound + bnUpperBound) / 2
+        if pow(bnMidValue, nCap) * bnTargetLimit > pow(bnSubsidyLimit, nCap) * bnTarget:
+            bnUpperBound = bnMidValue
+        else:
+            bnLowerBound = bnMidValue
 
-LitecoinMainnet = math.Object(
-    P2P_PREFIX='fbc0b6db'.decode('hex'),
-    P2P_PORT=9333,
-    ADDRESS_VERSION=48,
-    RPC_PORT=9332,
-    RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
-        'litecoinaddress' in (yield bitcoind.rpc_help()) and
-        not (yield bitcoind.rpc_getinfo())['testnet']
-    )),
-    POW_FUNC=lambda data: pack.IntType(256).unpack(__import__('ltc_scrypt').getPoWHash(data)),
-    SYMBOL='LTC',
-)
-LitecoinTestnet = math.Object(
-    P2P_PREFIX='fcc1b7dc'.decode('hex'),
-    P2P_PORT=19333,
-    ADDRESS_VERSION=111,
-    RPC_PORT=19332,
-    RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
-        'litecoinaddress' in (yield bitcoind.rpc_help()) and
-        (yield bitcoind.rpc_getinfo())['testnet']
-    )),
-    POW_FUNC=lambda data: pack.IntType(256).unpack(__import__('ltc_scrypt').getPoWHash(data)),
-    SYMBOL='tLTC',
+    nSubsidy = round(bnMidValue, 2)
+
+    if nSubsidy > bnMidValue:
+        nSubsidy = nSubsidy - 0.01
+
+    return int(nSubsidy * 1000000)
+
+nets = dict(
+    novacoin=math.Object(
+        P2P_PREFIX='e4e8e9e5'.decode('hex'),
+        P2P_PORT=7777,
+        ADDRESS_VERSION=8,
+        RPC_PORT=8344,
+        RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
+            'novacoinaddress' in (yield bitcoind.rpc_help()) and
+            not (yield bitcoind.rpc_getinfo())['testnet']
+        )),
+        SUBSIDY_FUNC=lambda target: get_subsidy(6, 100, target),
+        BLOCKHASH_FUNC=lambda data: pack.IntType(256).unpack(__import__('ltc_scrypt').getPoWHash(data)),
+        POW_FUNC=lambda data: pack.IntType(256).unpack(__import__('ltc_scrypt').getPoWHash(data)),
+        BLOCK_PERIOD=600, # s
+        SYMBOL='NVC',
+        CONF_FILE_FUNC=lambda: os.path.join(os.path.join(os.environ['APPDATA'], 'NovaCoin') if platform.system() == 'Windows' else os.path.expanduser('~/Library/Application Support/NovaCoin/') if platform.system() == 'Darwin' else os.path.expanduser('~/.novacoin'), 'novacoin.conf'),
+        BLOCK_EXPLORER_URL_PREFIX='http://novacoin.ru/block/',
+        ADDRESS_EXPLORER_URL_PREFIX='http://novacoin.ru/address/',
+        SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256//1000 - 1),
+    ),
+    novacoin_testnet=math.Object(
+        P2P_PREFIX='cdf2c0ef'.decode('hex'),
+        P2P_PORT=17777,
+        ADDRESS_VERSION=111,
+        RPC_PORT=8344,
+        RPC_CHECK=defer.inlineCallbacks(lambda bitcoind: defer.returnValue(
+            'novacoinaddress' in (yield bitcoind.rpc_help()) and
+            (yield bitcoind.rpc_getinfo())['testnet']
+        )),
+        SUBSIDY_FUNC=lambda target: get_subsidy(6, 100, target),
+        BLOCKHASH_FUNC=lambda data: pack.IntType(256).unpack(__import__('ltc_scrypt').getPoWHash(data)),
+        POW_FUNC=lambda data: pack.IntType(256).unpack(__import__('ltc_scrypt').getPoWHash(data)),
+        BLOCK_PERIOD=600, # s
+        SYMBOL='tNVC',
+        CONF_FILE_FUNC=lambda: os.path.join(os.path.join(os.environ['APPDATA'], 'NovaCoin') if platform.system() == 'Windows' else os.path.expanduser('~/Library/Application Support/NovaCoin/') if platform.system() == 'Darwin' else os.path.expanduser('~/.novacoin'), 'novacoin.conf'),
+        BLOCK_EXPLORER_URL_PREFIX='http://nonexistent-novacoin-testnet-explorer/block/',
+        ADDRESS_EXPLORER_URL_PREFIX='http://nonexistent-novacoin-testnet-explorer/address/',
+        SANE_TARGET_RANGE=(2**256//1000000000 - 1, 2**256//1000 - 1),
+    ),
 )
+for net_name, net in nets.iteritems():
+    net.NAME = net_name