Browse Source

Add support for Emercoin (#284)

* Add parameters for emercoin.

* Add tests for emercoin.

* add block for test new read_header function

* add to daemon https protocol support
patch-1
Sergii Vakula 7 years ago
committed by Neil
parent
commit
9303153150
  1. 41
      lib/coins.py
  2. 36
      lib/tx.py
  3. 14
      tests/blocks/emercoin_mainnet_255544.json
  4. 15
      tests/blocks/emercoin_mainnet_80312.json
  5. 4
      tests/lib/test_addresses.py

41
lib/coins.py

@ -40,7 +40,8 @@ import lib.util as util
from lib.hash import Base58, hash160, double_sha256, hash_to_str
from lib.script import ScriptPubKey, OpCodes
from lib.tx import Deserializer, DeserializerSegWit, DeserializerAuxPow, \
DeserializerZcash, DeserializerTxTime, DeserializerReddcoin
DeserializerZcash, DeserializerTxTime, DeserializerReddcoin, \
DeserializerTxTimeAuxPow
from server.block_processor import BlockProcessor
import server.daemon as daemon
from server.session import ElectrumX, DashElectrumX
@ -108,7 +109,7 @@ class Coin(object):
raise CoinError('invalid daemon URL: "{}"'.format(url))
if match.groups()[1] is None:
url += ':{:d}'.format(cls.RPC_PORT)
if not url.startswith('http://'):
if not url.startswith('http://') and not url.startswith('https://'):
url = 'http://' + url
return url + '/'
@ -373,6 +374,42 @@ class BitcoinSegwit(BitcoinMixin, Coin):
]
class Emercoin(Coin):
NAME = "Emercoin"
SHORTNAME = "EMC"
NET = "mainnet"
XPUB_VERBYTES = bytes.fromhex("0488b21e")
XPRV_VERBYTES = bytes.fromhex("0488ade4")
P2PKH_VERBYTE = bytes.fromhex("21")
P2SH_VERBYTES = [bytes.fromhex("5c")]
WIF_BYTE = bytes.fromhex("80")
GENESIS_HASH = ('00000000bcccd459d036a588d1008fce'
'8da3754b205736f32ddfd35350e84c2d')
TX_COUNT = 217380620
TX_COUNT_HEIGHT = 464000
TX_PER_BLOCK = 1700
VALUE_PER_COIN = 1000000
RPC_PORT = 6662
DESERIALIZER = DeserializerTxTimeAuxPow
PEERS = []
@classmethod
def block_header(cls, block, height):
'''Returns the block header given a block and its height.'''
deserializer = cls.DESERIALIZER(block)
if deserializer.is_merged_block():
return deserializer.read_header(height, cls.BASIC_HEADER_SIZE)
return block[:cls.static_header_len(height)]
@classmethod
def header_hash(cls, header):
'''Given a header return hash'''
return double_sha256(header[:cls.BASIC_HEADER_SIZE])
class BitcoinTestnetMixin(object):
SHORTNAME = "XTN"
NET = "testnet"

36
lib/tx.py

@ -335,3 +335,39 @@ class DeserializerReddcoin(Deserializer):
outputs,
locktime,
), double_sha256(self.binary[start:self.cursor])
class DeserializerTxTimeAuxPow(DeserializerTxTime):
VERSION_AUXPOW = (1 << 8)
def is_merged_block(self):
start = self.cursor
self.cursor = 0
version = self._read_le_uint32()
self.cursor = start
if version & self.VERSION_AUXPOW:
return True
return False
def read_header(self, height, static_header_size):
'''Return the AuxPow block header bytes'''
start = self.cursor
version = self._read_le_uint32()
if version & self.VERSION_AUXPOW:
# We are going to calculate the block size then read it as bytes
self.cursor = start
self.cursor += static_header_size # Block normal header
self.read_tx() # AuxPow transaction
self.cursor += 32 # Parent block hash
merkle_size = self._read_varint()
self.cursor += 32 * merkle_size # Merkle branch
self.cursor += 4 # Index
merkle_size = self._read_varint()
self.cursor += 32 * merkle_size # Chain merkle branch
self.cursor += 4 # Chain index
self.cursor += 80 # Parent block header
header_end = self.cursor
else:
header_end = static_header_size
self.cursor = start
return self._read_nbytes(header_end)

