fcoin/lib/bcoin/protocol/constants.js
2016-03-08 02:12:21 -08:00

345 lines
6.7 KiB
JavaScript

/**
* constants.js - bitcoin constants for bcoin
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
* https://github.com/indutny/bcoin
*/
var bcoin = require('../../bcoin');
var bn = require('bn.js');
var utils = bcoin.utils;
exports.minVersion = 70001;
exports.version = 70002;
// exports.maxMessage = 2 * 1024 * 1024; // main
exports.maxMessage = 4 * 1000 * 1000; // segwit
exports.bcoinServices = 0;
exports.services = {
network: (1 << 0),
getutxo: (1 << 1),
bloom: (1 << 2),
witness: (1 << 3)
};
exports.inv = {
error: 0,
tx: 1,
block: 2,
filtered: 3,
witnesstx: 1 | (1 << 30),
witnessblock: 2 | (1 << 30),
witnessfiltered: 3 | (1 << 30)
};
exports.invByVal = {
0: 'error',
1: 'tx',
2: 'block',
3: 'filtered'
};
exports.filterFlags = {
none: 0,
all: 1,
pubkeyOnly: 2
};
exports.opcodes = {
// 'false': 0x00,
'0': 0x00,
pushdata1: 0x4c,
pushdata2: 0x4d,
pushdata4: 0x4e,
'1negate': 0x4f,
reserved: 0x50,
// 'true': 0x51,
'1': 0x51,
'2': 0x52,
'3': 0x53,
'4': 0x54,
'5': 0x55,
'6': 0x56,
'7': 0x57,
'8': 0x58,
'9': 0x59,
'10': 0x5a,
'11': 0x5b,
'12': 0x5c,
'13': 0x5d,
'14': 0x5e,
'15': 0x5f,
'16': 0x60,
nop: 0x61,
ver: 0x62,
'if': 0x63,
notif: 0x64,
verif: 0x65,
vernotif: 0x66,
'else': 0x67,
endif: 0x68,
verify: 0x69,
'return': 0x6a,
toaltstack: 0x6b,
fromaltstack: 0x6c,
'2drop': 0x6d,
'2dup': 0x6e,
'3dup': 0x6f,
'2over': 0x70,
'2rot': 0x71,
'2swap': 0x72,
ifdup: 0x73,
depth: 0x74,
drop: 0x75,
dup: 0x76,
nip: 0x77,
over: 0x78,
pick: 0x79,
roll: 0x7a,
rot: 0x7b,
swap: 0x7c,
tuck: 0x7d,
cat: 0x7e,
substr: 0x7f,
left: 0x80,
right: 0x81,
size: 0x82,
invert: 0x83,
and: 0x84,
or: 0x85,
xor: 0x86,
equal: 0x87,
equalverify: 0x88,
reserved1: 0x89,
reserved2: 0x8a,
'1add': 0x8b,
'1sub': 0x8c,
'2mul': 0x8d,
'2div': 0x8e,
negate: 0x8f,
abs: 0x90,
not: 0x91,
'0notequal': 0x92,
add: 0x93,
sub: 0x94,
mul: 0x95,
div: 0x96,
mod: 0x97,
lshift: 0x98,
rshift: 0x99,
booland: 0x9a,
boolor: 0x9b,
numequal: 0x9c,
numequalverify: 0x9d,
numnotequal: 0x9e,
lessthan: 0x9f,
greaterthan: 0xa0,
lessthanorequal: 0xa1,
greaterthanorequal: 0xa2,
min: 0xa3,
max: 0xa4,
within: 0xa5,
ripemd160: 0xa6,
sha1: 0xa7,
sha256: 0xa8,
hash160: 0xa9,
hash256: 0xaa,
codeseparator: 0xab,
checksig: 0xac,
checksigverify: 0xad,
checkmultisig: 0xae,
checkmultisigverify: 0xaf,
// 'eval': 0xb0,
nop1: 0xb0,
// nop2: 0xb1,
checklocktimeverify: 0xb1,
// nop3: 0xb2,
checksequenceverify: 0xb2,
nop4: 0xb3,
nop5: 0xb4,
nop6: 0xb5,
nop7: 0xb6,
nop8: 0xb7,
nop9: 0xb8,
nop10: 0xb9,
pubkeyhash: 0xfd,
pubkey: 0xfe,
invalidopcode: 0xff
};
exports.opcodesByVal = new Array(256);
Object.keys(exports.opcodes).forEach(function(name) {
var val = exports.opcodes[name];
// if (val === 0x00 || (val >= 0x51 && val <= 0x60))
// name = +name;
exports.opcodesByVal[val] = name;
});
exports.coin = new bn(10000000).muln(10);
exports.cent = new bn(1000000);
exports.maxMoney = new bn(21000000).mul(exports.coin);
exports.hashType = {
all: 1,
none: 2,
single: 3,
anyonecanpay: 0x80
};
exports.hashTypeByVal = Object.keys(exports.hashType).reduce(function(out, type) {
out[exports.hashType[type]] = type;
return out;
}, {});
exports.block = {
maxSize: 1000000,
maxCost: 4000000,
maxSigops: 1000000 / 50,
maxSigopsCost: 4000000 / 50,
maxOrphanTx: 1000000 / 100,
medianTimespan: 11,
bip16time: 1333238400
};
exports.tx = {
version: 1,
maxSize: 100000,
maxCost: 400000,
minFee: 10000,
bareMultisig: true,
freeThreshold: exports.coin.muln(144).divn(250),
maxFreeSize: 1000
};
exports.tx.dustThreshold = new bn(182)
.muln(exports.tx.minFee)
.divn(1000)
.muln(3)
.toNumber();
exports.script = {
maxSize: 10000,
maxStack: 1000,
maxPush: 520,
maxOps: 201,
maxPubkeysPerMultisig: 20,
maxBlockSigops: exports.block.maxSize / 50,
maxScripthashSigops: 15,
maxTxSigops: exports.block.maxSize / 50 / 5,
maxOpReturnBytes: 83,
maxOpReturn: 80
};
exports.reject = {
malformed: 0x01,
invalid: 0x10,
obsolete: 0x11,
duplicate: 0x12,
nonstandard: 0x40,
dust: 0x41,
insufficientfee: 0x42,
checkpoint: 0x43
};
exports.rejectByVal = Object.keys(exports.reject).reduce(function(out, name) {
out[exports.reject[name]] = name;
return out;
}, {});
exports.hd = {
hardened: 0x80000000,
maxIndex: 2 * 0x80000000,
minEntropy: 128 / 8,
maxEntropy: 512 / 8,
parentFingerPrintSize: 4,
pathRoots: ['m', 'M', 'm\'', 'M\'']
};
exports.locktimeThreshold = 500000000; // Tue Nov 5 00:53:20 1985 UTC
exports.sequenceLocktimeDisableFlag = 0x80000000; // (1 << 31)
exports.sequenceLocktimeTypeFlag = 1 << 22;
exports.sequenceLocktimeMask = 0x0000ffff;
exports.oneHash = new Buffer(
'0000000000000000000000000000000000000000000000000000000000000001',
'hex'
);
exports.zeroHash = new Buffer(
'0000000000000000000000000000000000000000000000000000000000000000',
'hex'
);
exports.userVersion = require('../../../package.json').version;
exports.userAgent = '/bcoin:' + exports.userVersion + '/';
exports.banTime = 24 * 60 * 60;
exports.banScore = 100;
// Script and locktime flags
exports.flags = {
VERIFY_NONE: 0,
VERIFY_P2SH: (1 << 0),
VERIFY_STRICTENC: (1 << 1),
VERIFY_DERSIG: (1 << 2),
VERIFY_LOW_S: (1 << 3),
VERIFY_NULLDUMMY: (1 << 4),
VERIFY_SIGPUSHONLY: (1 << 5),
VERIFY_MINIMALDATA: (1 << 6),
VERIFY_DISCOURAGE_UPGRADABLE_NOPS: (1 << 7),
VERIFY_CLEANSTACK: (1 << 8),
VERIFY_CHECKLOCKTIMEVERIFY: (1 << 9),
VERIFY_WITNESS: (1 << 10),
VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM: (1 << 11),
// NOTE: Should be (1 << 10) - but that conflicts with segwit
VERIFY_CHECKSEQUENCEVERIFY: (1 << 12)
};
// Block validation
exports.flags.MANDATORY_VERIFY_FLAGS = exports.flags.VERIFY_P2SH;
// Mempool validation
exports.flags.STANDARD_VERIFY_FLAGS =
exports.flags.MANDATORY_VERIFY_FLAGS
| exports.flags.VERIFY_DERSIG
| exports.flags.VERIFY_STRICTENC
| exports.flags.VERIFY_MINIMALDATA
| exports.flags.VERIFY_NULLDUMMY
| exports.flags.VERIFY_DISCOURAGE_UPGRADABLE_NOPS
| exports.flags.VERIFY_CLEANSTACK
| exports.flags.VERIFY_CHECKLOCKTIMEVERIFY
| exports.flags.VERIFY_LOW_S;
// | exports.flags.VERIFY_WITNESS
// | exports.flags.VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM
// | exports.flags.VERIFY_CHECKSEQUENCEVERIFY;
exports.versionbits = {
// What block version to use for new blocks (pre versionbits)
LAST_OLD_BLOCK_VERSION: 4,
// What bits to set in version for versionbits blocks
TOP_BITS: 0x20000000,
// What bitmask determines whether versionbits is in use
TOP_MASK: 0xe0000000
};
exports.thresholdStates = {
DEFINED: 0,
STARTED: 1,
LOCKED_IN: 2,
ACTIVE: 3,
FAILED: 4
};