Skip to content

Commit

Permalink
Merge pull request #1107 from CounterpartyXCP/cip23
Browse files Browse the repository at this point in the history
Cip23
  • Loading branch information
chiguireitor authored Feb 7, 2021
2 parents 25a1c11 + 20fc66b commit e3ea6f5
Show file tree
Hide file tree
Showing 16 changed files with 177 additions and 47 deletions.
22 changes: 15 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@

# Installation

**WARNING** Master branch should only be used for testing. For production releases uses tagged releases.

For a simple Docker-based install of the Counterparty software stack, see [this guide](http://counterparty.io/docs/federated_node/).


Expand All @@ -34,14 +36,20 @@ addresstype=legacy
```
**Note:** you can and should replace the RPC credentials. Remember to use the changed RPC credentials throughout this document.

Download and install latest Indexd:
Download and install latest addrindexrs:
```
$ git clone https://github.com/CounterpartyXCP/indexd-server.git
$ cd indexd-server
$ cp .env-mainnet-example .env
-- Modify .env with your rpcuser and rpcpassword --
$ npm install
$ npm start
$ git clone https://github.com/CounterpartyXCP/addrindexrs.git
$ cd addrindexrs
$ cargo check
-- Setup the appropiate environment variables --
- ADDRINDEXRS_JSONRPC_IMPORT=1
- ADDRINDEXRS_TXID_LIMIT=15000
- ADDRINDEXRS_COOKIE=user:password
- ADDRINDEXRS_INDEXER_RPC_ADDR=0.0.0.0:8432
- ADDRINDEXRS_DAEMON_RPC_ADDR=bitcoin:8332
--
$ cargo build --release
$ cargo run --release
```

You could run the indexd daemon with a process manager like `forever` or `pm2` (recommended).
Expand Down
3 changes: 2 additions & 1 deletion counterpartylib/lib/backend/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,8 @@ def init_mempool_cache():
if max_remaining_num_tx:
for txid in mempool_tx:
tx = mempool_tx[txid]
vin_txhash_list += [vin['txid'] for vin in tx['vin'] if not(tx is None)]
if not(tx is None):
vin_txhash_list += [vin['txid'] for vin in tx['vin']]
BACKEND().getrawtransaction_batch(vin_txhash_list[:max_remaining_num_tx], skip_missing=True, verbose=True)

MEMPOOL_CACHE_INITIALIZED = True
Expand Down
25 changes: 16 additions & 9 deletions counterpartylib/lib/backend/addrindexrs.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,15 +344,22 @@ def send(self, msg):

def ensure_addrindexrs_connected():
global _backend
if _backend == None:
_backend = AddrIndexRsThread(config.INDEXD_CONNECT, config.INDEXD_PORT)
_backend.daemon = True
_backend.start()

_backend.send({
"method": "server.version",
"params": []
})
backoff = 500
max_backoff = 5000
while _backend == None:
try:
_backend = AddrIndexRsThread(config.INDEXD_CONNECT, config.INDEXD_PORT)
_backend.daemon = True
_backend.start()

_backend.send({
"method": "server.version",
"params": []
})
except Exception as e:
logger.debug(e)
time.sleep(backoff)
backoff = min(backoff * 1.5, max_backoff)

def _script_pubkey_to_hash(spk):
return hashlib.sha256(spk).digest()[::-1].hex()
Expand Down
2 changes: 1 addition & 1 deletion counterpartylib/lib/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
# Versions
VERSION_MAJOR = 9
VERSION_MINOR = 59
VERSION_REVISION = 1
VERSION_REVISION = 3
VERSION_STRING = str(VERSION_MAJOR) + '.' + str(VERSION_MINOR) + '.' + str(VERSION_REVISION)


Expand Down
9 changes: 6 additions & 3 deletions counterpartylib/lib/messages/dividend.py
Original file line number Diff line number Diff line change
Expand Up @@ -84,22 +84,24 @@ def validate (db, source, quantity_per_unit, asset, dividend_asset, block_index)
if util.enabled('zero_quantity_value_adjustment_1'):
exclude_empty = True
holders = util.holders(db, asset, exclude_empty)

outputs = []
addresses = []
dividend_total = 0
for holder in holders:

if block_index < 294500 and not (config.TESTNET or config.REGTEST): # Protocol change.
if holder['escrow']: continue

address = holder['address']
address_quantity = holder['address_quantity']

if block_index >= 296000 or config.TESTNET or config.REGTEST: # Protocol change.
if address == source: continue

dividend_quantity = address_quantity * quantity_per_unit
if divisible: dividend_quantity /= config.UNIT
if not dividend_divisible: dividend_quantity /= config.UNIT
if not util.enabled('nondivisible_dividend_fix') and not dividend_divisible: dividend_quantity /= config.UNIT # Pre-fix behaviour
if util.enabled('nondivisible_dividend_fix') and not dividend_divisible: dividend_quantity /= config.UNIT # Fixed behaviour
if dividend_asset == config.BTC and dividend_quantity < config.DEFAULT_MULTISIG_DUST_SIZE: continue # A bit hackish.
dividend_quantity = int(dividend_quantity)

Expand Down Expand Up @@ -194,7 +196,8 @@ def parse (db, tx, message):

# Credit.
for output in outputs:
util.credit(db, output['address'], dividend_asset, output['dividend_quantity'], action='dividend', event=tx['tx_hash'])
if not util.enabled('dont_credit_zero_dividend') or output['dividend_quantity'] > 0:
util.credit(db, output['address'], dividend_asset, output['dividend_quantity'], action='dividend', event=tx['tx_hash'])

# Add parsed transaction to message-type–specific table.
bindings = {
Expand Down
14 changes: 14 additions & 0 deletions counterpartylib/protocol_changes.json
Original file line number Diff line number Diff line change
Expand Up @@ -257,5 +257,19 @@
"minimum_version_revision": 0,
"block_index": 662000,
"testnet_block_index": 1666625
},
"nondivisible_dividend_fix": {
"minimum_version_major": 9,
"minimum_version_minor": 59,
"minimum_version_revision": 3,
"block_index": 670000,
"testnet_block_index": 1666625
},
"dont_credit_zero_dividend": {
"minimum_version_major": 9,
"minimum_version_minor": 59,
"minimum_version_revision": 3,
"block_index": 670000,
"testnet_block_index": 1666625
}
}
16 changes: 14 additions & 2 deletions counterpartylib/test/fixtures/scenarios/multisig_1_of_2.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PRAGMA page_size=4096;
-- PRAGMA page_size=1024;
-- PRAGMA encoding='UTF-8';
-- PRAGMA auto_vacuum=NONE;
-- PRAGMA max_page_count=1073741823;
Expand Down Expand Up @@ -591,7 +591,19 @@ CREATE TABLE dispenses(
destination TEXT,
asset TEXT,
dispense_quantity INTEGER,
PRIMARY KEY (tx_index, dispense_index, source, destination));
dispenser_tx_hash TEXT,
PRIMARY KEY (tx_index, dispense_index, source, destination),
FOREIGN KEY (tx_index, tx_hash, block_index) REFERENCES transactions(tx_index, tx_hash, block_index));
-- Triggers and indices on dispenses
CREATE TRIGGER _dispenses_delete BEFORE DELETE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'INSERT INTO dispenses(rowid,tx_index,dispense_index,tx_hash,block_index,source,destination,asset,dispense_quantity,dispenser_tx_hash) VALUES('||old.rowid||','||quote(old.tx_index)||','||quote(old.dispense_index)||','||quote(old.tx_hash)||','||quote(old.block_index)||','||quote(old.source)||','||quote(old.destination)||','||quote(old.asset)||','||quote(old.dispense_quantity)||','||quote(old.dispenser_tx_hash)||')');
END;
CREATE TRIGGER _dispenses_insert AFTER INSERT ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'DELETE FROM dispenses WHERE rowid='||new.rowid);
END;
CREATE TRIGGER _dispenses_update AFTER UPDATE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'UPDATE dispenses SET tx_index='||quote(old.tx_index)||',dispense_index='||quote(old.dispense_index)||',tx_hash='||quote(old.tx_hash)||',block_index='||quote(old.block_index)||',source='||quote(old.source)||',destination='||quote(old.destination)||',asset='||quote(old.asset)||',dispense_quantity='||quote(old.dispense_quantity)||',dispenser_tx_hash='||quote(old.dispenser_tx_hash)||' WHERE rowid='||old.rowid);
END;

-- Table dividends
DROP TABLE IF EXISTS dividends;
Expand Down
16 changes: 14 additions & 2 deletions counterpartylib/test/fixtures/scenarios/multisig_1_of_3.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PRAGMA page_size=4096;
-- PRAGMA page_size=1024;
-- PRAGMA encoding='UTF-8';
-- PRAGMA auto_vacuum=NONE;
-- PRAGMA max_page_count=1073741823;
Expand Down Expand Up @@ -591,7 +591,19 @@ CREATE TABLE dispenses(
destination TEXT,
asset TEXT,
dispense_quantity INTEGER,
PRIMARY KEY (tx_index, dispense_index, source, destination));
dispenser_tx_hash TEXT,
PRIMARY KEY (tx_index, dispense_index, source, destination),
FOREIGN KEY (tx_index, tx_hash, block_index) REFERENCES transactions(tx_index, tx_hash, block_index));
-- Triggers and indices on dispenses
CREATE TRIGGER _dispenses_delete BEFORE DELETE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'INSERT INTO dispenses(rowid,tx_index,dispense_index,tx_hash,block_index,source,destination,asset,dispense_quantity,dispenser_tx_hash) VALUES('||old.rowid||','||quote(old.tx_index)||','||quote(old.dispense_index)||','||quote(old.tx_hash)||','||quote(old.block_index)||','||quote(old.source)||','||quote(old.destination)||','||quote(old.asset)||','||quote(old.dispense_quantity)||','||quote(old.dispenser_tx_hash)||')');
END;
CREATE TRIGGER _dispenses_insert AFTER INSERT ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'DELETE FROM dispenses WHERE rowid='||new.rowid);
END;
CREATE TRIGGER _dispenses_update AFTER UPDATE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'UPDATE dispenses SET tx_index='||quote(old.tx_index)||',dispense_index='||quote(old.dispense_index)||',tx_hash='||quote(old.tx_hash)||',block_index='||quote(old.block_index)||',source='||quote(old.source)||',destination='||quote(old.destination)||',asset='||quote(old.asset)||',dispense_quantity='||quote(old.dispense_quantity)||',dispenser_tx_hash='||quote(old.dispenser_tx_hash)||' WHERE rowid='||old.rowid);
END;

-- Table dividends
DROP TABLE IF EXISTS dividends;
Expand Down
16 changes: 14 additions & 2 deletions counterpartylib/test/fixtures/scenarios/multisig_2_of_2.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PRAGMA page_size=4096;
-- PRAGMA page_size=1024;
-- PRAGMA encoding='UTF-8';
-- PRAGMA auto_vacuum=NONE;
-- PRAGMA max_page_count=1073741823;
Expand Down Expand Up @@ -591,7 +591,19 @@ CREATE TABLE dispenses(
destination TEXT,
asset TEXT,
dispense_quantity INTEGER,
PRIMARY KEY (tx_index, dispense_index, source, destination));
dispenser_tx_hash TEXT,
PRIMARY KEY (tx_index, dispense_index, source, destination),
FOREIGN KEY (tx_index, tx_hash, block_index) REFERENCES transactions(tx_index, tx_hash, block_index));
-- Triggers and indices on dispenses
CREATE TRIGGER _dispenses_delete BEFORE DELETE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'INSERT INTO dispenses(rowid,tx_index,dispense_index,tx_hash,block_index,source,destination,asset,dispense_quantity,dispenser_tx_hash) VALUES('||old.rowid||','||quote(old.tx_index)||','||quote(old.dispense_index)||','||quote(old.tx_hash)||','||quote(old.block_index)||','||quote(old.source)||','||quote(old.destination)||','||quote(old.asset)||','||quote(old.dispense_quantity)||','||quote(old.dispenser_tx_hash)||')');
END;
CREATE TRIGGER _dispenses_insert AFTER INSERT ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'DELETE FROM dispenses WHERE rowid='||new.rowid);
END;
CREATE TRIGGER _dispenses_update AFTER UPDATE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'UPDATE dispenses SET tx_index='||quote(old.tx_index)||',dispense_index='||quote(old.dispense_index)||',tx_hash='||quote(old.tx_hash)||',block_index='||quote(old.block_index)||',source='||quote(old.source)||',destination='||quote(old.destination)||',asset='||quote(old.asset)||',dispense_quantity='||quote(old.dispense_quantity)||',dispenser_tx_hash='||quote(old.dispenser_tx_hash)||' WHERE rowid='||old.rowid);
END;

-- Table dividends
DROP TABLE IF EXISTS dividends;
Expand Down
16 changes: 14 additions & 2 deletions counterpartylib/test/fixtures/scenarios/multisig_2_of_3.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PRAGMA page_size=4096;
-- PRAGMA page_size=1024;
-- PRAGMA encoding='UTF-8';
-- PRAGMA auto_vacuum=NONE;
-- PRAGMA max_page_count=1073741823;
Expand Down Expand Up @@ -591,7 +591,19 @@ CREATE TABLE dispenses(
destination TEXT,
asset TEXT,
dispense_quantity INTEGER,
PRIMARY KEY (tx_index, dispense_index, source, destination));
dispenser_tx_hash TEXT,
PRIMARY KEY (tx_index, dispense_index, source, destination),
FOREIGN KEY (tx_index, tx_hash, block_index) REFERENCES transactions(tx_index, tx_hash, block_index));
-- Triggers and indices on dispenses
CREATE TRIGGER _dispenses_delete BEFORE DELETE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'INSERT INTO dispenses(rowid,tx_index,dispense_index,tx_hash,block_index,source,destination,asset,dispense_quantity,dispenser_tx_hash) VALUES('||old.rowid||','||quote(old.tx_index)||','||quote(old.dispense_index)||','||quote(old.tx_hash)||','||quote(old.block_index)||','||quote(old.source)||','||quote(old.destination)||','||quote(old.asset)||','||quote(old.dispense_quantity)||','||quote(old.dispenser_tx_hash)||')');
END;
CREATE TRIGGER _dispenses_insert AFTER INSERT ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'DELETE FROM dispenses WHERE rowid='||new.rowid);
END;
CREATE TRIGGER _dispenses_update AFTER UPDATE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'UPDATE dispenses SET tx_index='||quote(old.tx_index)||',dispense_index='||quote(old.dispense_index)||',tx_hash='||quote(old.tx_hash)||',block_index='||quote(old.block_index)||',source='||quote(old.source)||',destination='||quote(old.destination)||',asset='||quote(old.asset)||',dispense_quantity='||quote(old.dispense_quantity)||',dispenser_tx_hash='||quote(old.dispenser_tx_hash)||' WHERE rowid='||old.rowid);
END;

-- Table dividends
DROP TABLE IF EXISTS dividends;
Expand Down
16 changes: 14 additions & 2 deletions counterpartylib/test/fixtures/scenarios/multisig_3_of_3.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PRAGMA page_size=4096;
-- PRAGMA page_size=1024;
-- PRAGMA encoding='UTF-8';
-- PRAGMA auto_vacuum=NONE;
-- PRAGMA max_page_count=1073741823;
Expand Down Expand Up @@ -591,7 +591,19 @@ CREATE TABLE dispenses(
destination TEXT,
asset TEXT,
dispense_quantity INTEGER,
PRIMARY KEY (tx_index, dispense_index, source, destination));
dispenser_tx_hash TEXT,
PRIMARY KEY (tx_index, dispense_index, source, destination),
FOREIGN KEY (tx_index, tx_hash, block_index) REFERENCES transactions(tx_index, tx_hash, block_index));
-- Triggers and indices on dispenses
CREATE TRIGGER _dispenses_delete BEFORE DELETE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'INSERT INTO dispenses(rowid,tx_index,dispense_index,tx_hash,block_index,source,destination,asset,dispense_quantity,dispenser_tx_hash) VALUES('||old.rowid||','||quote(old.tx_index)||','||quote(old.dispense_index)||','||quote(old.tx_hash)||','||quote(old.block_index)||','||quote(old.source)||','||quote(old.destination)||','||quote(old.asset)||','||quote(old.dispense_quantity)||','||quote(old.dispenser_tx_hash)||')');
END;
CREATE TRIGGER _dispenses_insert AFTER INSERT ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'DELETE FROM dispenses WHERE rowid='||new.rowid);
END;
CREATE TRIGGER _dispenses_update AFTER UPDATE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'UPDATE dispenses SET tx_index='||quote(old.tx_index)||',dispense_index='||quote(old.dispense_index)||',tx_hash='||quote(old.tx_hash)||',block_index='||quote(old.block_index)||',source='||quote(old.source)||',destination='||quote(old.destination)||',asset='||quote(old.asset)||',dispense_quantity='||quote(old.dispense_quantity)||',dispenser_tx_hash='||quote(old.dispenser_tx_hash)||' WHERE rowid='||old.rowid);
END;

-- Table dividends
DROP TABLE IF EXISTS dividends;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PRAGMA page_size=4096;
-- PRAGMA page_size=1024;
-- PRAGMA encoding='UTF-8';
-- PRAGMA auto_vacuum=NONE;
-- PRAGMA max_page_count=1073741823;
Expand Down Expand Up @@ -1050,7 +1050,19 @@ CREATE TABLE dispenses(
destination TEXT,
asset TEXT,
dispense_quantity INTEGER,
PRIMARY KEY (tx_index, dispense_index, source, destination));
dispenser_tx_hash TEXT,
PRIMARY KEY (tx_index, dispense_index, source, destination),
FOREIGN KEY (tx_index, tx_hash, block_index) REFERENCES transactions(tx_index, tx_hash, block_index));
-- Triggers and indices on dispenses
CREATE TRIGGER _dispenses_delete BEFORE DELETE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'INSERT INTO dispenses(rowid,tx_index,dispense_index,tx_hash,block_index,source,destination,asset,dispense_quantity,dispenser_tx_hash) VALUES('||old.rowid||','||quote(old.tx_index)||','||quote(old.dispense_index)||','||quote(old.tx_hash)||','||quote(old.block_index)||','||quote(old.source)||','||quote(old.destination)||','||quote(old.asset)||','||quote(old.dispense_quantity)||','||quote(old.dispenser_tx_hash)||')');
END;
CREATE TRIGGER _dispenses_insert AFTER INSERT ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'DELETE FROM dispenses WHERE rowid='||new.rowid);
END;
CREATE TRIGGER _dispenses_update AFTER UPDATE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'UPDATE dispenses SET tx_index='||quote(old.tx_index)||',dispense_index='||quote(old.dispense_index)||',tx_hash='||quote(old.tx_hash)||',block_index='||quote(old.block_index)||',source='||quote(old.source)||',destination='||quote(old.destination)||',asset='||quote(old.asset)||',dispense_quantity='||quote(old.dispense_quantity)||',dispenser_tx_hash='||quote(old.dispenser_tx_hash)||' WHERE rowid='||old.rowid);
END;

-- Table dividends
DROP TABLE IF EXISTS dividends;
Expand Down
16 changes: 14 additions & 2 deletions counterpartylib/test/fixtures/scenarios/simplesig.sql
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
PRAGMA page_size=4096;
-- PRAGMA page_size=1024;
-- PRAGMA encoding='UTF-8';
-- PRAGMA auto_vacuum=NONE;
-- PRAGMA max_page_count=1073741823;
Expand Down Expand Up @@ -591,7 +591,19 @@ CREATE TABLE dispenses(
destination TEXT,
asset TEXT,
dispense_quantity INTEGER,
PRIMARY KEY (tx_index, dispense_index, source, destination));
dispenser_tx_hash TEXT,
PRIMARY KEY (tx_index, dispense_index, source, destination),
FOREIGN KEY (tx_index, tx_hash, block_index) REFERENCES transactions(tx_index, tx_hash, block_index));
-- Triggers and indices on dispenses
CREATE TRIGGER _dispenses_delete BEFORE DELETE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'INSERT INTO dispenses(rowid,tx_index,dispense_index,tx_hash,block_index,source,destination,asset,dispense_quantity,dispenser_tx_hash) VALUES('||old.rowid||','||quote(old.tx_index)||','||quote(old.dispense_index)||','||quote(old.tx_hash)||','||quote(old.block_index)||','||quote(old.source)||','||quote(old.destination)||','||quote(old.asset)||','||quote(old.dispense_quantity)||','||quote(old.dispenser_tx_hash)||')');
END;
CREATE TRIGGER _dispenses_insert AFTER INSERT ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'DELETE FROM dispenses WHERE rowid='||new.rowid);
END;
CREATE TRIGGER _dispenses_update AFTER UPDATE ON dispenses BEGIN
INSERT INTO undolog VALUES(NULL, 'UPDATE dispenses SET tx_index='||quote(old.tx_index)||',dispense_index='||quote(old.dispense_index)||',tx_hash='||quote(old.tx_hash)||',block_index='||quote(old.block_index)||',source='||quote(old.source)||',destination='||quote(old.destination)||',asset='||quote(old.asset)||',dispense_quantity='||quote(old.dispense_quantity)||',dispenser_tx_hash='||quote(old.dispenser_tx_hash)||' WHERE rowid='||old.rowid);
END;

-- Table dividends
DROP TABLE IF EXISTS dividends;
Expand Down
Loading

0 comments on commit e3ea6f5

Please sign in to comment.