Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 74 additions & 1 deletion src/electrumx/lib/coins.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
from typing import Sequence, Tuple

import electrumx.lib.util as util
from electrumx.lib.hash import Base58, double_sha256, hash_to_hex_str
from electrumx.lib.hash import Base58, double_sha256, double_sha3_256, hash_to_hex_str
from electrumx.lib.hash import HASHX_LEN, hex_str_to_hash
from electrumx.lib.script import (_match_ops, Script, ScriptError,
ScriptPubKey, OpCodes)
Expand Down Expand Up @@ -4128,3 +4128,76 @@ class FerriteTestnet(Ferrite):
'enode2.ferritecoin.org s t',
'enode3.ferritecoin.org s t',
]


class Kylacoin(Coin):
NAME = "Kylacoin"
SHORTNAME = "KCN"
NET = "mainnet"
VALUE_PER_COIN = 1000000000000
DEFAULT_MAX_SEND = 8000000
XPUB_VERBYTES = bytes.fromhex("038f332e")
XPRV_VERBYTES = bytes.fromhex("038f2ef4")
P2PKH_VERBYTE = bytes.fromhex("1c")
P2SH_VERBYTES = bytes.fromhex("1a")
WIF_BYTE = bytes.fromhex("41")
GENESIS_HASH = ('0000000091ddc5a0b9f0ed098a4db06e'
'e9bc286a104f092f4fb476eb9364b7c9')
DESERIALIZER = lib_tx.DeserializerKylacoin
ESTIMATE_FEE = 0.0001
RELAY_FEE = 0.0001
TX_COUNT = 2237124
TX_COUNT_HEIGHT = 1463512
TX_PER_BLOCK = 1
RPC_PORT = 5110
REORG_LIMIT = 800
PEERS = [
'electrum1.kcnxp.com t51001 s51002',
'electrum2.kcnxp.com t51001 s51002',
'electrum3.kcnxp.com t51001 s51002',
'electrum4.kcnxp.com t51001 s51002',
'electrum5.kcnxp.com t51001 s51002'
]

@classmethod
def header_hash(cls, header):
'''Given a header return hash'''
return double_sha3_256(header)


class Lyncoin(AuxPowMixin, Coin):
NAME = "Lyncoin"
SHORTNAME = "LCN"
NET = "mainnet"
VALUE_PER_COIN = 100000000
DEFAULT_MAX_SEND = 8000000
XPUB_VERBYTES = bytes.fromhex("019c354f")
XPRV_VERBYTES = bytes.fromhex("019c3115")
P2PKH_VERBYTE = bytes.fromhex("ea")
P2SH_VERBYTES = bytes.fromhex("37")
WIF_BYTE = bytes.fromhex("7e")
GENESIS_HASH = ('000000002b8761c63862f5047afb9ac5'
'fdd1c67e87cd376c387628bc772bb39d')
DESERIALIZER = lib_tx.DeserializerLyncoin
ESTIMATE_FEE = 1
RELAY_FEE = 1
TX_COUNT = 906114
TX_COUNT_HEIGHT = 555605
TX_PER_BLOCK = 1
RPC_PORT = 5053
REORG_LIMIT = 800
PEERS = [
'electrum1.lcnxp.com t52001 s52002',
'electrum2.lcnxp.com t52001 s52002',
'electrum3.lcnxp.com t52001 s52002',
'electrum4.lcnxp.com t52001 s52002',
'electrum5.lcnxp.com t52001 s52002'
]

@classmethod
def header_hash(cls, header):
'''Given a header return hash'''
version = int.from_bytes(header[:4], 'little')
if version & 0x8000:
return double_sha3_256(header[:cls.BASIC_HEADER_SIZE])
return double_sha256(header[:cls.BASIC_HEADER_SIZE])
11 changes: 11 additions & 0 deletions src/electrumx/lib/hash.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
from electrumx.lib.util import bytes_to_int, int_to_bytes, hex_to_bytes

_sha256 = hashlib.sha256
_sha3_256 = hashlib.sha3_256
_new_hash = hashlib.new
_hmac_digest = hmac.digest
HASHX_LEN = 11
Expand All @@ -47,6 +48,16 @@ def double_sha256(x):
return sha256(sha256(x))


def sha3_256(x):
'''Simple wrapper of hashlib sha3-256.'''
return _sha3_256(x).digest()


def double_sha3_256(x):
'''SHA3-256 of SHA3-256.'''
return sha3_256(sha3_256(x))