14
tests/blocks/emercoin_mainnet_255544.json

@ -0,0 +1,14 @@
{
"hash": "0106a1f3a8f9ece5e213eb6e62d9b647724b7785bdc6b51737910a13dbbc3360",
"size": 1188,
"height": 255544,
"merkleroot": "6b72c4658cbc026c758d10d8bd1e434391d2b5eacda7b92e4b14901e18f59ce0",
"tx": [
"6b72c4658cbc026c758d10d8bd1e434391d2b5eacda7b92e4b14901e18f59ce0"
],
"time": 1507384461,
"nonce": 0,
"bits": "1800d0a5",
"previousblockhash": "c901fae6103621bd2d946d97eb2946ef8a0d5a6f0f524716d4783c6899f9c6e4",
"block": "05019a02e4c6f999683c78d41647520f6f5a0d8aef4629eb976d942dbd213610e6fa01c9e09cf5181e90144b2eb9a7cdeab5d29143431ebdd8108d756c02bc8c65c4726b8ddcd859a5d00018000000000100000087e0d859010000000000000000000000000000000000000000000000000000000000000000ffffffff610302750741d676381fc9c77841d676381ee793a52f4254432e544f502f4e59412f4542312f4144362ffabe6d6dbbe5aa12107008a60a220800a220fd068f6430b8a531c33d0db347272dc5292e8000000000000000cd006407894e000000000000ffffffff024242554e000000001976a914ba507bae8f1643d2556000ca26b9301b9069dc6b88ac0000000000000000266a24aa21a9ed3782874124388ef2e919659287e455d702146d547b41a56d12b1b89f40cbab6200000000d9bedd194a44d85d2b4f6380bcd5e11ea80bf74706dd0d0000000000000000000bca926bdaef806e6b02edf26f327b9323db51805976b55bb2281b833d938e5f7772473fcebf7e7b4af337949ef79c02a4081b34dff892f5ff7bfa6c9e562a41b430f88d80c6f3b9a31e373494b6c936edf1b11554ca685b6587c1c10c9723f17acc5d3e584ca249f1976cd8e9a7f7ce4b3e9bcaab49f604f8a1a1085872031ad7f7033256c58640d08109746085baa7c12a0653834bea13d56190d664707f575e6b80b08ae2f16be8f1a6f9c46231a66b75e82a6dd1fd628217c17eb332c0568812be071dc9aefe18450a400d00a75702c58fa7f48126afd1bfc1c32896fd022c18671829b85dcba51377276a73b36cb8d6c11a3c0de631aebb40776b56c6767d55324d7731ea510bc02a616a1f1c42cac707ee532ff1e1bbded068681194c40e02454362bedc584b4021986ed8f6fec206f143cd579b88b8f562969bc58d2e001c300be2f3c7f7026825e386608a37b2c6af981b770b784f5771cbb4c27d3df900000000070000000000000000000000000000000000000000000000000000000000000000e2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf97d24db2bfa41474bfb2f877d688fac5faa5e10a2808cf9de307370b93352e54894857d3e08918f70395d9206410fbfa942f1a889aa5ab8188ec33c2f6e207dc7f537f8222340379c1ec62fdf65fb8a39565503229bed1f818f38eb0bf41142f0ad83a7857080ddaac962e156e92e3f07d488bc7f06ca9c070ec0daeb7370ee88cbea15ce5bbf2b83da04eaaba12a4a398f72ff5c32813ff2e489d2f1337ca3dd1000000000000020638c009db3fb62933dd2b3be4602c2513892fa53ccf4f500000000000000000025dd3d6f8d741230a4b5b1847cbb2f9dfe822fc3832989fa0d409e83418ed3507ae0d85973fa0018d8e2ffe701010000008ddcd859010000000000000000000000000000000000000000000000000000000000000000ffffffff060338e6030101ffffffff01201b4700000000002321028caf0472ca07d4534a879aeab480531a68f47753e46118986882ef33b689e788ac0000000046304402201fc3bf8154434f37627333b3b228a4dbf95bcd5fc9def51be0afd40b6b010cc7022045e327bbd7460dfece08514e699afffb54c6881f352f67b5a6e7e50f03e31a1c"
}

