citp/BlockSci

Iterators returned by fluent interface routines reset randomly

amurashov opened this issue · 0 comments

Hello all!

I am trying to build a full graph (all the way back to miners) of one particular address, and I am doing smth like this:

import blocksci
import pandas
import numpy as np

chain = blocksci.Blockchain("/home/ubuntu/blocksci.conf")

test_address = chain.address_from_string('35pgGeez3ou6ofrpjt8T7bvC9t6RrUK4p6')

all_outputs  = test_address.outputs.where(lambda o: ~o.is_spent)
all_coinbase_txes = []

#the following part I was planning to put under the 'while' loop, however it does not work even with single-step
txes_cb  = all_outputs.where(lambda o:  o.tx.is_coinbase)
all_coinbase_txes = all_coinbase_txes + txes_cb.to_list()

txes_ncb = all_outputs.where(lambda o: ~o.tx.is_coinbase)

new_all_outputs = txes_ncb.select(lambda o: o.tx.inputs).select(lambda o: o.spent_output)

print ("New set: %d, old set: %d, final set: %d" % (new_all_outputs.size, all_outputs.size, len(all_coinbase_txes)))

all_outputs = new_all_outputs

It prints all zeros, which is obviously not correct - some internal states of iterators seem to be corrupted by such usage. I have assembled even simplier bug demonstration:

import blocksci
import pandas
import numpy as np

chain = blocksci.Blockchain("/home/ubuntu/blocksci.conf")

test_address = chain.address_from_string('35pgGeez3ou6ofrpjt8T7bvC9t6RrUK4p6')

all_outputs  = test_address.outputs.where(lambda o: ~o.is_spent)
print(all_outputs.size)
print(all_outputs.size)

prints first '146' and then '0'.

May be I am using it wrong?