我正在尝试使用Chainpoint收据(版本3)来证明哈希的存在。
使用他们的API,我提交了一个散列并收到了收据,但是我不知道如何执行散列操作来获取merkle根。

这是我的收据:

var hash='5826bb4d3411ec5cf6d5052eebf812063197872891d875d7be406400e2931424';
var proof = {
  "@context": "https://w3id.org/chainpoint/v3",
  "type": "Chainpoint",
  "hash": "5826bb4d3411ec5cf6d5052eebf812063197872891d875d7be406400e2931424",
  "hash_id_node": "0e245ec0-8142-11e9-bed4-017015d9bf71",
  "hash_submitted_node_at": "2019-05-28T12:13:51Z",
  "hash_id_core": "0f048590-8142-11e9-be51-01e14610ae21",
  "hash_submitted_core_at": "2019-05-28T12:13:53Z",
  "branches": [
    {
      "label": "cal_anchor_branch",
      "ops": [
        {
          "l": "node_id:0e245ec0-8142-11e9-bed4-017015d9bf71"
        },
        {
          "op": "sha-256"
        },
        {
          "l": "core_id:0f048590-8142-11e9-be51-01e14610ae21"
        },
        {
          "op": "sha-256"
        },
        {
          "l": "nistv2:1559045520000:d9bdc4ddd1b82ed90274022f00bb01c5378357f4013ce81199257efc96e8f3e5d47a315edc7871b328ce683a2c58c468a406fc9e518bcc27abb75602ce01c9fb"
        },
        {
          "op": "sha-256"
        },
        {
          "r": "4ca74e3ec8fafe24e3369ab4ab14a986a3894a135c0ce73e00fe31db50ecf27f"
        },
        {
          "op": "sha-256"
        },
        {
          "r": "80529beed1232c31e9bb8accdd87d6203d9b98621481da2de1fd7d4f3441b820"
        },
        {
          "op": "sha-256"
        },
        {
          "r": "a3688e37b43b4548543fd39261165812d6cf2e70dd50f54aa7132c9d7990c3f4"
        },
        {
          "op": "sha-256"
        },
        {
          "l": "3277842:1559045636:1:https://b.chainpoint.org:cal:3277842"
        },
        {
          "r": "d0a8b8e6d4cb14d2b23836538382757b34480fb3eb9e3e37cae4d3b4a754a228"
        },
        {
          "op": "sha-256"
        },
        {
          "anchors": [
            {
              "type": "cal",
              "anchor_id": "3277842",
              "uris": [
                "https://b.chainpoint.org/calendar/3277842/hash"
              ]
            }
          ]
        }
      ]
    }
  ]
}



如果我做对的话,鱼鳞树的鱼鳞根位于地址https://b.chainpoint.org/calendar/3277842/hash

var merkle_root = '2bf7a252fb641a5b67e9563e5e4fc4f9fc11d5a74ffa4ef303db7678a1b521f9';


我编写了一个简单的脚本来证明哈希的存在:

var string = hash;
var obj = null;
var ops = proof.branches[0];
for ( var i = 0; i < ops.length; i++ ) {
    obj = ops[ i ];
    if ( Object.keys( obj )[0] === 'l' ) {
        string = `${obj['l']}${string}`;
    } else if ( Object.keys( obj )[0] === 'r' ) {
        string = `${string}${obj['r']}`;
    } else if ( Object.keys( obj )[0] === 'op' ) {
        string = h256(string);
    }
}

console.log( string === merkle_root );


我找不到我的错误在哪里,我们将不胜感激。

最佳答案

我找到了读取chanpoint解析代码的解决方案。
我在正确的轨道上。
这是工作代码:


function isHex(value) {
    var hexRegex = /^[0-9A-Fa-f]{2,}$/
    var result = hexRegex.test(value)
    if (result) result = !(value.length % 2)
    return result
}

var string = Buffer.from(hash, 'hex');
var obj = null;
for ( var i = 0; i < ops.length; i++ ) {
    obj = ops[ i ];
    if ( Object.keys( obj )[0] === 'l' ) {
        let concat_value = isHex(obj['l'])
          ? Buffer.from(obj['l'], 'hex')
          : Buffer.from(obj['l'], 'utf8');
        string = Buffer.concat( [ concat_value, string ] );
    } else if ( Object.keys( obj )[0] === 'r' ) {
        let concat_value = isHex(obj['r'])
          ? Buffer.from(obj['r'], 'hex')
          : Buffer.from(obj['r'], 'utf8');
        string = Buffer.concat( [ string, concat_value ] );
    } else if ( Object.keys( obj )[0] === 'op' ) {
        string = crypto
            .createHash('sha256')
            .update(string)
            .digest()
    }
}

console.log( string.toString('hex') === m_root );
// true

09-28 00:30