Compare commits
22 Commits
master
...
v1.0.12-bi
Author | SHA1 | Date |
---|---|---|
![]() |
8040468e24 | 7 years ago |
![]() |
a5c48f146e | 7 years ago |
![]() |
5d28ec01c8 | 7 years ago |
![]() |
9ada5ce81d | 7 years ago |
![]() |
760157bf3d | 7 years ago |
![]() |
00b74c2c8d | 7 years ago |
![]() |
be613308e8 | 7 years ago |
![]() |
d5086779aa | 7 years ago |
![]() |
f341f8c0eb | 7 years ago |
![]() |
a9c6223963 | 7 years ago |
![]() |
124d784aa3 | 7 years ago |
![]() |
e798fad336 | 7 years ago |
![]() |
2dca54dc87 | 7 years ago |
![]() |
01c90c644b | 7 years ago |
![]() |
aea49a9161 | 7 years ago |
![]() |
1949f24d09 | 7 years ago |
![]() |
86ae860238 | 7 years ago |
![]() |
5bdd1a3014 | 7 years ago |
![]() |
7be214325e | 7 years ago |
![]() |
4fb1d231de | 7 years ago |
![]() |
b4ebfad746 | 7 years ago |
![]() |
f559736df3 | 7 years ago |
37 changed files with 2309 additions and 26 deletions
@ -0,0 +1,328 @@ |
|||||
|
#!/usr/bin/env python2 |
||||
|
# Copyright (c) 2014-2015 The Bitcoin Core developers |
||||
|
# Distributed under the MIT software license, see the accompanying |
||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
|
||||
|
# |
||||
|
# Test addressindex generation and fetching |
||||
|
# |
||||
|
|
||||
|
import time |
||||
|
from test_framework.test_framework import BitcoinTestFramework |
||||
|
from test_framework.util import * |
||||
|
from test_framework.script import * |
||||
|
from test_framework.mininode import * |
||||
|
import binascii |
||||
|
|
||||
|
class AddressIndexTest(BitcoinTestFramework): |
||||
|
|
||||
|
def setup_chain(self): |
||||
|
print("Initializing test directory "+self.options.tmpdir) |
||||
|
initialize_chain_clean(self.options.tmpdir, 4) |
||||
|
|
||||
|
def setup_network(self): |
||||
|
self.nodes = [] |
||||
|
# Nodes 0/1 are "wallet" nodes |
||||
|
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug", "-relaypriority=0"])) |
||||
|
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug", "-addressindex"])) |
||||
|
# Nodes 2/3 are used for testing |
||||
|
self.nodes.append(start_node(2, self.options.tmpdir, ["-debug", "-addressindex", "-relaypriority=0"])) |
||||
|
self.nodes.append(start_node(3, self.options.tmpdir, ["-debug", "-addressindex"])) |
||||
|
connect_nodes(self.nodes[0], 1) |
||||
|
connect_nodes(self.nodes[0], 2) |
||||
|
connect_nodes(self.nodes[0], 3) |
||||
|
|
||||
|
self.is_network_split = False |
||||
|
self.sync_all() |
||||
|
|
||||
|
def run_test(self): |
||||
|
print "Mining blocks..." |
||||
|
self.nodes[0].generate(105) |
||||
|
self.sync_all() |
||||
|
|
||||
|
chain_height = self.nodes[1].getblockcount() |
||||
|
assert_equal(chain_height, 105) |
||||
|
assert_equal(self.nodes[1].getbalance(), 0) |
||||
|
assert_equal(self.nodes[2].getbalance(), 0) |
||||
|
|
||||
|
# Check that balances are correct |
||||
|
balance0 = self.nodes[1].getaddressbalance("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br") |
||||
|
assert_equal(balance0["balance"], 0) |
||||
|
|
||||
|
# Check p2pkh and p2sh address indexes |
||||
|
print "Testing p2pkh and p2sh address index..." |
||||
|
|
||||
|
txid0 = self.nodes[0].sendtoaddress("mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs", 10) |
||||
|
self.nodes[0].generate(1) |
||||
|
|
||||
|
txidb0 = self.nodes[0].sendtoaddress("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br", 10) |
||||
|
self.nodes[0].generate(1) |
||||
|
|
||||
|
txid1 = self.nodes[0].sendtoaddress("mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs", 15) |
||||
|
self.nodes[0].generate(1) |
||||
|
|
||||
|
txidb1 = self.nodes[0].sendtoaddress("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br", 15) |
||||
|
self.nodes[0].generate(1) |
||||
|
|
||||
|
txid2 = self.nodes[0].sendtoaddress("mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs", 20) |
||||
|
self.nodes[0].generate(1) |
||||
|
|
||||
|
txidb2 = self.nodes[0].sendtoaddress("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br", 20) |
||||
|
self.nodes[0].generate(1) |
||||
|
|
||||
|
self.sync_all() |
||||
|
|
||||
|
txids = self.nodes[1].getaddresstxids("mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs") |
||||
|
assert_equal(len(txids), 3) |
||||
|
assert_equal(txids[0], txid0) |
||||
|
assert_equal(txids[1], txid1) |
||||
|
assert_equal(txids[2], txid2) |
||||
|
|
||||
|
txidsb = self.nodes[1].getaddresstxids("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br") |
||||
|
assert_equal(len(txidsb), 3) |
||||
|
assert_equal(txidsb[0], txidb0) |
||||
|
assert_equal(txidsb[1], txidb1) |
||||
|
assert_equal(txidsb[2], txidb2) |
||||
|
|
||||
|
# Check that limiting by height works |
||||
|
print "Testing querying txids by range of block heights.." |
||||
|
height_txids = self.nodes[1].getaddresstxids({ |
||||
|
"addresses": ["2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br"], |
||||
|
"start": 105, |
||||
|
"end": 110 |
||||
|
}) |
||||
|
assert_equal(len(height_txids), 2) |
||||
|
assert_equal(height_txids[0], txidb0) |
||||
|
assert_equal(height_txids[1], txidb1) |
||||
|
|
||||
|
# Check that multiple addresses works |
||||
|
multitxids = self.nodes[1].getaddresstxids({"addresses": ["2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br", "mo9ncXisMeAoXwqcV5EWuyncbmCcQN4rVs"]}) |
||||
|
assert_equal(len(multitxids), 6) |
||||
|
assert_equal(multitxids[0], txid0) |
||||
|
assert_equal(multitxids[1], txidb0) |
||||
|
assert_equal(multitxids[2], txid1) |
||||
|
assert_equal(multitxids[3], txidb1) |
||||
|
assert_equal(multitxids[4], txid2) |
||||
|
assert_equal(multitxids[5], txidb2) |
||||
|
|
||||
|
# Check that balances are correct |
||||
|
balance0 = self.nodes[1].getaddressbalance("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br") |
||||
|
assert_equal(balance0["balance"], 45 * 100000000) |
||||
|
|
||||
|
# Check that outputs with the same address will only return one txid |
||||
|
print "Testing for txid uniqueness..." |
||||
|
addressHash = "6349a418fc4578d10a372b54b45c280cc8c4382f".decode("hex") |
||||
|
scriptPubKey = CScript([OP_HASH160, addressHash, OP_EQUAL]) |
||||
|
unspent = self.nodes[0].listunspent() |
||||
|
tx = CTransaction() |
||||
|
tx.vin = [CTxIn(COutPoint(int(unspent[0]["txid"], 16), unspent[0]["vout"]))] |
||||
|
tx.vout = [CTxOut(10, scriptPubKey), CTxOut(11, scriptPubKey)] |
||||
|
tx.rehash() |
||||
|
|
||||
|
signed_tx = self.nodes[0].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
sent_txid = self.nodes[0].sendrawtransaction(signed_tx["hex"], True) |
||||
|
|
||||
|
self.nodes[0].generate(1) |
||||
|
self.sync_all() |
||||
|
|
||||
|
txidsmany = self.nodes[1].getaddresstxids("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br") |
||||
|
assert_equal(len(txidsmany), 4) |
||||
|
assert_equal(txidsmany[3], sent_txid) |
||||
|
|
||||
|
# Check that balances are correct |
||||
|
print "Testing balances..." |
||||
|
balance0 = self.nodes[1].getaddressbalance("2N2JD6wb56AfK4tfmM6PwdVmoYk2dCKf4Br") |
||||
|
assert_equal(balance0["balance"], 45 * 100000000 + 21) |
||||
|
|
||||
|
# Check that balances are correct after spending |
||||
|
print "Testing balances after spending..." |
||||
|
privkey2 = "cSdkPxkAjA4HDr5VHgsebAPDEh9Gyub4HK8UJr2DFGGqKKy4K5sG" |
||||
|
address2 = "mgY65WSfEmsyYaYPQaXhmXMeBhwp4EcsQW" |
||||
|
addressHash2 = "0b2f0a0c31bfe0406b0ccc1381fdbe311946dadc".decode("hex") |
||||
|
scriptPubKey2 = CScript([OP_DUP, OP_HASH160, addressHash2, OP_EQUALVERIFY, OP_CHECKSIG]) |
||||
|
self.nodes[0].importprivkey(privkey2) |
||||
|
|
||||
|
unspent = self.nodes[0].listunspent() |
||||
|
tx = CTransaction() |
||||
|
tx.vin = [CTxIn(COutPoint(int(unspent[0]["txid"], 16), unspent[0]["vout"]))] |
||||
|
amount = unspent[0]["amount"] * 100000000 |
||||
|
tx.vout = [CTxOut(amount, scriptPubKey2)] |
||||
|
tx.rehash() |
||||
|
signed_tx = self.nodes[0].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
spending_txid = self.nodes[0].sendrawtransaction(signed_tx["hex"], True) |
||||
|
self.nodes[0].generate(1) |
||||
|
self.sync_all() |
||||
|
balance1 = self.nodes[1].getaddressbalance(address2) |
||||
|
assert_equal(balance1["balance"], amount) |
||||
|
|
||||
|
tx = CTransaction() |
||||
|
tx.vin = [CTxIn(COutPoint(int(spending_txid, 16), 0))] |
||||
|
send_amount = 1 * 100000000 + 12840 |
||||
|
change_amount = amount - send_amount - 10000 |
||||
|
tx.vout = [CTxOut(change_amount, scriptPubKey2), CTxOut(send_amount, scriptPubKey)] |
||||
|
tx.rehash() |
||||
|
|
||||
|
signed_tx = self.nodes[0].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
sent_txid = self.nodes[0].sendrawtransaction(signed_tx["hex"], True) |
||||
|
self.nodes[0].generate(1) |
||||
|
self.sync_all() |
||||
|
|
||||
|
balance2 = self.nodes[1].getaddressbalance(address2) |
||||
|
assert_equal(balance2["balance"], change_amount) |
||||
|
|
||||
|
# Check that deltas are returned correctly |
||||
|
deltas = self.nodes[1].getaddressdeltas({"addresses": [address2], "start": 0, "end": 200}) |
||||
|
balance3 = 0 |
||||
|
for delta in deltas: |
||||
|
balance3 += delta["satoshis"] |
||||
|
assert_equal(balance3, change_amount) |
||||
|
assert_equal(deltas[0]["address"], address2) |
||||
|
assert_equal(deltas[0]["blockindex"], 1) |
||||
|
|
||||
|
# Check that entire range will be queried |
||||
|
deltasAll = self.nodes[1].getaddressdeltas({"addresses": [address2]}) |
||||
|
assert_equal(len(deltasAll), len(deltas)) |
||||
|
|
||||
|
# Check that deltas can be returned from range of block heights |
||||
|
deltas = self.nodes[1].getaddressdeltas({"addresses": [address2], "start": 113, "end": 113}) |
||||
|
assert_equal(len(deltas), 1) |
||||
|
|
||||
|
# Check that unspent outputs can be queried |
||||
|
print "Testing utxos..." |
||||
|
utxos = self.nodes[1].getaddressutxos({"addresses": [address2]}) |
||||
|
assert_equal(len(utxos), 1) |
||||
|
assert_equal(utxos[0]["satoshis"], change_amount) |
||||
|
|
||||
|
# Check that indexes will be updated with a reorg |
||||
|
print "Testing reorg..." |
||||
|
|
||||
|
best_hash = self.nodes[0].getbestblockhash() |
||||
|
self.nodes[0].invalidateblock(best_hash) |
||||
|
self.nodes[1].invalidateblock(best_hash) |
||||
|
self.nodes[2].invalidateblock(best_hash) |
||||
|
self.nodes[3].invalidateblock(best_hash) |
||||
|
self.sync_all() |
||||
|
|
||||
|
balance4 = self.nodes[1].getaddressbalance(address2) |
||||
|
assert_equal(balance4, balance1) |
||||
|
|
||||
|
utxos2 = self.nodes[1].getaddressutxos({"addresses": [address2]}) |
||||
|
assert_equal(len(utxos2), 1) |
||||
|
assert_equal(utxos2[0]["satoshis"], amount) |
||||
|
|
||||
|
# Check sorting of utxos |
||||
|
self.nodes[2].generate(150) |
||||
|
|
||||
|
txidsort1 = self.nodes[2].sendtoaddress(address2, 50) |
||||
|
self.nodes[2].generate(1) |
||||
|
txidsort2 = self.nodes[2].sendtoaddress(address2, 50) |
||||
|
self.nodes[2].generate(1) |
||||
|
self.sync_all() |
||||
|
|
||||
|
utxos3 = self.nodes[1].getaddressutxos({"addresses": [address2]}) |
||||
|
assert_equal(len(utxos3), 3) |
||||
|
assert_equal(utxos3[0]["height"], 114) |
||||
|
assert_equal(utxos3[1]["height"], 264) |
||||
|
assert_equal(utxos3[2]["height"], 265) |
||||
|
|
||||
|
# Check mempool indexing |
||||
|
print "Testing mempool indexing..." |
||||
|
|
||||
|
privKey3 = "cVfUn53hAbRrDEuMexyfgDpZPhF7KqXpS8UZevsyTDaugB7HZ3CD" |
||||
|
address3 = "mw4ynwhS7MmrQ27hr82kgqu7zryNDK26JB" |
||||
|
addressHash3 = "aa9872b5bbcdb511d89e0e11aa27da73fd2c3f50".decode("hex") |
||||
|
scriptPubKey3 = CScript([OP_DUP, OP_HASH160, addressHash3, OP_EQUALVERIFY, OP_CHECKSIG]) |
||||
|
address4 = "2N8oFVB2vThAKury4vnLquW2zVjsYjjAkYQ" |
||||
|
scriptPubKey4 = CScript([OP_HASH160, addressHash3, OP_EQUAL]) |
||||
|
unspent = self.nodes[2].listunspent() |
||||
|
|
||||
|
tx = CTransaction() |
||||
|
tx.vin = [CTxIn(COutPoint(int(unspent[0]["txid"], 16), unspent[0]["vout"]))] |
||||
|
amount = unspent[0]["amount"] * 100000000 |
||||
|
tx.vout = [CTxOut(amount, scriptPubKey3)] |
||||
|
tx.rehash() |
||||
|
signed_tx = self.nodes[2].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
memtxid1 = self.nodes[2].sendrawtransaction(signed_tx["hex"], True) |
||||
|
time.sleep(2) |
||||
|
|
||||
|
tx2 = CTransaction() |
||||
|
tx2.vin = [CTxIn(COutPoint(int(unspent[1]["txid"], 16), unspent[1]["vout"]))] |
||||
|
amount = unspent[1]["amount"] * 100000000 |
||||
|
tx2.vout = [ |
||||
|
CTxOut(amount / 4, scriptPubKey3), |
||||
|
CTxOut(amount / 4, scriptPubKey3), |
||||
|
CTxOut(amount / 4, scriptPubKey4), |
||||
|
CTxOut(amount / 4, scriptPubKey4) |
||||
|
] |
||||
|
tx2.rehash() |
||||
|
signed_tx2 = self.nodes[2].signrawtransaction(binascii.hexlify(tx2.serialize()).decode("utf-8")) |
||||
|
memtxid2 = self.nodes[2].sendrawtransaction(signed_tx2["hex"], True) |
||||
|
time.sleep(2) |
||||
|
|
||||
|
mempool = self.nodes[2].getaddressmempool({"addresses": [address3]}) |
||||
|
assert_equal(len(mempool), 3) |
||||
|
assert_equal(mempool[0]["txid"], memtxid1) |
||||
|
assert_equal(mempool[0]["address"], address3) |
||||
|
assert_equal(mempool[0]["index"], 0) |
||||
|
assert_equal(mempool[1]["txid"], memtxid2) |
||||
|
assert_equal(mempool[1]["index"], 0) |
||||
|
assert_equal(mempool[2]["txid"], memtxid2) |
||||
|
assert_equal(mempool[2]["index"], 1) |
||||
|
|
||||
|
self.nodes[2].generate(1); |
||||
|
self.sync_all(); |
||||
|
mempool2 = self.nodes[2].getaddressmempool({"addresses": [address3]}) |
||||
|
assert_equal(len(mempool2), 0) |
||||
|
|
||||
|
tx = CTransaction() |
||||
|
tx.vin = [ |
||||
|
CTxIn(COutPoint(int(memtxid2, 16), 0)), |
||||
|
CTxIn(COutPoint(int(memtxid2, 16), 1)) |
||||
|
] |
||||
|
tx.vout = [CTxOut(amount / 2 - 10000, scriptPubKey2)] |
||||
|
tx.rehash() |
||||
|
self.nodes[2].importprivkey(privKey3) |
||||
|
signed_tx3 = self.nodes[2].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
memtxid3 = self.nodes[2].sendrawtransaction(signed_tx3["hex"], True) |
||||
|
time.sleep(2) |
||||
|
|
||||
|
mempool3 = self.nodes[2].getaddressmempool({"addresses": [address3]}) |
||||
|
assert_equal(len(mempool3), 2) |
||||
|
assert_equal(mempool3[0]["prevtxid"], memtxid2) |
||||
|
assert_equal(mempool3[0]["prevout"], 0) |
||||
|
assert_equal(mempool3[1]["prevtxid"], memtxid2) |
||||
|
assert_equal(mempool3[1]["prevout"], 1) |
||||
|
|
||||
|
# sending and receiving to the same address |
||||
|
privkey1 = "cQY2s58LhzUCmEXN8jtAp1Etnijx78YRZ466w4ikX1V4UpTpbsf8" |
||||
|
address1 = "myAUWSHnwsQrhuMWv4Br6QsCnpB41vFwHn" |
||||
|
address1hash = "c192bff751af8efec15135d42bfeedf91a6f3e34".decode("hex") |
||||
|
address1script = CScript([OP_DUP, OP_HASH160, address1hash, OP_EQUALVERIFY, OP_CHECKSIG]) |
||||
|
|
||||
|
self.nodes[0].sendtoaddress(address1, 10) |
||||
|
self.nodes[0].generate(1) |
||||
|
self.sync_all() |
||||
|
|
||||
|
utxos = self.nodes[1].getaddressutxos({"addresses": [address1]}) |
||||
|
assert_equal(len(utxos), 1) |
||||
|
|
||||
|
tx = CTransaction() |
||||
|
tx.vin = [ |
||||
|
CTxIn(COutPoint(int(utxos[0]["txid"], 16), utxos[0]["outputIndex"])) |
||||
|
] |
||||
|
amount = utxos[0]["satoshis"] - 1000 |
||||
|
tx.vout = [CTxOut(amount, address1script)] |
||||
|
tx.rehash() |
||||
|
self.nodes[0].importprivkey(privkey1) |
||||
|
signed_tx = self.nodes[0].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
mem_txid = self.nodes[0].sendrawtransaction(signed_tx["hex"], True) |
||||
|
|
||||
|
self.sync_all() |
||||
|
mempool_deltas = self.nodes[2].getaddressmempool({"addresses": [address1]}) |
||||
|
assert_equal(len(mempool_deltas), 2) |
||||
|
|
||||
|
print "Passed\n" |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
AddressIndexTest().main() |
@ -0,0 +1,119 @@ |
|||||
|
#!/usr/bin/env python2 |
||||
|
# Copyright (c) 2014-2015 The Bitcoin Core developers |
||||
|
# Distributed under the MIT software license, see the accompanying |
||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
|
||||
|
# |
||||
|
# Test addressindex generation and fetching |
||||
|
# |
||||
|
|
||||
|
import time |
||||
|
from test_framework.test_framework import BitcoinTestFramework |
||||
|
from test_framework.util import * |
||||
|
from test_framework.script import * |
||||
|
from test_framework.mininode import * |
||||
|
import binascii |
||||
|
|
||||
|
class SpentIndexTest(BitcoinTestFramework): |
||||
|
|
||||
|
def setup_chain(self): |
||||
|
print("Initializing test directory "+self.options.tmpdir) |
||||
|
initialize_chain_clean(self.options.tmpdir, 4) |
||||
|
|
||||
|
def setup_network(self): |
||||
|
self.nodes = [] |
||||
|
# Nodes 0/1 are "wallet" nodes |
||||
|
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"])) |
||||
|
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug", "-spentindex"])) |
||||
|
# Nodes 2/3 are used for testing |
||||
|
self.nodes.append(start_node(2, self.options.tmpdir, ["-debug", "-spentindex"])) |
||||
|
self.nodes.append(start_node(3, self.options.tmpdir, ["-debug", "-spentindex", "-txindex"])) |
||||
|
connect_nodes(self.nodes[0], 1) |
||||
|
connect_nodes(self.nodes[0], 2) |
||||
|
connect_nodes(self.nodes[0], 3) |
||||
|
|
||||
|
self.is_network_split = False |
||||
|
self.sync_all() |
||||
|
|
||||
|
def run_test(self): |
||||
|
print "Mining blocks..." |
||||
|
self.nodes[0].generate(105) |
||||
|
self.sync_all() |
||||
|
|
||||
|
chain_height = self.nodes[1].getblockcount() |
||||
|
assert_equal(chain_height, 105) |
||||
|
|
||||
|
# Check that |
||||
|
print "Testing spent index..." |
||||
|
|
||||
|
privkey = "cSdkPxkAjA4HDr5VHgsebAPDEh9Gyub4HK8UJr2DFGGqKKy4K5sG" |
||||
|
address = "mgY65WSfEmsyYaYPQaXhmXMeBhwp4EcsQW" |
||||
|
addressHash = "0b2f0a0c31bfe0406b0ccc1381fdbe311946dadc".decode("hex") |
||||
|
scriptPubKey = CScript([OP_DUP, OP_HASH160, addressHash, OP_EQUALVERIFY, OP_CHECKSIG]) |
||||
|
unspent = self.nodes[0].listunspent() |
||||
|
tx = CTransaction() |
||||
|
amount = unspent[0]["amount"] * 100000000 |
||||
|
tx.vin = [CTxIn(COutPoint(int(unspent[0]["txid"], 16), unspent[0]["vout"]))] |
||||
|
tx.vout = [CTxOut(amount, scriptPubKey)] |
||||
|
tx.rehash() |
||||
|
|
||||
|
signed_tx = self.nodes[0].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
txid = self.nodes[0].sendrawtransaction(signed_tx["hex"], True) |
||||
|
self.nodes[0].generate(1) |
||||
|
self.sync_all() |
||||
|
|
||||
|
print "Testing getspentinfo method..." |
||||
|
|
||||
|
# Check that the spentinfo works standalone |
||||
|
info = self.nodes[1].getspentinfo({"txid": unspent[0]["txid"], "index": unspent[0]["vout"]}) |
||||
|
assert_equal(info["txid"], txid) |
||||
|
assert_equal(info["index"], 0) |
||||
|
assert_equal(info["height"], 106) |
||||
|
|
||||
|
print "Testing getrawtransaction method..." |
||||
|
|
||||
|
# Check that verbose raw transaction includes spent info |
||||
|
txVerbose = self.nodes[3].getrawtransaction(unspent[0]["txid"], 1) |
||||
|
assert_equal(txVerbose["vout"][unspent[0]["vout"]]["spentTxId"], txid) |
||||
|
assert_equal(txVerbose["vout"][unspent[0]["vout"]]["spentIndex"], 0) |
||||
|
assert_equal(txVerbose["vout"][unspent[0]["vout"]]["spentHeight"], 106) |
||||
|
|
||||
|
# Check that verbose raw transaction includes input values |
||||
|
txVerbose2 = self.nodes[3].getrawtransaction(txid, 1) |
||||
|
assert_equal(txVerbose2["vin"][0]["value"], Decimal(unspent[0]["amount"])) |
||||
|
assert_equal(txVerbose2["vin"][0]["valueSat"], amount) |
||||
|
|
||||
|
# Check that verbose raw transaction includes address values and input values |
||||
|
privkey2 = "cSdkPxkAjA4HDr5VHgsebAPDEh9Gyub4HK8UJr2DFGGqKKy4K5sG" |
||||
|
address2 = "mgY65WSfEmsyYaYPQaXhmXMeBhwp4EcsQW" |
||||
|
addressHash2 = "0b2f0a0c31bfe0406b0ccc1381fdbe311946dadc".decode("hex") |
||||
|
scriptPubKey2 = CScript([OP_DUP, OP_HASH160, addressHash2, OP_EQUALVERIFY, OP_CHECKSIG]) |
||||
|
tx2 = CTransaction() |
||||
|
tx2.vin = [CTxIn(COutPoint(int(txid, 16), 0))] |
||||
|
tx2.vout = [CTxOut(amount, scriptPubKey2)] |
||||
|
tx.rehash() |
||||
|
self.nodes[0].importprivkey(privkey) |
||||
|
signed_tx2 = self.nodes[0].signrawtransaction(binascii.hexlify(tx2.serialize()).decode("utf-8")) |
||||
|
txid2 = self.nodes[0].sendrawtransaction(signed_tx2["hex"], True) |
||||
|
|
||||
|
# Check the mempool index |
||||
|
self.sync_all() |
||||
|
txVerbose3 = self.nodes[1].getrawtransaction(txid2, 1) |
||||
|
assert_equal(txVerbose3["vin"][0]["address"], address2) |
||||
|
assert_equal(txVerbose3["vin"][0]["value"], Decimal(unspent[0]["amount"])) |
||||
|
assert_equal(txVerbose3["vin"][0]["valueSat"], amount) |
||||
|
|
||||
|
# Check the database index |
||||
|
self.nodes[0].generate(1) |
||||
|
self.sync_all() |
||||
|
|
||||
|
txVerbose4 = self.nodes[3].getrawtransaction(txid2, 1) |
||||
|
assert_equal(txVerbose4["vin"][0]["address"], address2) |
||||
|
assert_equal(txVerbose4["vin"][0]["value"], Decimal(unspent[0]["amount"])) |
||||
|
assert_equal(txVerbose4["vin"][0]["valueSat"], amount) |
||||
|
|
||||
|
print "Passed\n" |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
SpentIndexTest().main() |
@ -0,0 +1,61 @@ |
|||||
|
#!/usr/bin/env python2 |
||||
|
# Copyright (c) 2014-2015 The Bitcoin Core developers |
||||
|
# Distributed under the MIT software license, see the accompanying |
||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
|
||||
|
# |
||||
|
# Test timestampindex generation and fetching |
||||
|
# |
||||
|
|
||||
|
import time |
||||
|
|
||||
|
from test_framework.test_framework import BitcoinTestFramework |
||||
|
from test_framework.util import * |
||||
|
|
||||
|
|
||||
|
class TimestampIndexTest(BitcoinTestFramework): |
||||
|
|
||||
|
def setup_chain(self): |
||||
|
print("Initializing test directory "+self.options.tmpdir) |
||||
|
initialize_chain_clean(self.options.tmpdir, 4) |
||||
|
|
||||
|
def setup_network(self): |
||||
|
self.nodes = [] |
||||
|
# Nodes 0/1 are "wallet" nodes |
||||
|
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"])) |
||||
|
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug", "-timestampindex"])) |
||||
|
# Nodes 2/3 are used for testing |
||||
|
self.nodes.append(start_node(2, self.options.tmpdir, ["-debug"])) |
||||
|
self.nodes.append(start_node(3, self.options.tmpdir, ["-debug", "-timestampindex"])) |
||||
|
connect_nodes(self.nodes[0], 1) |
||||
|
connect_nodes(self.nodes[0], 2) |
||||
|
connect_nodes(self.nodes[0], 3) |
||||
|
|
||||
|
self.is_network_split = False |
||||
|
self.sync_all() |
||||
|
|
||||
|
def run_test(self): |
||||
|
print "Mining 25 blocks..." |
||||
|
blockhashes = self.nodes[0].generate(25) |
||||
|
time.sleep(3) |
||||
|
print "Mining 25 blocks..." |
||||
|
blockhashes.extend(self.nodes[0].generate(25)) |
||||
|
time.sleep(3) |
||||
|
print "Mining 25 blocks..." |
||||
|
blockhashes.extend(self.nodes[0].generate(25)) |
||||
|
self.sync_all() |
||||
|
low = self.nodes[1].getblock(blockhashes[0])["time"] |
||||
|
high = low + 76 |
||||
|
|
||||
|
print "Checking timestamp index..." |
||||
|
hashes = self.nodes[1].getblockhashes(high, low) |
||||
|
|
||||
|
assert_equal(len(hashes), len(blockhashes)) |
||||
|
|
||||
|
assert_equal(hashes, blockhashes) |
||||
|
|
||||
|
print "Passed\n" |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
TimestampIndexTest().main() |
@ -0,0 +1,73 @@ |
|||||
|
#!/usr/bin/env python2 |
||||
|
# Copyright (c) 2014-2015 The Bitcoin Core developers |
||||
|
# Distributed under the MIT software license, see the accompanying |
||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
|
||||
|
# |
||||
|
# Test txindex generation and fetching |
||||
|
# |
||||
|
|
||||
|
import time |
||||
|
from test_framework.test_framework import BitcoinTestFramework |
||||
|
from test_framework.util import * |
||||
|
from test_framework.script import * |
||||
|
from test_framework.mininode import * |
||||
|
import binascii |
||||
|
|
||||
|
class TxIndexTest(BitcoinTestFramework): |
||||
|
|
||||
|
def setup_chain(self): |
||||
|
print("Initializing test directory "+self.options.tmpdir) |
||||
|
initialize_chain_clean(self.options.tmpdir, 4) |
||||
|
|
||||
|
def setup_network(self): |
||||
|
self.nodes = [] |
||||
|
# Nodes 0/1 are "wallet" nodes |
||||
|
self.nodes.append(start_node(0, self.options.tmpdir, ["-debug"])) |
||||
|
self.nodes.append(start_node(1, self.options.tmpdir, ["-debug", "-txindex"])) |
||||
|
# Nodes 2/3 are used for testing |
||||
|
self.nodes.append(start_node(2, self.options.tmpdir, ["-debug", "-txindex"])) |
||||
|
self.nodes.append(start_node(3, self.options.tmpdir, ["-debug", "-txindex"])) |
||||
|
connect_nodes(self.nodes[0], 1) |
||||
|
connect_nodes(self.nodes[0], 2) |
||||
|
connect_nodes(self.nodes[0], 3) |
||||
|
|
||||
|
self.is_network_split = False |
||||
|
self.sync_all() |
||||
|
|
||||
|
def run_test(self): |
||||
|
print "Mining blocks..." |
||||
|
self.nodes[0].generate(105) |
||||
|
self.sync_all() |
||||
|
|
||||
|
chain_height = self.nodes[1].getblockcount() |
||||
|
assert_equal(chain_height, 105) |
||||
|
|
||||
|
print "Testing transaction index..." |
||||
|
|
||||
|
privkey = "cSdkPxkAjA4HDr5VHgsebAPDEh9Gyub4HK8UJr2DFGGqKKy4K5sG" |
||||
|
address = "mgY65WSfEmsyYaYPQaXhmXMeBhwp4EcsQW" |
||||
|
addressHash = "0b2f0a0c31bfe0406b0ccc1381fdbe311946dadc".decode("hex") |
||||
|
scriptPubKey = CScript([OP_DUP, OP_HASH160, addressHash, OP_EQUALVERIFY, OP_CHECKSIG]) |
||||
|
unspent = self.nodes[0].listunspent() |
||||
|
tx = CTransaction() |
||||
|
amount = unspent[0]["amount"] * 100000000 |
||||
|
tx.vin = [CTxIn(COutPoint(int(unspent[0]["txid"], 16), unspent[0]["vout"]))] |
||||
|
tx.vout = [CTxOut(amount, scriptPubKey)] |
||||
|
tx.rehash() |
||||
|
|
||||
|
signed_tx = self.nodes[0].signrawtransaction(binascii.hexlify(tx.serialize()).decode("utf-8")) |
||||
|
txid = self.nodes[0].sendrawtransaction(signed_tx["hex"], True) |
||||
|
self.nodes[0].generate(1) |
||||
|
self.sync_all() |
||||
|
|
||||
|
# Check verbose raw transaction results |
||||
|
verbose = self.nodes[3].getrawtransaction(unspent[0]["txid"], 1) |
||||
|
assert_equal(verbose["vout"][0]["valueSat"], 5000000000); |
||||
|
assert_equal(verbose["vout"][0]["value"], 50); |
||||
|
|
||||
|
print "Passed\n" |
||||
|
|
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
TxIndexTest().main() |
@ -0,0 +1,82 @@ |
|||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
|
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||
|
// Distributed under the MIT software license, see the accompanying
|
||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
|
||||
|
#ifndef BITCOIN_ADDRESSINDEX_H |
||||
|
#define BITCOIN_ADDRESSINDEX_H |
||||
|
|
||||
|
#include "uint256.h" |
||||
|
#include "amount.h" |
||||
|
|
||||
|
struct CMempoolAddressDelta |
||||
|
{ |
||||
|
int64_t time; |
||||
|
CAmount amount; |
||||
|
uint256 prevhash; |
||||
|
unsigned int prevout; |
||||
|
|
||||
|
CMempoolAddressDelta(int64_t t, CAmount a, uint256 hash, unsigned int out) { |
||||
|
time = t; |
||||
|
amount = a; |
||||
|
prevhash = hash; |
||||
|
prevout = out; |
||||
|
} |
||||
|
|
||||
|
CMempoolAddressDelta(int64_t t, CAmount a) { |
||||
|
time = t; |
||||
|
amount = a; |
||||
|
prevhash.SetNull(); |
||||
|
prevout = 0; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
struct CMempoolAddressDeltaKey |
||||
|
{ |
||||
|
int type; |
||||
|
uint160 addressBytes; |
||||
|
uint256 txhash; |
||||
|
unsigned int index; |
||||
|
int spending; |
||||
|
|
||||
|
CMempoolAddressDeltaKey(int addressType, uint160 addressHash, uint256 hash, unsigned int i, int s) { |
||||
|
type = addressType; |
||||
|
addressBytes = addressHash; |
||||
|
txhash = hash; |
||||
|
index = i; |
||||
|
spending = s; |
||||
|
} |
||||
|
|
||||
|
CMempoolAddressDeltaKey(int addressType, uint160 addressHash) { |
||||
|
type = addressType; |
||||
|
addressBytes = addressHash; |
||||
|
txhash.SetNull(); |
||||
|
index = 0; |
||||
|
spending = 0; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
struct CMempoolAddressDeltaKeyCompare |
||||
|
{ |
||||
|
bool operator()(const CMempoolAddressDeltaKey& a, const CMempoolAddressDeltaKey& b) const { |
||||
|
if (a.type == b.type) { |
||||
|
if (a.addressBytes == b.addressBytes) { |
||||
|
if (a.txhash == b.txhash) { |
||||
|
if (a.index == b.index) { |
||||
|
return a.spending < b.spending; |
||||
|
} else { |
||||
|
return a.index < b.index; |
||||
|
} |
||||
|
} else { |
||||
|
return a.txhash < b.txhash; |
||||
|
} |
||||
|
} else { |
||||
|
return a.addressBytes < b.addressBytes; |
||||
|
} |
||||
|
} else { |
||||
|
return a.type < b.type; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif // BITCOIN_ADDRESSINDEX_H
|
@ -0,0 +1,98 @@ |
|||||
|
// Copyright (c) 2009-2010 Satoshi Nakamoto
|
||||
|
// Copyright (c) 2009-2015 The Bitcoin Core developers
|
||||
|
// Distributed under the MIT software license, see the accompanying
|
||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
|
||||
|
#ifndef BITCOIN_SPENTINDEX_H |
||||
|
#define BITCOIN_SPENTINDEX_H |
||||
|
|
||||
|
#include "uint256.h" |
||||
|
#include "amount.h" |
||||
|
|
||||
|
struct CSpentIndexKey { |
||||
|
uint256 txid; |
||||
|
unsigned int outputIndex; |
||||
|
|
||||
|
ADD_SERIALIZE_METHODS; |
||||
|
|
||||
|
template <typename Stream, typename Operation> |
||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { |
||||
|
READWRITE(txid); |
||||
|
READWRITE(outputIndex); |
||||
|
} |
||||
|
|
||||
|
CSpentIndexKey(uint256 t, unsigned int i) { |
||||
|
txid = t; |
||||
|
outputIndex = i; |
||||
|
} |
||||
|
|
||||
|
CSpentIndexKey() { |
||||
|
SetNull(); |
||||
|
} |
||||
|
|
||||
|
void SetNull() { |
||||
|
txid.SetNull(); |
||||
|
outputIndex = 0; |
||||
|
} |
||||
|
|
||||
|
}; |
||||
|
|
||||
|
struct CSpentIndexValue { |
||||
|
uint256 txid; |
||||
|
unsigned int inputIndex; |
||||
|
int blockHeight; |
||||
|
CAmount satoshis; |
||||
|
int addressType; |
||||
|
uint160 addressHash; |
||||
|
|
||||
|
ADD_SERIALIZE_METHODS; |
||||
|
|
||||
|
template <typename Stream, typename Operation> |
||||
|
inline void SerializationOp(Stream& s, Operation ser_action, int nType, int nVersion) { |
||||
|
READWRITE(txid); |
||||
|
READWRITE(inputIndex); |
||||
|
READWRITE(blockHeight); |
||||
|
READWRITE(satoshis); |
||||
|
READWRITE(addressType); |
||||
|
READWRITE(addressHash); |
||||
|
} |
||||
|
|
||||
|
CSpentIndexValue(uint256 t, unsigned int i, int h, CAmount s, int type, uint160 a) { |
||||
|
txid = t; |
||||
|
inputIndex = i; |
||||
|
blockHeight = h; |
||||
|
satoshis = s; |
||||
|
addressType = type; |
||||
|
addressHash = a; |
||||
|
} |
||||
|
|
||||
|
CSpentIndexValue() { |
||||
|
SetNull(); |
||||
|
} |
||||
|
|
||||
|
void SetNull() { |
||||
|
txid.SetNull(); |
||||
|
inputIndex = 0; |
||||
|
blockHeight = 0; |
||||
|
satoshis = 0; |
||||
|
addressType = 0; |
||||
|
addressHash.SetNull(); |
||||
|
} |
||||
|
|
||||
|
bool IsNull() const { |
||||
|
return txid.IsNull(); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
struct CSpentIndexKeyCompare |
||||
|
{ |
||||
|
bool operator()(const CSpentIndexKey& a, const CSpentIndexKey& b) const { |
||||
|
if (a.txid == b.txid) { |
||||
|
return a.outputIndex < b.outputIndex; |
||||
|
} else { |
||||
|
return a.txid < b.txid; |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#endif // BITCOIN_SPENTINDEX_H
|
Binary file not shown.
@ -0,0 +1,63 @@ |
|||||
|
// Copyright (c) 2012-2015 The Bitcoin Core developers
|
||||
|
// Distributed under the MIT software license, see the accompanying
|
||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
|
||||
|
#include "leveldbwrapper.h" |
||||
|
#include "uint256.h" |
||||
|
#include "random.h" |
||||
|
#include "test/test_bitcoin.h" |
||||
|
|
||||
|
#include <boost/assign/std/vector.hpp> // for 'operator+=()' |
||||
|
#include <boost/assert.hpp> |
||||
|
#include <boost/test/unit_test.hpp> |
||||
|
|
||||
|
using namespace std; |
||||
|
using namespace boost::assign; // bring 'operator+=()' into scope
|
||||
|
using namespace boost::filesystem; |
||||
|
|
||||
|
BOOST_FIXTURE_TEST_SUITE(dbwrapper_tests, BasicTestingSetup) |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(dbwrapper_compression) |
||||
|
{ |
||||
|
// Perform tests both with compression and without
|
||||
|
for (int i = 0; i < 2; i++) { |
||||
|
bool compression = (bool)i; |
||||
|
path ph = temp_directory_path() / unique_path(); |
||||
|
CLevelDBWrapper dbw(ph, (1 << 20), true, false, compression); |
||||
|
char key = 'k'; |
||||
|
uint256 in = GetRandHash(); |
||||
|
uint256 res; |
||||
|
|
||||
|
BOOST_CHECK(dbw.Write(key, in)); |
||||
|
BOOST_CHECK(dbw.Read(key, res)); |
||||
|
BOOST_CHECK_EQUAL(res.ToString(), in.ToString()); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(dbwrapper_maxopenfiles_64) |
||||
|
{ |
||||
|
path ph = temp_directory_path() / unique_path(); |
||||
|
CLevelDBWrapper dbw(ph, (1 << 20), true, false, false, 64); |
||||
|
char key = 'k'; |
||||
|
uint256 in = GetRandHash(); |
||||
|
uint256 res; |
||||
|
|
||||
|
BOOST_CHECK(dbw.Write(key, in)); |
||||
|
BOOST_CHECK(dbw.Read(key, res)); |
||||
|
BOOST_CHECK_EQUAL(res.ToString(), in.ToString()); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(dbwrapper_maxopenfiles_1000) |
||||
|
{ |
||||
|
path ph = temp_directory_path() / unique_path(); |
||||
|
CLevelDBWrapper dbw(ph, (1 << 20), true, false, false, 1000); |
||||
|
char key = 'k'; |
||||
|
uint256 in = GetRandHash(); |
||||
|
uint256 res; |
||||
|
|
||||
|
BOOST_CHECK(dbw.Write(key, in)); |
||||
|
BOOST_CHECK(dbw.Read(key, res)); |
||||
|
BOOST_CHECK_EQUAL(res.ToString(), in.ToString()); |
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_SUITE_END() |
@ -0,0 +1,59 @@ |
|||||
|
// Copyright (c) 2012-2015 The Bitcoin Core developers
|
||||
|
// Distributed under the MIT software license, see the accompanying
|
||||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||
|
|
||||
|
#include "script/script.h" |
||||
|
#include "test/test_bitcoin.h" |
||||
|
|
||||
|
#include <boost/test/unit_test.hpp> |
||||
|
|
||||
|
using namespace std; |
||||
|
|
||||
|
BOOST_FIXTURE_TEST_SUITE(script_P2PKH_tests, BasicTestingSetup) |
||||
|
|
||||
|
BOOST_AUTO_TEST_CASE(IsPayToPublicKeyHash) |
||||
|
{ |
||||
|
// Test CScript::IsPayToPublicKeyHash()
|
||||
|
uint160 dummy; |
||||
|
CScript p2pkh; |
||||
|
p2pkh << OP_DUP << OP_HASH160 << ToByteVector(dummy) << OP_EQUALVERIFY << OP_CHECKSIG; |
||||
|
BOOST_CHECK(p2pkh.IsPayToPublicKeyHash()); |
||||
|
|
||||
|
static const unsigned char direct[] = { |
||||
|
OP_DUP, OP_HASH160, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUALVERIFY, OP_CHECKSIG |
||||
|
}; |
||||
|
BOOST_CHECK(CScript(direct, direct+sizeof(direct)).IsPayToPublicKeyHash()); |
||||
|
|
||||
|
static const unsigned char notp2pkh1[] = { |
||||
|
OP_DUP, OP_HASH160, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUALVERIFY, OP_CHECKSIG, OP_CHECKSIG |
||||
|
}; |
||||
|
BOOST_CHECK(!CScript(notp2pkh1, notp2pkh1+sizeof(notp2pkh1)).IsPayToPublicKeyHash()); |
||||
|
|
||||
|
static const unsigned char p2sh[] = { |
||||
|
OP_HASH160, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUAL |
||||
|
}; |
||||
|
BOOST_CHECK(!CScript(p2sh, p2sh+sizeof(p2sh)).IsPayToPublicKeyHash()); |
||||
|
|
||||
|
static const unsigned char extra[] = { |
||||
|
OP_DUP, OP_HASH160, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUALVERIFY, OP_CHECKSIG, OP_CHECKSIG |
||||
|
}; |
||||
|
BOOST_CHECK(!CScript(extra, extra+sizeof(extra)).IsPayToPublicKeyHash()); |
||||
|
|
||||
|
static const unsigned char missing[] = { |
||||
|
OP_HASH160, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, OP_EQUALVERIFY, OP_CHECKSIG, OP_RETURN |
||||
|
}; |
||||
|
BOOST_CHECK(!CScript(missing, missing+sizeof(missing)).IsPayToPublicKeyHash()); |
||||
|
|
||||
|
static const unsigned char missing2[] = { |
||||
|
OP_DUP, OP_HASH160, 20, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 |
||||
|
}; |
||||
|
BOOST_CHECK(!CScript(missing2, missing2+sizeof(missing)).IsPayToPublicKeyHash()); |
||||
|
|
||||
|
static const unsigned char tooshort[] = { |
||||
|
OP_DUP, OP_HASH160, 2, 0,0, OP_EQUALVERIFY, OP_CHECKSIG |
||||
|
}; |
||||
|
BOOST_CHECK(!CScript(tooshort, tooshort+sizeof(direct)).IsPayToPublicKeyHash()); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
BOOST_AUTO_TEST_SUITE_END() |
@ -0,0 +1,61 @@ |
|||||
|
#!/usr/bin/python |
||||
|
# Copyright 2014 BitPay, Inc. |
||||
|
# Distributed under the MIT software license, see the accompanying |
||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php. |
||||
|
|
||||
|
import subprocess |
||||
|
import os |
||||
|
import json |
||||
|
import sys |
||||
|
import buildenv |
||||
|
import shutil |
||||
|
|
||||
|
def assert_equal(thing1, thing2): |
||||
|
if thing1 != thing2: |
||||
|
raise AssertionError("%s != %s"%(str(thing1),str(thing2))) |
||||
|
|
||||
|
if __name__ == '__main__': |
||||
|
datadir = os.environ["srcdir"] + "/test/data" |
||||
|
execprog = './wallet-utility' + buildenv.exeext |
||||
|
execargs = '-datadir=' + datadir |
||||
|
execrun = execprog + ' ' + execargs |
||||
|
|
||||
|
proc = subprocess.Popen(execrun, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True) |
||||
|
try: |
||||
|
outs = proc.communicate() |
||||
|
except OSError: |
||||
|
print("OSError, Failed to execute " + execprog) |
||||
|
sys.exit(1) |
||||
|
|
||||
|
output = json.loads(outs[0]) |
||||
|
|
||||
|
assert_equal(output[0], "13EngsxkRi7SJPPqCyJsKf34U8FoX9E9Av") |
||||
|
assert_equal(output[1], "1FKCLGTpPeYBUqfNxktck8k5nqxB8sjim8") |
||||
|
assert_equal(output[2], "13cdtE9tnNeXCZJ8KQ5WELgEmLSBLnr48F") |
||||
|
|
||||
|
execargs = '-datadir=' + datadir + ' -dumppass' |
||||
|
execrun = execprog + ' ' + execargs |
||||
|
|
||||
|
proc = subprocess.Popen(execrun, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, shell=True) |
||||
|
try: |
||||
|
outs = proc.communicate() |
||||
|
except OSError: |
||||
|
print("OSError, Failed to execute " + execprog) |
||||
|
sys.exit(1) |
||||
|
|
||||
|
output = json.loads(outs[0]) |
||||
|
|
||||
|
assert_equal(output[0]['addr'], "13EngsxkRi7SJPPqCyJsKf34U8FoX9E9Av") |
||||
|
assert_equal(output[0]['pkey'], "5Jz5BWE2WQxp1hGqDZeisQFV1mRFR2AVBAgiXCbNcZyXNjD9aUd") |
||||
|
assert_equal(output[1]['addr'], "1FKCLGTpPeYBUqfNxktck8k5nqxB8sjim8") |
||||
|
assert_equal(output[1]['pkey'], "5HsX2b3v2GjngYQ5ZM4mLp2b2apw6aMNVaPELV1YmpiYR1S4jzc") |
||||
|
assert_equal(output[2]['addr'], "13cdtE9tnNeXCZJ8KQ5WELgEmLSBLnr48F") |
||||
|
assert_equal(output[2]['pkey'], "5KCWAs1wX2ESiL4PfDR8XYVSSETHFd2jaRGxt1QdanBFTit4XcH") |
||||
|
|
||||
|
if os.path.exists(datadir + '/database'): |
||||
|
if os.path.isdir(datadir + '/database'): |
||||
|
shutil.rmtree(datadir + '/database') |
||||
|
|
||||
|
if os.path.exists(datadir + '/db.log'): |
||||
|
os.remove(datadir + '/db.log') |
||||
|
sys.exit(0) |
Loading…
Reference in new issue