mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-02-11 17:55:53 +00:00
Namecoin LevelDBTransactionCache: Only store name scriptPubKey in the record, not entire transaction. (#32)
This breaks backward compatibility with older name databases. You'll need to delete the blockchain and resync.
This commit is contained in:
parent
6ce57fdb04
commit
31fb8985ba
@ -22,6 +22,7 @@ import org.libdohj.script.NameScript;
|
|||||||
import org.bitcoinj.core.AbstractBlockChain;
|
import org.bitcoinj.core.AbstractBlockChain;
|
||||||
import org.bitcoinj.core.Block;
|
import org.bitcoinj.core.Block;
|
||||||
import org.bitcoinj.core.BlockChain;
|
import org.bitcoinj.core.BlockChain;
|
||||||
|
import org.bitcoinj.core.Coin;
|
||||||
import org.bitcoinj.core.Context;
|
import org.bitcoinj.core.Context;
|
||||||
import org.bitcoinj.core.NetworkParameters;
|
import org.bitcoinj.core.NetworkParameters;
|
||||||
import org.bitcoinj.core.PeerGroup;
|
import org.bitcoinj.core.PeerGroup;
|
||||||
@ -51,6 +52,7 @@ import com.google.common.collect.SetMultimap;
|
|||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.nio.*;
|
import java.nio.*;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -205,7 +207,7 @@ public class NameLookupLatestLevelDBTransactionCache implements NameLookupLatest
|
|||||||
Script scriptPubKey = output.getScriptPubKey();
|
Script scriptPubKey = output.getScriptPubKey();
|
||||||
NameScript ns = new NameScript(scriptPubKey);
|
NameScript ns = new NameScript(scriptPubKey);
|
||||||
if(ns.isNameOp() && ns.isAnyUpdate() ) {
|
if(ns.isNameOp() && ns.isAnyUpdate() ) {
|
||||||
putNameTransaction(ns.getOpName().data, tx, height);
|
putNameScript(scriptPubKey, ns, height);
|
||||||
}
|
}
|
||||||
} catch (ScriptException e) {
|
} catch (ScriptException e) {
|
||||||
continue;
|
continue;
|
||||||
@ -219,21 +221,23 @@ public class NameLookupLatestLevelDBTransactionCache implements NameLookupLatest
|
|||||||
setChainHead(block.getHeight());
|
setChainHead(block.getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
protected synchronized void putNameTransaction(final byte[] nameBytes, Transaction tx, int height) {
|
protected synchronized void putNameScript(Script scriptPubKey, NameScript ns, int height) throws UnsupportedEncodingException {
|
||||||
|
|
||||||
// TODO: check if name is relevant (e.g. namespace is id/, has zeronet field)
|
// TODO: check if name is relevant (e.g. namespace is id/, has zeronet field)
|
||||||
|
|
||||||
byte[] headerBytes = "NameTx".getBytes();
|
// key format:
|
||||||
// name goes here
|
byte[] headerBytes = "NamScr".getBytes("ISO-8859-1");
|
||||||
|
byte[] nameBytes = ns.getOpName().data;
|
||||||
|
|
||||||
|
// record format:
|
||||||
// height goes here
|
// height goes here
|
||||||
byte[] txBytes = tx.bitcoinSerialize();
|
byte[] scriptBytes = scriptPubKey.getProgram();
|
||||||
|
|
||||||
ByteBuffer keyBuffer = ByteBuffer.allocate(headerBytes.length + nameBytes.length);
|
ByteBuffer keyBuffer = ByteBuffer.allocate(headerBytes.length + nameBytes.length);
|
||||||
ByteBuffer recordBuffer = ByteBuffer.allocate(4 + txBytes.length);
|
ByteBuffer recordBuffer = ByteBuffer.allocate(4 + scriptBytes.length);
|
||||||
|
|
||||||
keyBuffer.put(headerBytes).put(nameBytes);
|
keyBuffer.put(headerBytes).put(nameBytes);
|
||||||
recordBuffer.putInt(height).put(txBytes);
|
recordBuffer.putInt(height).put(scriptBytes);
|
||||||
|
|
||||||
db.put(keyBuffer.array(), recordBuffer.array());
|
db.put(keyBuffer.array(), recordBuffer.array());
|
||||||
}
|
}
|
||||||
@ -264,7 +268,7 @@ public class NameLookupLatestLevelDBTransactionCache implements NameLookupLatest
|
|||||||
@Override
|
@Override
|
||||||
public Transaction getNameTransaction(String name, String identity) throws Exception {
|
public Transaction getNameTransaction(String name, String identity) throws Exception {
|
||||||
|
|
||||||
byte[] headerBytes = "NameTx".getBytes("ISO-8859-1");
|
byte[] headerBytes = "NamScr".getBytes("ISO-8859-1");
|
||||||
byte[] nameBytes = name.getBytes("ISO-8859-1");
|
byte[] nameBytes = name.getBytes("ISO-8859-1");
|
||||||
// name goes here
|
// name goes here
|
||||||
|
|
||||||
@ -281,7 +285,11 @@ public class NameLookupLatestLevelDBTransactionCache implements NameLookupLatest
|
|||||||
|
|
||||||
verifyHeightTrustworthy(height);
|
verifyHeightTrustworthy(height);
|
||||||
|
|
||||||
Transaction tx = new Transaction(params, recordBytes, 4);
|
byte[] scriptPubKeyBytes = Arrays.copyOfRange(recordBytes, 4, recordBytes.length);
|
||||||
|
|
||||||
|
Transaction tx = new Transaction(params);
|
||||||
|
Script scriptPubKey = new Script(scriptPubKeyBytes);
|
||||||
|
tx.addOutput(Coin.CENT, scriptPubKey);
|
||||||
|
|
||||||
tx.getConfidence().setAppearedAtChainHeight(height); // TODO: test this line
|
tx.getConfidence().setAppearedAtChainHeight(height); // TODO: test this line
|
||||||
tx.getConfidence().setDepthInBlocks(chain.getChainHead().getHeight() - height + 1);
|
tx.getConfidence().setDepthInBlocks(chain.getChainHead().getHeight() - height + 1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user