PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo-express/node_modules/ripple-hashes/src

Просмотр файла: index.js

'use strict';
var BigNumber = require('bignumber.js');
var decodeAddress = require('ripple-address-codec').decodeAddress;
var binary = require('ripple-binary-codec');
var hashprefixes = require('./hashprefixes');
var SHAMap = require('./shamap').SHAMap;
var SHAMapTreeNode = require('./shamap').SHAMapTreeNode;
var ledgerspaces = require('./ledgerspaces');
var sha512half = require('./sha512half');

function hash(hex) {
  return sha512half(Buffer.from(hex, 'hex'));
}

function padLeftZero(string, length) {
  return Array(length - string.length + 1).join('0') + string;
}

function intToHex(integer, byteLength) {
  return padLeftZero(Number(integer).toString(16), byteLength * 2);
}

function bytesToHex(bytes) {
  return (Buffer.from(bytes)).toString('hex');
}

function bigintToHex(integerString, byteLength) {
  var hex = (new BigNumber(integerString)).toString(16);
  return padLeftZero(hex, byteLength * 2);
}

function ledgerSpaceHex(name) {
  return intToHex(ledgerspaces[name].charCodeAt(0), 2);
}

function addressToHex(address) {
  return (Buffer.from(decodeAddress(address))).toString('hex');
}

function currencyToHex(currency) {
  if (currency.length === 3) {
    var bytes = new Array(20 + 1).join('0').split('').map(parseFloat);
    bytes[12] = currency.charCodeAt(0) & 0xff;
    bytes[13] = currency.charCodeAt(1) & 0xff;
    bytes[14] = currency.charCodeAt(2) & 0xff;
    return bytesToHex(bytes);
  }
  return currency;
}

function addLengthPrefix(hex) {
  var length = hex.length / 2;
  if (length <= 192) {
    return bytesToHex([length]) + hex;
  } else if (length <= 12480) {
    var x = length - 193;
    return bytesToHex([193 + (x >>> 8), x & 0xff]) + hex;
  } else if (length <= 918744) {
    var x = length - 12481;
    return bytesToHex([241 + (x >>> 16), x >>> 8 & 0xff, x & 0xff]) + hex;
  }
  throw new Error('Variable integer overflow.');
}

function computeBinaryTransactionHash(txBlobHex) {
  var prefix = hashprefixes.HASH_TX_ID.toString(16).toUpperCase();
  return hash(prefix + txBlobHex);
}

function computeTransactionHash(txJSON) {
  return computeBinaryTransactionHash(binary.encode(txJSON));
}

function computeBinaryTransactionSigningHash(txBlobHex) {
  var prefix = hashprefixes.HASH_TX_SIGN.toString(16).toUpperCase();
  return hash(prefix + txBlobHex);
}

function computeTransactionSigningHash(txJSON) {
  return computeBinaryTransactionSigningHash(binary.encode(txJSON));
}

function computeAccountHash(address) {
  return hash(ledgerSpaceHex('account') + addressToHex(address));
}

function computeSignerListHash(address) {
  return hash(ledgerSpaceHex('signerList') +
              addressToHex(address) +
              '00000000' /* uint32(0) signer list index */);
}

function computeOrderHash(address, sequence) {
  var prefix = '00' + intToHex(ledgerspaces.offer.charCodeAt(0), 1);
  return hash(prefix + addressToHex(address) + intToHex(sequence, 4));
}

function computeTrustlineHash(address1, address2, currency) {
  var address1Hex = addressToHex(address1);
  var address2Hex = addressToHex(address2);

  var swap = (new BigNumber(address1Hex, 16)).greaterThan(
    new BigNumber(address2Hex, 16));
  var lowAddressHex = swap ? address2Hex : address1Hex;
  var highAddressHex = swap ? address1Hex : address2Hex;

  var prefix = ledgerSpaceHex('rippleState');
  return hash(prefix + lowAddressHex + highAddressHex +
              currencyToHex(currency));
}

function computeTransactionTreeHash(transactions) {
  var shamap = new SHAMap();

  transactions.forEach(function(txJSON) {
    var txBlobHex = binary.encode(txJSON);
    var metaHex = binary.encode(txJSON.metaData);
    var txHash = computeBinaryTransactionHash(txBlobHex);
    var data = addLengthPrefix(txBlobHex) + addLengthPrefix(metaHex);
    shamap.add_item(txHash, data, SHAMapTreeNode.TYPE_TRANSACTION_MD);
  });

  return shamap.hash();
}

function computeStateTreeHash(entries) {
  var shamap = new SHAMap();

  entries.forEach(function(ledgerEntry) {
    var data = binary.encode(ledgerEntry);
    shamap.add_item(ledgerEntry.index, data, SHAMapTreeNode.TYPE_ACCOUNT_STATE);
  });

  return shamap.hash();
}

// see rippled Ledger::updateHash()
function computeLedgerHash(ledgerHeader) {
  var prefix = hashprefixes.HASH_LEDGER.toString(16).toUpperCase();
  return hash(prefix +
    intToHex(ledgerHeader.ledger_index, 4) +
    bigintToHex(ledgerHeader.total_coins, 8) +
    ledgerHeader.parent_hash +
    ledgerHeader.transaction_hash +
    ledgerHeader.account_hash +
    intToHex(ledgerHeader.parent_close_time, 4) +
    intToHex(ledgerHeader.close_time, 4) +
    intToHex(ledgerHeader.close_time_resolution, 1) +
    intToHex(ledgerHeader.close_flags, 1)
  );
}

function computeEscrowHash(address, sequence) {
  return hash(ledgerSpaceHex('escrow') + addressToHex(address) +
    intToHex(sequence, 4));
}

function computePaymentChannelHash(address, dstAddress, sequence) {
  return hash(ledgerSpaceHex('paychan') + addressToHex(address) +
    addressToHex(dstAddress) + intToHex(sequence, 4));
}

module.exports = {
  computeTransactionHash: computeTransactionHash,
  computeBinaryTransactionHash: computeBinaryTransactionHash,
  computeTransactionSigningHash: computeTransactionSigningHash,
  computeBinaryTransactionSigningHash: computeBinaryTransactionSigningHash,
  computeAccountHash: computeAccountHash,
  computeOrderHash: computeOrderHash,
  computeTrustlineHash: computeTrustlineHash,
  computeSignerListHash: computeSignerListHash,
  computeStateTreeHash: computeStateTreeHash,
  computeTransactionTreeHash: computeTransactionTreeHash,
  computeLedgerHash: computeLedgerHash,
  computeEscrowHash: computeEscrowHash,
  computePaymentChannelHash: computePaymentChannelHash
};

Выполнить команду


Для локальной разработки. Не используйте в интернете!