JavaScript二进制字符串转十六进制、Base58编码、再回到十六进制、字符串,随机错误。

4

我正在学习区块链技术,并希望创建一个创建地址的示例,仅限于教育目的 - 不会在生产环境中使用。

任务:创建160个随机比特,将其转换为十六进制,再将其转换为base58,然后通过反向过程测试正确性。

这种方法有所作为,但是在比较二进制之前和之后出现了间歇性的 'false'。hexStringToBinary函数返回长度不同的字符串:

const bs58 = require('bs58');

//20 * 8 = 160
function generate20Bytes () {
  let byteArray = [];
  let bytes = 0;
  while (bytes < 20) {
    let byte = '';
    while (byte.length < 8) {
      byte += Math.floor(Math.random() * 2);
    }
    byteArray.push(byte);
    bytes++;
  }
  return byteArray;
}

//the issue is probably from here
function hexStringToBinary (string) {
  return string.match(/.{1,2}/g)
    .map(hex => parseInt(hex, 16).toString(2).padStart(8, '0'));
}

const addressArray = generate20Bytes();
const binaryAddress = addressArray.join('');
const hex = addressArray.map(byte => parseInt(byte, 2).toString(16)).join('');
console.log(hex);

// then lets convert it to base 58
const base58 = bs58.encode(Buffer.from(hex));
console.log('base 58');
console.log(base58);

// lets see if we can reverse the process
const destructuredHex = bs58.decode(base58).toString();
console.log('hex is the same');
console.log(hex === destructuredHex);

// lets convert back to a binary string
const destructuredAddress = hexStringToBinary(destructuredHex).join('');
console.log('destructured address');
console.log(destructuredAddress);
console.log('binaryAddress address');
console.log(binaryAddress);

//intermittent false/true
console.log(destructuredAddress === binaryAddress);
1个回答

0

终于开始使用TDD进行重构了。发现十六进制数小于16时没有进行零填充。我的playground repo


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接