Guthaben erhalten/Blockhain mit Bitcoinj herunterladen

Ich spiele mit Bitoinj herum und kann anscheinend nicht einmal die grundlegendsten Funktionen zum Laufen bringen.

Was ich tun möchte: Ich habe eine Brieftasche mit einer Adresse. Ich möchte Blockchain herunterladen und daraus das Wallet-Guthaben abrufen.

Was ich getan habe, ist folgender Code (in Scala, aber es ist mehr oder weniger dasselbe wie Java), die Brieftasche ist in address.walet, ich möchte, dass die Blockade unter gespeichert wird saved.blockchain:

val params = NetworkParameters.prodNet
val walletFile = new java.io.File("address.wallet");
val wallet = Wallet.loadFromFile(walletFile)

val key = wallet.keychain.get(0)
val address:String = key.toAddress(params).toString
println("ADDRESS IS : "+address)

val blockStore = new BoundedOverheadBlockStore(params, new java.io.File("saved.blockchain"))
val chain = new BlockChain(params, wallet, blockStore)
val peerGroup = new PeerGroup(params, chain)
peerGroup.setUserAgent("BitToy", "0.1")

peerGroup.addPeerDiscovery(new DnsDiscovery(params))
peerGroup.addWallet(wallet)
println("START DOWNLOADING BLOCKCHAIN")

peerGroup.start()
peerGroup.downloadBlockChain()
peerGroup.stop()
println("DONE; BALANCE IS :")
println(wallet.getBalance)

Ich habe Guthaben auf der Adresse in der Brieftasche.

Wenn ich es jetzt zum ersten Mal starte, wird die Blockchain (oder besser gesagt die Header) heruntergeladen und ich sehe das richtige Gleichgewicht. Wenn ich es jedoch zum zweiten Mal ausführe, sehe ich nur:

ADDRESS IS : [correct address here]
Aug 19, 2012 8:06:00 AM com.google.bitcoin.store.BoundedOverheadBlockStore load
INFO: Reading block store from saved.blockchain
Aug 19, 2012 8:06:00 AM com.google.bitcoin.store.BoundedOverheadBlockStore load
INFO: Read chain head from disk: 00000000000001b10c347b5ec05f9a1910d541905c5cd8827784a5c3e0695c95
Aug 19, 2012 8:06:00 AM com.google.bitcoin.core.BlockChain <init>
INFO: chain head is at height 194575:
v1 block: 
   previous block: 00000000000005ac50dc06021362cd4c284fafd4a1bdb7bad2849c978a875bb1
   merkle root: 158aedd0bc3386c7686f85ab933fd9e3ecb38e348b121ed0e61e2e776eda04a1
   time: [1345356028] Sun Aug 19 08:00:28 CEST 2012
   difficulty target (nBits): 436709470
   nonce: 4238997601

START DOWNLOADING BLOCKCHAIN
Aug 19, 2012 8:06:31 AM com.google.bitcoin.discovery.DnsDiscovery getPeers
INFO: DNS lookup for dnsseed.bitcoin.dashjr.org failed.
Aug 19, 2012 8:06:36 AM com.google.bitcoin.core.TCPNetworkConnection$NetworkHandler channelConnected
INFO: Announcing ourselves as: /BitCoinJ:0.6-SNAPSHOT/BitMessage:0.1/
Aug 19, 2012 8:06:41 AM com.google.bitcoin.core.Peer$PeerHandler exceptionCaught
INFO: com.google.bitcoin.core.Peer$PeerHandler@193f6e2 - No route to host
Aug 19, 2012 8:06:46 AM com.google.bitcoin.core.Peer$PeerHandler exceptionCaught
INFO: com.google.bitcoin.core.Peer$PeerHandler@61736e - No route to host
Aug 19, 2012 8:06:52 AM com.google.bitcoin.core.TCPNetworkConnection$NetworkHandler channelConnected
INFO: Announcing ourselves as: /BitCoinJ:0.6-SNAPSHOT/BitMessage:0.1/
Aug 19, 2012 8:06:52 AM com.google.bitcoin.core.PeerGroup handleNewPeer
INFO: Peer(seed.bitcoin.sipa.be/50.130.4.89:8333): New peer
Aug 19, 2012 8:06:52 AM com.google.bitcoin.core.PeerGroup handleNewPeer
INFO:   starting block chain download
Aug 19, 2012 8:06:52 AM com.google.bitcoin.core.PeerGroup setDownloadPeer
INFO: Setting download peer: Peer(seed.bitcoin.sipa.be/50.130.4.89:8333)
Downloading block chain of size 0. 
Done downloading block chain
Aug 19, 2012 8:06:52 AM com.google.bitcoin.core.Peer blockChainDownload
INFO: Peer(seed.bitcoin.sipa.be/50.130.4.89:8333): blockChainDownload(0000000000000000000000000000000000000000000000000000000000000000) current head = 00000000000001b10c347b5ec05f9a1910d541905c5cd8827784a5c3e0695c95
DONE; BALANCE IS :
0
Aug 19, 2012 8:06:52 AM com.google.bitcoin.core.PeerGroup$PeerGroupThread run
INFO: shutdown start

