首页 > 解决方案 > 如何在javascript中存储256位十六进制

问题描述

我如何在 Javascript 中处理 64 个字符的十六进制(256 位)。

> b = 0x1936c240636390dc823e3a728e94b208eb53c6756d81da57ec3425e05d43ac10
// 1.1404571630774433e+76
> b.toString(16)
// '1936c24063639100000000000000000000000000000000000000000000000000'

当我这样做时,我会失去准确性。

编辑:

不幸的是,我在以下场景中 js 转换了输入参数

function uint256(hexNumber){
    let bigNumber = BigInt(hexNumber);
    logger.info('Hex:'+ bigNumber.toString(16)+' to bigInt '+bigNumber);
    return bigNumber.toString(16);
}

所以电话给了我:

uint256(0x1936c240636390dc823e3a728e94b208eb53c6756d81da57ec3425e05d43ac10)
//Hex:1936c24063639100000000000000000000000000000000000000000000000000 to bigInt 11404571630774432649143590157348217225799776391499391730068078364228824596480

对于上下文,我正在尝试转录一个大型 Solidity 函数,该函数看起来像这样,只有 520 个数组分配而不是 6 个。


vk.a = Pairing.G1Point(uint256(0x1936c240636390dc823e3a728e94b208eb53c6756d81da57ec3425e05d43ac10), uint256(0x2d70ff78e8216bf29d58923a686d9738278b8ce2fd822e197c85b09286d15566));
vk.b = Pairing.G2Point([uint256(0x2b4daf047abe2e7f0b311118c1b963b63695dc0d769cea78849604434de055bf), uint256(0x29c13ecb6f33dbc4b3b8a02e2e255511ce4c26a8a2f299efcc94caf2de4fce00)], [uint256(0x1da9020008df7f549751f8a251af3b2dc4a2ad3e0870de54acaedd9fc1b47e17), uint256(0x25ea0d7e2b29de431b86a943db30dbf4d98f68df9ca8a9628d14d1591e817d90)]);
vk.gamma = Pairing.G2Point([uint256(0x011016e22ae045444f50fb80f246ec486c7e02af09132cd38c4fcf484983e4f2), uint256(0x00e83c788c2878d1d5eba3ed49b0d81e4c0487dedc3e4d1c2baab5833785b62f)], [uint256(0x05eb89e741ed5b5d611cebf92d1ed02cd6f3311089f0d400df7d9ced5a48fd41), uint256(0x132a90a3b0d369ccd66e2a5ba04a935e44d8ad5dca93a76bba592a578130a911)]);
vk.delta = Pairing.G2Point([uint256(0x065f6a3323a2abffd621fc263f348eb914904b68d5897729ae34a6b9d33f0852), uint256(0x0c3b60f59d3bd50328a04c0ff6d979199685d0526f89f6ac29d6174ce24707a2)], [uint256(0x26e7ebce2b44efef6b6315938e33f0a8ecc82dbad635c9efa681ed85bbb59982), uint256(0x12e0f3721230a0f38f6c9913048d5230fd2615ef3ff7f6ee4b20dfe0bdea1a86)]);
//vk.gamma_abc = new Pairing.G1Point[](520);
vk.gamma_abc[0] = Pairing.G1Point(uint256(0x196af2b7293f4166f93674ac9a094d1d280285ee936d12c0f009d8c0ceb7275c), uint256(0x2d536bc8c9d330f9e10ab4db1210b14c5caa794064a34aeeb92d35a2142e1003));
vk.gamma_abc[1] = Pairing.G1Point(uint256(0x17519a69d3ab06c7376e8b441eaf8abf240bfba37fa92d203a57ee4e7ebcc09a), uint256(0x0afafa533a58968132a300d25f3e2e31efb50713c60dd5e62093eb9ac68947cd));
vk.gamma_abc[2] = Pairing.G1Point(uint256(0x09c5badd7ac47ceadcdc87260b470e1bc173a2e281d0ee2bbe1e998761906a1c), uint256(0x10225903a96deb54a81d5b2fa1f0e19c080ae66e219038c421e61b55abc6e8c2));
vk.gamma_abc[3] = Pairing.G1Point(uint256(0x0d1cb6242e59537351ba89b729849ccf46909b6f4de62d661541dcee62d4ab91), uint256(0x086240d4e29a207011e2ef99d35db84fcc0d85f805e0102ddbbee0d1ca5c814a));
vk.gamma_abc[4] = Pairing.G1Point(uint256(0x004b8d16937ab63656090b905a085f8b4209c1122d12173ed1d8681b4e2e9c2f), uint256(0x194925508ed037169cf95c94716551dbce6aad6c65a44fcccd44280461816e95));
vk.gamma_abc[5] = Pairing.G1Point(uint256(0x0e8d97d12590c0c3854e5a4ba14c802d4a66e6cfda02b950584014341ec261dc), uint256(0x2e8d13c1c8ee7a46f50ad7b74de98eaf4cae13360a537ef3f55998a914255045));
vk.gamma_abc[6] = Pairing.G1Point(uint256(0x16f625a3746225f60ae1d9891196b2baa06f8be90dd738ea1dbeefffb4c62d0c), uint256(0x2de7e064393312d12c372c87ade6b533e2c01ae7e45c0b94b892cf608e52f910));

我希望找到一种简单的方法将此密钥转换为 JSON 格式,因此我想将以下内容添加到上部:

let Pairing = {
     G1Point : (a,b) => {
        return {x:a, y: b};
     },
    G2Point : (a,b) => {
        return {x : a, y : b}
    }
}
let vk = {
    a : {},
    b : {},
    gamma_abc : [],
    delta : {},
};

function uint256(hexNumber){
    let bigNumber = BigInt(hexNumber);
    logger.info('Hex:'+ bigNumber.toString(16)+' to bigInt '+bigNumber);
    return bigNumber.toString(16);
}

标签: javascripthex

解决方案


你也需要转换它BigInt。例如,如果您想将该值存储在数据库中,则需要将其存储为字符串。

var b = "0x1936c240636390dc823e3a728e94b208eb53c6756d81da57ec3425e05d43ac10";

var bigNumb = BigInt(b);

console.log(bigNumb.toString(16));
console.log(bigNumb.toString(10));


推荐阅读