StratisBitcoinFullNode icon indicating copy to clipboard operation
StratisBitcoinFullNode copied to clipboard

ElectrumX compatibilty

Open onnateldome opened this issue 4 years ago • 5 comments

We have been trying unsuccessfully to use StratisBitcoinFullNode with (electrumx).

add at the end of electrumx/electrumx/lib/coins.py

class Stratis(Coin):
    NAME = "Stratis"
    SHORTNAME = "STRAT"
    NET = "mainnet"
    XPUB_VERBYTES = bytes.fromhex("0488C21E")
    XPRV_VERBYTES = bytes.fromhex("0488B2DD")
    P2PKH_VERBYTE = bytes.fromhex("3f")
    P2SH_VERBYTES = [bytes.fromhex("7d")]
    WIF_BYTE = bytes.fromhex("bf")
    GENESIS_HASH = ('0000066e91e46e5a264d42c89e120496'
                    '3b2ee6be230b443e9159020539d972af')
    DESERIALIZER = lib_tx.DeserializerTxTime
    DAEMON = daemon.LegacyRPCDaemon
    TX_COUNT = 1
    TX_COUNT_HEIGHT = 1
    TX_PER_BLOCK = 1
    RPC_PORT = 26174
    REORG_LIMIT = 5000

    @classmethod
    def header_hash(cls, header):
        return pow_hash.x13(header)

onnateldome avatar Aug 31 '19 11:08 onnateldome

I've managed to start the syncing process by modifying the daemon.py and coins.py on the ElectrumX side and removing charset header from the Stratis FullNode response. I suppose that PR #3923 might have also played a role.

I have installed a python module x13-hash in addition to the recommended modules.

Currently I can see that the genesis block have been validated and there are no errors being printed to the console.