und der Saldo ist Null. Wenn ich die gespeicherte Blockchain lösche und sie erneut herunterladen lasse, funktioniert sie wieder, aber nur einmal.

Was mache ich falsch?

Antworten (3)

Okay, jetzt verstehe ich es.

Ich kann nicht.

Bitcoinj speichert nur die Header. Und - was ich nicht wusste - man kann das Gleichgewicht nicht nur mit Headern erreichen.

Für weitere Informationen können Sie die genaue Beschreibung der Kopfzeilen hier einsehen https://en.bitcoin.it/wiki/Block_hashing_algorithm

Was ich jedoch tun kann, ist, die Brieftasche gleich danach zu retten. Was ich tun werde.


vorherige "Antwort"/lautes Denken:

Ich stochere im Quellcode herum.

Es scheint, als wäre der wichtige Teil, wann sendTransactionsToWalletangerufen wird BlockChain.java- aber es wird nur währenddessen angerufen connectBlockund sonst nichts.

connectBlockwird nur während aufgerufen add. Und die einzigen addEd-Blöcke sind die neuen Blöcke aus dem Netzwerk, nicht die von BlockStore.

Aber ich werde mich im Code noch ein bisschen umsehen.


Ich bin mir nicht sicher, was schlimmes passieren würde, wenn ich den Konstruktor von umschreiben würde BlockChain.javavon:

/**
 * Constructs a BlockChain connected to the given list of wallets and a store.
 */
public BlockChain(NetworkParameters params, List<Wallet> wallets,
                  BlockStore blockStore) throws BlockStoreException {
    this.blockStore = blockStore;
    chainHead = blockStore.getChainHead();
    log.info("chain head is at height {}:\n{}", chainHead.getHeight(), chainHead.getHeader());
    this.params = params;
    this.wallets = new ArrayList<Wallet>(wallets);
}

zu (schreibe aus meinem Kopf, Getter/Setter sind möglicherweise nicht richtig usw.)

/**
 * Constructs a BlockChain connected to the given list of wallets and a store.
 */
public BlockChain(NetworkParameters params, List<Wallet> wallets,
                  BlockStore blockStore) throws BlockStoreException {
    this.blockStore = blockStore;
    chainHead = blockStore.getChainHead();
    log.info("chain head is at height {}:\n{}", chainHead.getHeight(), chainHead.getHeader());
    this.params = params;
    this.wallets = new ArrayList<Wallet>(wallets);
    StoredBlock sBlock = blockStore.getChainHead();
    Sha256Hash prevHash = sBlock.header.prevBlockHash();
    while (prevHash!=Sha256Hash.ZERO_HASH) {
        for (Wallet wallet:wallets){
            sendTransactionsToWallet(sBlock, NewBlockType.SIDE_CHAIN, wallet, sBlock.transactions); 
        }
        sBlock = blockStore.get(hash);
        prevHash = sBlock.header.prevBlockHash();
    }
}

aber nochmal, ich will das rad nicht neu erfinden oder so.

Es ist möglich, zu tun, was Sie wollen, indem Sie einfach die PostgresFullPrunedBlockStore -Klasse zum Speichern verwenden, und dann müssen Sie nur noch anrufen Address.calculateBalanceForAddress(), um das Guthaben der gewünschten Adresse zu erhalten.

Leider ist es eine Art alte Frage und ich experimentiere nicht mehr mit Bitcoinj, also kann ich Sie nicht akzeptieren, aber ich werde die Community durch Abstimmung entscheiden lassen, denke ich
Keine Sorge, ich wollte nur antworten, weil es kürzlich Updates mit bitcoinj gab und ich dachte, andere möchten das vielleicht wissen.
Wie groß wird die Postgress-DB sein? 100GB+ und wächst schnell richtig?
Heh, die Antwort hängt auch noch 2017 drin… Ich habe keine Ahnung, wie Bitcoinj jetzt aussieht.

Ich dachte, ich würde erwähnen, dass ich (hauptsächlich um Bandbreite zu sparen) eine einfache Caching-Option in MultiBit hinzugefügt habe, wo es einfach die empfangenen Blöcke in einem Verzeichnis speichert, jeder Block heißt [hash of block].block

Sie können dies verwenden, um die Transaktionen usw. später nach Belieben abzurufen. Das kostet natürlich Platz! Es befindet sich im MultiBit v0.5-Zweig. Die Hauptsteuerklasse ist CacheManager. Es könnte für Sie nützlich sein.

Die Bloom-Filterarbeit, die Matt Corrallo leistet, um die tx auf der Serverseite zu filtern, ist meiner Meinung nach der richtige Weg, um die Größe der Blockkette zu verwalten – dies ist nur eine Lücke, bis das in Bitcoinj ankommt.