Wie definiert man 2048-Bit-Ganzzahlen für Smart Contracts?

Wie wir wissen, unterstützt Solidity nur 256-Bit große Ganzzahlen. Aber für Krypto-Primitive brauchen wir (manchmal) größere Ganzzahlen, zB 2048-Bit.

Frage : Wie können wir 2048-Bit-Ganzzahlen in einem Smart Contract definieren und einige modulare Operationen mit Ganzzahlen dieser Größe durchführen?

Nun, Sie können ein uint256Array mit 8 Einträgen verwenden.

Antworten (1)

Ich würde versuchen, die Operationen mit einem Array von uint128. Um es einfacher zu machen, sagen wir, wir wollen es für 512-Bit-Ganzzahlen tun:


// 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
}