15
tests/blocks/emercoin_mainnet_80312.json

@ -0,0 +1,15 @@
{
"hash": "a43347ea24a5318f351c99344c5302f0362becc83c0741a4952f16af99d1d1a1",
"size": 455,
"height": 80312,
"merkleroot": "4f3cd539639fcdae1746962e59c69472f276915cc8372ce4b66995aa66edaeea",
"tx": [
"73bb705dd47369cfdacc28277f2c15ab8132e9b7e3fe8b1ccff2085aa86ab171",
"43b5c1df58c047c5744253d7deb3eca213f4a6a6292eba01bcf0a37e57b558aa"
],
"time": 1421971102,
"nonce": 0,
"bits": "1c2fff64",
"previousblockhash": "a98bcab52484bbef6b775cefc2bf05d413c868fe08c4bd60775ca30310b7bb8a",
"block": "010000008abbb71003a35c7760bdc408fe68c813d405bfc2ef5c776befbb8424b5ca8ba9eaaeed66aa9569b6e42c37c85c9176f27294c6592e964617aecd9f6339d53c4f9e8ec15464ff2f1c0000000002010000009e8ec154010000000000000000000000000000000000000000000000000000000000000000ffffffff0f049e8ec15402e200062f503253482fffffffff0100000000000000000000000000010000009e8ec154012dc1ac382b63ae8643661e09d6cd4000860ef347089dc32a8a54faa2dda730270100000048473044022077f8529c99913589961bb5934ea2dcba8ee3229b220e53c29d0003d80eaf8f99022071d331d092c8c69f114ee9676f2f22134e6515bf178c58aef422eebf629f5bb601ffffffff030000000000000000001097237b000000002321035f85c7b5fca2dbb7b92d3c37fd17d785e7a667fa7a061eda9136afde92160dcbac1097237b000000002321035f85c7b5fca2dbb7b92d3c37fd17d785e7a667fa7a061eda9136afde92160dcbac0000000046304402202c23574792d538607f718066a0d7aa4d373c39b80b1191d70b30e4993fe5a52a022078b4614c56b921d811065baf149476f3d9c3c49b3c66ee12cf2c4636cf0e74d8"
}

4
tests/lib/test_addresses.py

@ -26,7 +26,7 @@
import pytest
from lib.coins import Litecoin, BitcoinCash, Zcash
from lib.coins import Litecoin, BitcoinCash, Zcash, Emercoin
from lib.hash import Base58
addresses = [
@ -34,6 +34,8 @@ addresses = [
"206168f5322583ff37f8e55665a4789ae8963532", "b8cb80b26e8932f5b12a7e"),
(BitcoinCash, "3GxRZWkJufR5XA8hnNJgQ2gkASSheoBcmW",
"a773db925b09add367dcc253c1f9bbc1d11ec6fd", "062d8515e50cb92b8a3a73"),
(Emercoin, "ELAeVHQg2mmdTTrTrZSzMgAQyXfC9TSRys",
"210c4482ad8eacb0d349992973608300677adb15", "d71f2df4ef1b397088d731"),
(Litecoin, "LNBAaWuZmipg29WXfz5dtAm1pjo8FEH8yg",
"206168f5322583ff37f8e55665a4789ae8963532", "b8cb80b26e8932f5b12a7e"),
(Litecoin, "MPAZsQAGrnGWKfQbtFJ2Dfw9V939e7D3E2",

Loading…
Cancel
Save