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?
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
}
gute Stimmung
uint256
Array mit 8 Einträgen verwenden.