Как проверить документ из QLDB в Node.js? - PullRequest
3 голосов
/ 19 сентября 2019

Я пытаюсь проверить документ из QLDB, используя nodejs.Я следовал примеру Проверка Java столько, сколько смог, но я не могу рассчитать тот же дайджест, который хранится в книге.

Это код, который я нашелс участием.Я запрашиваю подтверждение и блокирующий хеш из QLDB, а затем пытаюсь вычислить дайджест так же, как в примере с Java.Но после объединения двух хешей и вычисления нового хеша из результата я получаю неправильный вывод из crypto.createHash('sha256').update(c).digest("base64").Я также попытался использовать «base64» вместо «hex» с другим, но также неправильным результатом.

  const rBlock = makeReader(res.Revision.IonText);

  var block = [];

  rBlock.next();
  rBlock.stepIn();
  rBlock.next();
  while (rBlock.next() != null) {
    if (rBlock.fieldName() == 'hash') {
      block.push(Buffer.from(rBlock.byteValue()).toString('hex'));
    }
  }

  console.log(block);

  var proof = [];

  const rProof = makeReader(res.Proof.IonText);
  rProof.next();

  rProof.stepIn();
  while (rProof.next() != null) {
    proof.push(Buffer.from(rProof.byteValue()).toString('hex'));
  }

  var ph = block[0];
  var c;
  for (var i = 0; i < proof.length; i++) {
    console.log(proof[i])

    for (var j = 0; j < ph.length; j++) {
      if (parseInt(ph[j]) > parseInt(proof[i][j])){
        c = ph + proof[i];
        break;
      }
      if (parseInt(ph[j]) < parseInt(proof[i][j])){
        c = proof[i] + ph;
        break;
      }
    }

    ph = crypto.createHash('sha256').update(c).digest("hex");
    console.log(ph);
    console.log();
  }

1 Ответ

1 голос
/ 20 сентября 2019

Я должен понять это.Проблема заключалась в том, что я преобразовывал большие двоичные объекты в шестнадцатеричные строки и хешировал их вместо необработанных значений.Для тех, кто хочет проверить данные в узле, вот простое решение:

ledgerInfo.getRevision(params).then(res => {
  console.log(res);

  const rBlock = makeReader(res.Revision.IonText);

  var ph;

  rBlock.next();
  rBlock.stepIn();
  rBlock.next();
  while (rBlock.next() != null) {
    if (rBlock.fieldName() == 'hash') {
      ph = rBlock.byteValue()
    }
  }

  var proof = [];

  const rProof = makeReader(res.Proof.IonText);
  rProof.next();

  rProof.stepIn();
  while (rProof.next() != null) {
    proof.push(rProof.byteValue());
  }

  for (var i = 0; i < proof.length; i++) {
    var c;

    if (hashComparator(ph, proof[i]) < 0) {
      c = concatTypedArrays(ph, proof[i]);
    }
    else {
      c = concatTypedArrays(proof[i], ph);
    }

    var buff = crypto.createHash('sha256').update(c).digest("hex");
    ph = Uint8Array.from(Buffer.from(buff, 'hex'));
  }

  console.log(Buffer.from(ph).toString('base64'));

}).catch(err => {
  console.log(err, err.stack)
});

function concatTypedArrays(a, b) {
  var c = new (a.constructor)(a.length + b.length);
  c.set(a, 0);
  c.set(b, a.length);
  return c;
}

function hashComparator(h1, h2) {
  for (var i = h1.length - 1; i >= 0; i--) {
    var diff = (h1[i]<<24>>24) - (h2[i]<<24>>24);
    if (diff != 0)
      return diff;
  }
  return 0;
}
...