Как определить 2048-битные целые числа в смарт-контрактах?

Как мы знаем, Solidity поддерживает только 256-битные большие целые числа. Но для криптопримитивов (иногда) нам нужны большие целые числа, например 2048-битные.

Вопрос : как мы можем определить 2048-битные целые числа в смарт-контракте и выполнять некоторые модульные операции над целыми числами такого размера?

Ну, вы можете использовать uint256массив с 8 элементами.

Ответы (1)

Я бы попытался воссоздать операции с массивом uint128. Чтобы упростить, допустим, мы хотим сделать это для 512-битных целых чисел:


// With the large number = num[0] + 2^128 * num[1] + 2^256 * num[2] + 2^384 * num[3]
function add(uint128[4] num1, uint128[4] num2) public pure returns(uint128[4] sum) { 
    uint256[4] memory intermediaries;
    intermediaries[0] = (uint256) (num1[0]) + (uint256) (num2[0]);
    intermediaries[1] = (uint256) (num1[1]) + (uint256) (num2[1]);
    intermediaries[2] = (uint256) (num1[2]) + (uint256) (num2[2]);
    intermediaries[3] = (uint256) (num1[3]) + (uint256) (num2[3]);
    uint256 shifter = 2**128;
    uint256 lowerMask = shifter - 1;
    sum[0] = (uint128) (intermediaries[0] & (lowerMask)); // To get the lower part
    sum[1] = (uint128) (intermediaries[1] & (lowerMask) + intermediaries[0] / shifter);
    sum[2] = (uint128) (intermediaries[2] & (lowerMask) + intermediaries[1] / shifter);
    sum[3] = (uint128) (intermediaries[3] & (lowerMask) + intermediaries[2] / shifter);
    // Yes, intermediaries[3] / 2^128 is lost
}