debug "Unknown" bug.
This commit is contained in:
parent
6c8b08e697
commit
811b3ebf4a
|
@ -401,6 +401,9 @@ ListTransactions_V8(const CWalletTx& wtx, const string& strAccount,
|
||||||
static int64_t
|
static int64_t
|
||||||
SatoshiFromAmount(const CAmount& amount);
|
SatoshiFromAmount(const CAmount& amount);
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_tx(uint256 txid, uint256 blockhash, CTransaction& ctx);
|
||||||
|
|
||||||
extern "C" void
|
extern "C" void
|
||||||
init(Handle<Object>);
|
init(Handle<Object>);
|
||||||
|
|
||||||
|
@ -1118,8 +1121,7 @@ NAN_METHOD(GetTransaction) {
|
||||||
std::string blockHash = std::string(*blockHash_);
|
std::string blockHash = std::string(*blockHash_);
|
||||||
|
|
||||||
if (blockHash == "") {
|
if (blockHash == "") {
|
||||||
blockHash = std::string(
|
blockHash = uint256(0).GetHex();
|
||||||
"0000000000000000000000000000000000000000000000000000000000000000");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async_tx_data *data = new async_tx_data();
|
async_tx_data *data = new async_tx_data();
|
||||||
|
@ -1148,30 +1150,29 @@ async_get_tx(uv_work_t *req) {
|
||||||
uint256 block_hash(data->blockHash);
|
uint256 block_hash(data->blockHash);
|
||||||
CTransaction ctx;
|
CTransaction ctx;
|
||||||
|
|
||||||
if (GetTransaction(hash, ctx, block_hash, true)) {
|
if (get_tx(hash, block_hash, ctx)) {
|
||||||
data->ctx = ctx;
|
data->ctx = ctx;
|
||||||
goto collect_prev;
|
|
||||||
} else {
|
} else {
|
||||||
if (data->blockHash != "0000000000000000000000000000000000000000000000000000000000000000") {
|
|
||||||
CBlock block;
|
|
||||||
CBlockIndex* pblockindex = mapBlockIndex[block_hash];
|
|
||||||
if (ReadBlockFromDisk(block, pblockindex)) {
|
|
||||||
BOOST_FOREACH(const CTransaction &tx, block.vtx) {
|
|
||||||
if (tx.GetHash() == hash) {
|
|
||||||
data->ctx = tx;
|
|
||||||
goto collect_prev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
data->err_msg = std::string("get_tx(): failed.");
|
data->err_msg = std::string("get_tx(): failed.");
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
#if 0
|
||||||
|
if (GetTransaction(hash, ctx, block_hash, true)) {
|
||||||
collect_prev:
|
data->ctx = ctx;
|
||||||
return;
|
} else if (block_hash != 0) {
|
||||||
|
CBlock block;
|
||||||
|
CBlockIndex* pblockindex = mapBlockIndex[block_hash];
|
||||||
|
if (ReadBlockFromDisk(block, pblockindex)) {
|
||||||
|
BOOST_FOREACH(const CTransaction &tx, block.vtx) {
|
||||||
|
if (tx.GetHash() == hash) {
|
||||||
|
data->ctx = tx;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data->err_msg = std::string("GetTransaction(): failed.");
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -5841,6 +5842,25 @@ cblock_to_jsblock(const CBlock& cblock, CBlockIndex* cblock_index, Local<Object>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
get_tx(uint256 txid, uint256 blockhash, CTransaction& ctx) {
|
||||||
|
if (GetTransaction(txid, ctx, blockhash, true)) {
|
||||||
|
return 1;
|
||||||
|
} else if (blockhash != 0) {
|
||||||
|
CBlock block;
|
||||||
|
CBlockIndex* pblockindex = mapBlockIndex[blockhash];
|
||||||
|
if (ReadBlockFromDisk(block, pblockindex)) {
|
||||||
|
BOOST_FOREACH(const CTransaction& tx, block.vtx) {
|
||||||
|
if (tx.GetHash() == txid) {
|
||||||
|
ctx = tx;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
ctx_to_jstx(const CTransaction& ctx, uint256 block_hash, Local<Object> jstx) {
|
ctx_to_jstx(const CTransaction& ctx, uint256 block_hash, Local<Object> jstx) {
|
||||||
// With v0.9.0
|
// With v0.9.0
|
||||||
|
@ -5873,17 +5893,30 @@ ctx_to_jstx(const CTransaction& ctx, uint256 block_hash, Local<Object> jstx) {
|
||||||
|
|
||||||
Local<Object> jsprev = NanNew<Object>();
|
Local<Object> jsprev = NanNew<Object>();
|
||||||
CTransaction prev_tx;
|
CTransaction prev_tx;
|
||||||
|
//if (get_tx(txin.prevout.hash, block_hash, prev_tx)) {
|
||||||
if (GetTransaction(txin.prevout.hash, prev_tx, block_hash, true)) {
|
if (GetTransaction(txin.prevout.hash, prev_tx, block_hash, true)) {
|
||||||
CTxDestination from;
|
CTxDestination from;
|
||||||
CTxOut prev_out = prev_tx.vout[txin.prevout.n];
|
CTxOut prev_out = prev_tx.vout[txin.prevout.n];
|
||||||
ExtractDestination(prev_out.scriptPubKey, from);
|
ExtractDestination(prev_out.scriptPubKey, from);
|
||||||
CBitcoinAddress addrFrom(from);
|
CBitcoinAddress addrFrom(from);
|
||||||
|
|
||||||
jsprev->Set(NanNew<String>("address"), NanNew<String>(addrFrom.ToString()));
|
jsprev->Set(NanNew<String>("address"), NanNew<String>(addrFrom.ToString()));
|
||||||
jsprev->Set(NanNew<String>("value"), NanNew<Number>((int64_t)prev_out.nValue)->ToInteger());
|
jsprev->Set(NanNew<String>("value"), NanNew<Number>((int64_t)prev_out.nValue)->ToInteger());
|
||||||
} else {
|
} else {
|
||||||
jsprev->Set(NanNew<String>("address"), NanNew<String>(std::string("Unknown")));
|
const CTxOut& txout = ctx.vout[0];
|
||||||
jsprev->Set(NanNew<String>("value"), NanNew<Number>(0));
|
const CScript& scriptPubKey = txout.scriptPubKey;
|
||||||
|
txnouttype type;
|
||||||
|
vector<CTxDestination> addresses;
|
||||||
|
int nRequired;
|
||||||
|
if (ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
|
||||||
|
// Unknowns usually have the same first addr as the first output:
|
||||||
|
// https://blockexplorer.com/testnet/block/
|
||||||
|
const CTxDestination& addr = addresses[0];
|
||||||
|
jsprev->Set(NanNew<String>("address"), NanNew<String>(CBitcoinAddress(addr).ToString()));
|
||||||
|
jsprev->Set(NanNew<String>("value"), NanNew<Number>((int64_t)txout.nValue)->ToInteger());
|
||||||
|
} else {
|
||||||
|
jsprev->Set(NanNew<String>("address"), NanNew<String>(std::string("Unknown")));
|
||||||
|
jsprev->Set(NanNew<String>("value"), NanNew<Number>(0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
in->Set(NanNew<String>("prev"), jsprev);
|
in->Set(NanNew<String>("prev"), jsprev);
|
||||||
|
|
||||||
|
@ -5934,6 +5967,39 @@ ctx_to_jstx(const CTransaction& ctx, uint256 block_hash, Local<Object> jstx) {
|
||||||
}
|
}
|
||||||
jstx->Set(NanNew<String>("vout"), vout);
|
jstx->Set(NanNew<String>("vout"), vout);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
int jvi = 0;
|
||||||
|
Local<Object> jsvin = Local<Object>::Cast(jstx->Get(NanNew<String>("vin")));
|
||||||
|
for (; jvi < jsvin->Length(); jvi++) {
|
||||||
|
Local<Object> jsprev = Local<Object>::Cast(jsvin->Get(NanNew<String>("prev")));
|
||||||
|
Utf8Value jsaddr_(jsprev->Get(NanNew<String>("address"))->ToString());
|
||||||
|
std::string jsaddr = std::string(*jsaddr_);
|
||||||
|
if (jsaddr == "Unknown") {
|
||||||
|
Local<Object> jsvout = Local<Object>::Cast(jstx->Get(NanNew<String>("vout")));
|
||||||
|
Local<Object> jsspk = Local<Object>::Cast(jsvout->Get(NanNew<String>("scriptPubKey")));
|
||||||
|
Local<Array> jsaddrs = Local<Array>::Cast(jsvout->Get(NanNew<String>("addresses")));
|
||||||
|
Utf8Value jsa_(jsaddrs->Get(0)->ToString());
|
||||||
|
std::string jsa = std::string(*jsa_);
|
||||||
|
jsprev->Set(NanNew<String>("address"), NanNew<String>(std::string(jsa + std::string("-fixed"))));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const CTxOut& txout = ctx.vout[txin.prevout.n];
|
||||||
|
for (unsigned int vo = 0; vo < ctx.vout.size(); vo++) {
|
||||||
|
const CTxOut& txout = ctx.vout[vo];
|
||||||
|
out->Set(NanNew<String>("n"), NanNew<Number>((unsigned int)vo)->ToUint32());
|
||||||
|
const CScript& scriptPubKey = txout.scriptPubKey;
|
||||||
|
txnouttype type;
|
||||||
|
vector<CTxDestination> addresses;
|
||||||
|
int nRequired;
|
||||||
|
if (ExtractDestinations(scriptPubKey, type, addresses, nRequired)) {
|
||||||
|
BOOST_FOREACH(const CTxDestination& addr, addresses) {
|
||||||
|
std::string addr = CBitcoinAddress(addr).ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
CWalletTx cwtx(pwalletMain, ctx);
|
CWalletTx cwtx(pwalletMain, ctx);
|
||||||
// XXX Determine wether this is our transaction
|
// XXX Determine wether this is our transaction
|
||||||
bool is_mine = cwtx.hashBlock != 0;
|
bool is_mine = cwtx.hashBlock != 0;
|
||||||
|
|
Loading…
Reference in New Issue