INFO:electrumx:ElectrumX server starting
INFO:electrumx:logging level: INFO
INFO:Controller:Python version: 3.6.8 (default, Jan 14 2019, 11:02:34)  [GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
INFO:Controller:software version: ElectrumX 1.12
INFO:Controller:aiorpcX version: 0.18.3
INFO:Controller:supported protocol versions: 1.4-1.4.2
INFO:Controller:event loop policy: None
INFO:Controller:reorg limit is 500 blocks
INFO:LegacyRPCDaemon:daemon #1 at 10.0.75.1:16174/ (current)
INFO:DB:switching current directory to /root/database
INFO:DB:using leveldb for DB backend
INFO:DB:created new database
INFO:DB:creating metadata directory
INFO:DB:DB version: 6
INFO:DB:coin: Stratis
INFO:DB:network: mainnet
INFO:DB:height: -1
INFO:DB:tip: 0000000000000000000000000000000000000000000000000000000000000000
INFO:DB:tx count: 0
INFO:DB:flushing DB cache at 1,200 MB
INFO:DB:sync time so far: 00s
INFO:History:history DB version: 0
INFO:History:flush count: 0
INFO:Prefetcher:catching up to daemon height 17,899 (17,900 blocks behind)
INFO:Prefetcher:verified genesis block with hash 0000066e91e46e5a264d42c89e1204963b2ee6be230b443e9159020539d972af
WARNING:BlockProcessor:daemon blocks do not form a chain; resetting the prefetcher

Stratis FullNode change https://github.com/stratisproject/StratisBitcoinFullNode/blob/eea4aee1629c4fb85e2841ee9345f84433d09a4d/src/Stratis.Bitcoin.Features.RPC/RPCMiddleware.cs#L205

ElectrumX changes

File daemon.py

index ff6366a..7d5630b 100644
--- a/electrumx/server/daemon.py
+++ b/electrumx/server/daemon.py
@@ -371,7 +371,7 @@ class LegacyRPCDaemon(Daemon):
     def timestamp_safe(self, t):
         if isinstance(t, int):
             return t
-        return timegm(time.strptime(t, "%Y-%m-%d %H:%M:%S %Z"))
+        return int(t)
 
 
 class DecredDaemon(Daemon):

File coins.py

    NAME = "Stratis"
    SHORTNAME = "STRAT"
    NET = "mainnet"
    XPUB_VERBYTES = bytes.fromhex("0488C21E")
    XPRV_VERBYTES = bytes.fromhex("0488B2DD")
    P2PKH_VERBYTE = bytes.fromhex("3f")
    P2SH_VERBYTES = [bytes.fromhex("7d")]
    WIF_BYTE = bytes.fromhex("bf")
    GENESIS_HASH = ('0000066e91e46e5a264d42c89e120496'
                    '3b2ee6be230b443e9159020539d972af')
    DESERIALIZER = lib_tx.DeserializerTxTime
    DAEMON = daemon.LegacyRPCDaemon
    TX_COUNT = 1
    TX_COUNT_HEIGHT = 1
    TX_PER_BLOCK = 1
    RPC_PORT = 16174
    REORG_LIMIT = 500

    @classmethod
    def header_hash(cls, header):
        import x13_hash
        return x13_hash.getPoWHash(header)

fshutdown avatar Sep 03 '19 23:09 fshutdown

I solved this: httpContext.Response.ContentType = "application/json; charset=utf-8";

by changing electrumx/server/daemon.py from

kind = resp.headers.get('Content-Type', None)
                    if kind == 'application/json':

to

 kind = resp.headers.get('Content-Type', None)
                    if 'application/json' in kind:

onnateldome avatar Sep 04 '19 08:09 onnateldome

if 'application/json' in kind: seems more correct in anycase

dangershony avatar Sep 04 '19 15:09 dangershony

I've managed to start the syncing process by modifying the daemon.py and coins.py on the ElectrumX side and removing charset header from the Stratis FullNode response. I suppose that PR #3923 might have also played a role.

I have installed a python module x13-hash in addition to the recommended modules.

Currently I can see that the genesis block have been validated and there are no errors being printed to the console.

INFO:electrumx:ElectrumX server starting
INFO:electrumx:logging level: INFO
INFO:Controller:Python version: 3.6.8 (default, Jan 14 2019, 11:02:34)  [GCC 8.0.1 20180414 (experimental) [trunk revision 259383]]
INFO:Controller:software version: ElectrumX 1.12
INFO:Controller:aiorpcX version: 0.18.3
INFO:Controller:supported protocol versions: 1.4-1.4.2
INFO:Controller:event loop policy: None
INFO:Controller:reorg limit is 500 blocks
INFO:LegacyRPCDaemon:daemon #1 at 10.0.75.1:16174/ (current)
INFO:DB:switching current directory to /root/database
INFO:DB:using leveldb for DB backend
INFO:DB:created new database
INFO:DB:creating metadata directory
INFO:DB:DB version: 6
INFO:DB:coin: Stratis
INFO:DB:network: mainnet
INFO:DB:height: -1
INFO:DB:tip: 0000000000000000000000000000000000000000000000000000000000000000
INFO:DB:tx count: 0
INFO:DB:flushing DB cache at 1,200 MB
INFO:DB:sync time so far: 00s
INFO:History:history DB version: 0
INFO:History:flush count: 0
INFO:Prefetcher:catching up to daemon height 17,899 (17,900 blocks behind)
INFO:Prefetcher:verified genesis block with hash 0000066e91e46e5a264d42c89e1204963b2ee6be230b443e9159020539d972af
WARNING:BlockProcessor:daemon blocks do not form a chain; resetting the prefetcher
2019-09-05 22:00:18,896:INFO:Prefetcher:catching up to daemon height 1,454,116 (
1,454,117 blocks behind)
2019-09-05 22:00:18,969:INFO:Prefetcher:verified genesis block with hash 0000066
e91e46e5a264d42c89e1204963b2ee6be230b443e9159020539d972af
2019-09-05 22:00:18,972:WARNING:BlockProcessor:daemon blocks do not form a chain
; resetting the prefetcher
2019-09-05 22:00:18,993:INFO:BlockProcessor:flushing to DB for a clean shutdown.
..
2019-09-05 22:00:18,993:INFO:SessionManager:closing down RPC listening servers
ERROR:root:task crashed: <Task finished coro=<Controller.serve() done, defined a
t /electrumx/electrumx/server/controller.py:81> exception=TypeError('str
ing indices must be integers',)>

onnateldome avatar Sep 05 '19 22:09 onnateldome

@onnateldome You need to patch daemon.py as per my diff above.

The RPC call returns a time in Unix epoch and you try to parse it as a string. I realise that my solution will need to be extended to cater for other node types but it stands to demonstrate a valid solution.

fshutdown avatar Sep 06 '19 14:09 fshutdown