def hash_to_hex_str(x):
'''Convert a big-endian binary hash to displayed hex string.

Expand Down
16 changes: 15 additions & 1 deletion src/electrumx/lib/tx.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
from hashlib import blake2s
from typing import Sequence, Optional, Tuple

from electrumx.lib.hash import sha256, double_sha256, hash_to_hex_str
from electrumx.lib.hash import sha256, double_sha256, double_sha3_256, hash_to_hex_str
from electrumx.lib.script import OpCodes
from electrumx.lib.util import (
unpack_le_int32_from, unpack_le_int64_from, unpack_le_uint16_from,
Expand Down Expand Up @@ -1410,3 +1410,17 @@ def read_header(self, static_header_size):
header_end = self.cursor
self.cursor = start
return self._read_nbytes(header_end - start)


class DeserializerKylacoin(DeserializerSegWit):
TX_HASH_FN = staticmethod(double_sha3_256)


class DeserializerLyncoin(DeserializerSegWit, DeserializerAuxPow):

@staticmethod
def TX_HASH_FN(tx):
version = int.from_bytes(tx[:4], 'little')
if version == 8:
return double_sha3_256(tx)
return double_sha256(tx)
14 changes: 14 additions & 0 deletions tests/blocks/kylacoin_mainnet_1000000.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"hash": "000000000002186060cc90fe68881679e92fe2e35b0d9cdbbf750a2fd4e4cb13",
"size": 308,
"height": 1000000,
"merkleroot": "98eee48ddcd0f2a938cc374af98b7a8584fa179b7a951b4b5763b8b4e4a98291",
"tx": [
"98eee48ddcd0f2a938cc374af98b7a8584fa179b7a951b4b5763b8b4e4a98291"
],
"time": 1709655186,
"nonce": 13617342,
"bits": "1b02a597",
"previousblockhash": "000000000001526ac064bb157a19bdc04371c2483d2f6bd542ae1ab4a3cd66a8",
"block": "00000020a866cda3b41aae42d56b2f3d48c27143c0bd197a15bb64c06a520100000000009182a9e4b4b863574b1b957a9b17fa84857a8bf94a37cc38a9f2d0dc8de4ee989244e76597a5021bbec8cf0001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1c0340420f049244e76500f0003497ff070000095669706f722e6e657400000000030000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90065cd1d000000001600143635552e61f1c1e2b5e7f86e25ecf921f0fff973008d380c010000001976a914df3a6bf396ad1f5a419f10886477db3be3cdb0c788ac0120000000000000000000000000000000000000000000000000000000000000000000000000"
}
14 changes: 14 additions & 0 deletions tests/blocks/kylacoin_mainnet_1200000.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"hash": "ed4d19d71e785da21b3bf2127175e8d7be68aab8143e6ae70637ca49f5cdc0dd",
"size": 318,
"height": 1200000,
"merkleroot": "42f63e62a0c18c390f649c864267b9e5958176d03395534e54aa92f135ccb71f",
"tx": [
"42f63e62a0c18c390f649c864267b9e5958176d03395534e54aa92f135ccb71f"
],
"time": 1721606421,
"nonce": 2363,
"bits": "1d29d9f3",
"previousblockhash": "7b92e3608d178eab8b1778374cf9380f7834cd54fdfbae0aa0291a05eddeb854",
"block": "0080002054b8deed051a29a00aaefbfd54cd34780f38f94c3778178bab8e178d60e3927b1fb7cc35f192aa544e539533d0768195e5b96742869c640f398cc1a0623ef64215a19d66f3d9291d3b09000001010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff2903804f120416a19d66110000001b1af18200cccccccccccccccccc0d2f6e6f64655374726174756d2f00000000030065cd1d000000001600143635552e61f1c1e2b5e7f86e25ecf921f0fff973008d380c01000000160014c5d660290e2b7151d0f7c650dd4eb28072ed48bb0000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000"
}
14 changes: 14 additions & 0 deletions tests/blocks/lyncoin_mainnet_250000.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"hash": "fcd4d137334aedad9c8e821d4c09238b16cdc30a8e3d4f53c81922120f89f03f",
"size": 1024,
"height": 250000,
"merkleroot": "59a4f0659dc94926e8f6aec5bc99212fc29627001dde569dea77cc44e3230e50",
"tx": [
"59a4f0659dc94926e8f6aec5bc99212fc29627001dde569dea77cc44e3230e50"
],
"time": 1720972424,
"nonce": 0,
"bits": "183b8a82",
"previousblockhash": "f7cfeb94096b009fadb48b2fb575f5e4c20231b61ca32330eaf72644dcd32f0d",
"block": "04010d0b0d2fd3dc4426f7ea3023a31cb63102c2e4f575b52f8bb4ad9f006b0994ebcff7500e23e344cc77ea9d56de1d002796c22f2199bcc5aef6e82649c99d65f0a45988f49366828a3b180000000001000000010000000000000000000000000000000000000000000000000000000000000000ffffffff5403e0090d042bf5936608fabe6d6d5437e041484859563f514a6e623a58ce0223e987f6ad4e79544e0dd03cece6f9000100000000000003e589fac63f2d004802132f4d696e696e672d44757463682f2d3130333700000000018dd0a012000000001976a914a24e2b67689c3753983d3b408bc7690d31b1b74d88ac00000000000000000000000000000000000000000000000000000000000000000000000006999a09bf39f98c6ff908719a32daa151d08f0107b85aba7b62a284384b6d0209c4e0f5d877d4f89430219ed9f10707cdab0b45b48eea2c10669cc90994e3ce0c204eb3239d3878f8a743189468950aaf1e7e423b14b426622a0ed49acfd48d6554ab0d4e330645dc4261644a700654b1bddfc3607f5f8dea8e3c768dd442f469008b193e7c9e62628c4a54a6b39adbe8281bbf1b5446643d4a6ce25b201aeb958a898b40df5357db9d8fca7a42d2707df1edabef3548809c809df725dcef468e00000000080000000000000000000000000000000000000000000000000000000000000000e2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf97d24db2bfa41474bfb2f877d688fac5faa5e10a2808cf9de307370b93352e54894857d3e08918f70395d9206410fbfa942f1a889aa5ab8188ec33c2f6e207dc73e83887992b04d582a613b22c8e2edeeeaeae1bb0d0c367197730412cba999741fa34e5af80f27d8014db5da00386812ae502b71aaa659db3f0272d52dff8819e5f44416174e65543977d99c0543adb6750a0eb20839df2c26d89414668ca185d3f4341264c3b3923f31c2a36c81dedd7e77e3b0d1e4ba7c34c93b86b58fd94d0700000000000020ca72bb7f46ef55a13c48ae3cf15bd375964dc17d1f5aad0100000000000000007fb737322cc8ef15f6d0bdba6d849c862b2870bd1f17597dab99a84c1c42aded2bf59366f94f0218494148a901010000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff050390d00300ffffffff03bc3a7deb670100001976a914822819cee971165c94bd2bfb33cc0323e0b58d8788acbf94b8fd27000000160014e278645407a9c322b0becef0b31762f32ec03a660000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000"
}
14 changes: 14 additions & 0 deletions tests/blocks/lyncoin_mainnet_270000.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"hash": "ce893f8b5ae49147388ca861c639389f168e4c2f1e7e2c64a626de1fb2800e3d",
"size": 679,
"height": 270000,
"merkleroot": "40db3174838699d5f729244a4c762ff714d8d846bc2a990214f44dfe37005b52",
"tx": [
"40db3174838699d5f729244a4c762ff714d8d846bc2a990214f44dfe37005b52"
],
"time": 1722311594,
"nonce": 0,
"bits": "1d38cf5b",
"previousblockhash": "71784cfaf36f9ffdcf25eca7f165b82b071494e3c8eb080174b08e11ef8f4a77",
"block": "04810d0b774a8fef118eb0740108ebc8e39414072bb865f1a7ec25cffd9f6ff3fa4c7871525b0037fe4df41402992abc46d8d814f72f764c4a2429f7d59986837431db40aa63a8665bcf381d0000000008000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4303467a122dfa08656d6de4119dfb520882b11eecea2ada7685e3fedb4dda076c42d69bed34f0876a2f50020000000000000008421b40d805020104072f6d706f6f6c2fffffffff03008d380c01000000160014b2f37faf39c645f046d096cf722d715a480883d40065cd1d000000001600143635552e61f1c1e2b5e7f86e25ecf921f0fff9730000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf900000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000100000000800020e35507bab061fc4f60414820d8e8df084de0a8a3c4febea601333ba9819fb30738e24ca4f3c2a9b6637c38f7011d945cb4b67c0cf58c2e8034d04b44869954d0d563a866452e1f1d950100f001080000000001010000000000000000000000000000000000000000000000000000000000000000ffffffff1503b01e04080000000000000000072f6d706f6f6c2fffffffff03bc3a7deb67010000160014cb40dab2164d63d99dc71acb1628368fc5fea906bf94b8fd27000000160014e278645407a9c322b0becef0b31762f32ec03a660000000000000000266a24aa21a9ede2f61c3f71d1defd3fa999dfa36953755c690689799962b48bebd836974e8cf90120000000000000000000000000000000000000000000000000000000000000000000000000"
}