Expose verifyScript from the daemon
This commit is contained in:
parent
beaa7cf450
commit
162088f8f4
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var bitcore = require('bitcore');
|
var bitcore = require('bitcore');
|
||||||
var bitcoinconsensus = require('libbitcoinconsensus');
|
|
||||||
var Transaction = bitcore.Transaction;
|
var Transaction = bitcore.Transaction;
|
||||||
var chainlib = require('chainlib');
|
var chainlib = require('chainlib');
|
||||||
var BaseTransaction = chainlib.Transaction;
|
var BaseTransaction = chainlib.Transaction;
|
||||||
@ -45,7 +44,7 @@ Transaction.prototype._validateInputs = function(db, poolTransactions, callback)
|
|||||||
[
|
[
|
||||||
self._populateInput.bind(self, db, input, poolTransactions),
|
self._populateInput.bind(self, db, input, poolTransactions),
|
||||||
self._checkSpent.bind(self, db, input, poolTransactions),
|
self._checkSpent.bind(self, db, input, poolTransactions),
|
||||||
self._checkScript.bind(self, input, self.inputs.indexOf(input))
|
self._checkScript.bind(self, db, input, self.inputs.indexOf(input))
|
||||||
],
|
],
|
||||||
next
|
next
|
||||||
);
|
);
|
||||||
@ -100,11 +99,11 @@ Transaction.prototype._checkSpent = function(db, input, poolTransactions, callba
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
Transaction.prototype._checkScript = function(input, index, callback) {
|
Transaction.prototype._checkScript = function(db, input, index, callback) {
|
||||||
if (input.output.script) {
|
if (input.output.script) {
|
||||||
var scriptPubkey = input.output._scriptBuffer;
|
var scriptPubkey = input.output._scriptBuffer;
|
||||||
var txTo = this.toBuffer();
|
var txTo = this.toBuffer();
|
||||||
var valid = bitcoinconsensus.verifyScript(scriptPubkey, txTo, index);
|
var valid = db.bitcoind.verifyScript(scriptPubkey, txTo, index);
|
||||||
if(valid) {
|
if(valid) {
|
||||||
return callback();
|
return callback();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -44,7 +44,6 @@
|
|||||||
"nan": "1.3.0",
|
"nan": "1.3.0",
|
||||||
"tiny": "0.0.10",
|
"tiny": "0.0.10",
|
||||||
"chainlib": "^0.1.1",
|
"chainlib": "^0.1.1",
|
||||||
"libbitcoinconsensus": "^0.0.3",
|
|
||||||
"errno": "^0.1.2",
|
"errno": "^0.1.2",
|
||||||
"async": "1.3.0",
|
"async": "1.3.0",
|
||||||
"memdown": "^1.0.0"
|
"memdown": "^1.0.0"
|
||||||
|
|||||||
@ -137,6 +137,43 @@ struct async_tx_data {
|
|||||||
Eternal<Function> callback;
|
Eternal<Function> callback;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify Scripts
|
||||||
|
*/
|
||||||
|
NAN_METHOD(VerifyScript) {
|
||||||
|
NanScope();
|
||||||
|
|
||||||
|
if (!node::Buffer::HasInstance(args[0])) {
|
||||||
|
return NanThrowTypeError("First argument should be a Buffer.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!node::Buffer::HasInstance(args[1])) {
|
||||||
|
return NanThrowTypeError("Second argument should be a Buffer.");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char *scriptPubKey = (unsigned char *) node::Buffer::Data(args[0]);
|
||||||
|
unsigned int scriptPubKeyLen = (unsigned int) node::Buffer::Length(args[0]);
|
||||||
|
|
||||||
|
const unsigned char *txTo = (unsigned char *) node::Buffer::Data(args[1]);
|
||||||
|
unsigned int txToLen = (unsigned int)node::Buffer::Length(args[1]);
|
||||||
|
|
||||||
|
unsigned int nIn = args[2]->NumberValue();
|
||||||
|
unsigned int flags = args[3]->NumberValue();
|
||||||
|
|
||||||
|
bitcoinconsensus_error* err;
|
||||||
|
err = 0;
|
||||||
|
|
||||||
|
int valid = bitcoinconsensus_verify_script(scriptPubKey, scriptPubKeyLen, txTo, txToLen, nIn, flags, err);
|
||||||
|
|
||||||
|
if (!valid && err) {
|
||||||
|
NanThrowError("The transaction was not valid");
|
||||||
|
}
|
||||||
|
|
||||||
|
NanReturnValue(NanNew<Number>(valid));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helpers
|
* Helpers
|
||||||
@ -1120,6 +1157,8 @@ init(Handle<Object> target) {
|
|||||||
NODE_SET_METHOD(target, "getChainWork", GetChainWork);
|
NODE_SET_METHOD(target, "getChainWork", GetChainWork);
|
||||||
NODE_SET_METHOD(target, "getMempoolOutputs", GetMempoolOutputs);
|
NODE_SET_METHOD(target, "getMempoolOutputs", GetMempoolOutputs);
|
||||||
NODE_SET_METHOD(target, "addMempoolUncheckedTransaction", AddMempoolUncheckedTransaction);
|
NODE_SET_METHOD(target, "addMempoolUncheckedTransaction", AddMempoolUncheckedTransaction);
|
||||||
|
NODE_SET_METHOD(target, "verifyScript", VerifyScript);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NODE_MODULE(bitcoindjs, init)
|
NODE_MODULE(bitcoindjs, init)
|
||||||
|
|||||||
@ -11,6 +11,7 @@
|
|||||||
#include "nan.h"
|
#include "nan.h"
|
||||||
#include "scheduler.h"
|
#include "scheduler.h"
|
||||||
#include "core_io.h"
|
#include "core_io.h"
|
||||||
|
#include "script/bitcoinconsensus.h"
|
||||||
|
|
||||||
NAN_METHOD(StartBitcoind);
|
NAN_METHOD(StartBitcoind);
|
||||||
NAN_METHOD(OnBlocksReady);
|
NAN_METHOD(OnBlocksReady);
|
||||||
@ -24,3 +25,4 @@ NAN_METHOD(IsSpent);
|
|||||||
NAN_METHOD(GetChainWork);
|
NAN_METHOD(GetChainWork);
|
||||||
NAN_METHOD(GetMempoolOutputs);
|
NAN_METHOD(GetMempoolOutputs);
|
||||||
NAN_METHOD(AddMempoolUncheckedTransaction);
|
NAN_METHOD(AddMempoolUncheckedTransaction);
|
||||||
|
NAN_METHOD(VerifyScript);
|
||||||
|
|||||||
@ -62,7 +62,7 @@ describe('Bitcoin Transaction', function() {
|
|||||||
sinon.stub(tx, '_checkSpent', function(db, input, poolTransactions, callback) {
|
sinon.stub(tx, '_checkSpent', function(db, input, poolTransactions, callback) {
|
||||||
return callback();
|
return callback();
|
||||||
});
|
});
|
||||||
sinon.stub(tx, '_checkScript', function(input, index, callback) {
|
sinon.stub(tx, '_checkScript', function(db, input, index, callback) {
|
||||||
return callback();
|
return callback();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -222,8 +222,13 @@ describe('Bitcoin Transaction', function() {
|
|||||||
tx.fromString(transactionData[1].hex);
|
tx.fromString(transactionData[1].hex);
|
||||||
var input = tx.inputs[0];
|
var input = tx.inputs[0];
|
||||||
input.output = prevTx.outputs[0];
|
input.output = prevTx.outputs[0];
|
||||||
|
var db = {
|
||||||
|
bitcoind: {
|
||||||
|
verifyScript: sinon.stub().returns(true)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
tx._checkScript(input, 0, function(err) {
|
tx._checkScript(db, input, 0, function(err) {
|
||||||
should.not.exist(err);
|
should.not.exist(err);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
@ -235,8 +240,13 @@ describe('Bitcoin Transaction', function() {
|
|||||||
tx.fromString(transactionData[2].hex);
|
tx.fromString(transactionData[2].hex);
|
||||||
var input = tx.inputs[0];
|
var input = tx.inputs[0];
|
||||||
input.output = prevTx.outputs[0];
|
input.output = prevTx.outputs[0];
|
||||||
|
var db = {
|
||||||
|
bitcoind: {
|
||||||
|
verifyScript: sinon.stub().returns(false)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
tx._checkScript(input, 0, function(err) {
|
tx._checkScript(db, input, 0, function(err) {
|
||||||
should.exist(err);
|
should.exist(err);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user