Skip to content

Spec

Documentation for tests/byzantium/eip196_ec_add_mul/spec.py@ffe48572.

Defines EIP-196 specification constants and functions.

Spec

Parameters from the EIP-196 specification (https://eips.ethereum.org/EIPS/eip-196) with some modifications for readability.

Source code in tests/byzantium/eip196_ec_add_mul/spec.py
class Spec:
    """
    Parameters from the EIP-196 specification (https://eips.ethereum.org/EIPS/eip-196)
    with some modifications for readability.
    """

    # Addresses
    ECADD = Address(0x06)
    ECMUL = Address(0x07)

    # The prime modulus of the BN254 prime field Fp
    P = 0x30644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD47

    # The order of the BN254 G1 group
    N = 0x30644E72E131A029B85045B68181585D2833E84879B9709143E1F593F0000001

    # G1 generator point
    G1 = PointG1(1, 2)

    # The point at infinity in G1
    INF_G1 = PointG1()

    # G1 generator point doubled: [2]G1
    G1x2 = PointG1(
        0x030644E72E131A029B85045B68181585D97816A916871CA8D3C208C16D87CFD3,
        0x15ED738C0E0A7C92E7845F96B2AE9C0A68A6A449E3538FC7FF3EBF7A5A18A2C4,
    )

    # G1 generator point times 2 pow 128: [2**128]G1
    G1x2_128 = PointG1(
        0x13B8FEC4A1EB2C7E3CCC07061AD516277C3BBE57BD4A302012B58A517F6437A4,
        0x224D978B5763831DFF16CE9B2C42222684835FEDFC70FFEC005789BB0C10DE36,
    )

    # G1 generator point times 2 pow 256 minus 1: [2**256-1]G1
    G1x2_256_1 = PointG1(
        0x2F588CFFE99DB877A4434B598AB28F81E0522910EA52B45F0ADAA772B2D5D352,
        0x12F42FA8FD34FB1B33D8C6A718B6590198389B26FC9D8808D971F8B009777A97,
    )

    # G1 generator times nine: [9]G1
    G1x9 = PointG1(
        0x39730EA8DFF1254C0FEE9C0EA777D29A9C710B7E616683F194F18C43B43B869,
        0x73A5FFCC6FC7A28C30723D6E58CE577356982D65B833A5A5C15BF9024B43D98,
    )

    # Example point P
    P1 = PointG1(
        0x17C139DF0EFEE0F766BC0204762B774362E4DED88953A39CE849A8A7FA163FA9,
        0x01E0559BACB160664764A357AF8A9FE70BAA9258E0B959273FFC5718C6D4CC7C,
    )

    # Example point Q
    Q1 = PointG1(
        0x039730EA8DFF1254C0FEE9C0EA777D29A9C710B7E616683F194F18C43B43B869,
        0x073A5FFCC6FC7A28C30723D6E58CE577356982D65B833A5A5C15BF9024B43D98,
    )

    # Example point R = P + Q
    R1 = PointG1(
        0x15BF2BB17880144B5D1CD2B1F46EFF9D617BFFD1CA57C37FB5A49BD84E53CF66,
        0x049C797F9CE0D17083DEB32B5E36F2EA2A212EE036598DD7624C168993D1355F,
    )

    # Point taken from legacy Ethereum BN256 ecMul precompile tests
    T1 = PointG1(
        0x1A87B0584CE92F4593D161480614F2989035225609F08058CCFA3D0F940FEBE3,
        0x1A2F3C951F6DADCC7EE9007DFF81504B0FCD6D7CF59996EFDC33D92BF7F9F8F6,
    )
    T1x2 = PointG1(
        0x3D64E49EBB3C56C99E0769C1833879C9B86EAD23945E1E7477CBD057E961C50,
        0xD6840B39F8C2FEFE0ECED3E7D210B830F50831E756F1CC9039AF65DC292E6D0,
    )
    T1x9 = PointG1(
        0x1DBAD7D39DBC56379F78FAC1BCA147DC8E66DE1B9D183C7B167351BFE0AEAB74,
        0x2CD757D51289CD8DBD0ACF9E673AD67D0F0A89F912AF47ED1BE53664F5692575,
    )
    T1x2_128 = PointG1(
        0x1051ACB0700EC6D42A88215852D582EFBAEF31529B6FCBC3277B5C1B300F5CF0,
        0x135B2394BB45AB04B8BD7611BD2DFE1DE6A4E6E2CCEA1EA1955F577CD66AF85B,
    )
    T1x2_256_1 = PointG1(
        0x2CDE5879BA6F13C0B5AA4EF627F159A3347DF9722EFCE88A9AFBB20B763B4C41,
        0x1AA7E43076F6AEE272755A7F9B84832E71559BA0D2E0B17D5F9F01755E5B0D11,
    )

    # Sample point S1 from legacy stZeroKnowledge tests
    S1 = PointG1(
        0x0F25929BCB43D5A57391564615C9E70A992B10EAFA4DB109709649CF48C50DD2,
        0x16DA2F5CB6BE7A0AA72C440C53C9BBDFEC6C36C7D515536431B3A865468ACBBA,
    )

    # S1 doubled: [2]S1
    S1x2 = PointG1(
        0x1DE49A4B0233273BBA8146AF82042D004F2085EC982397DB0D97DA17204CC286,
        0x0217327FFC463919BEF80CC166D09C6172639D8589799928761BCD9F22C903D4,
    )

    # S1 + S1x2 = [3]S1
    S1x3 = PointG1(
        0x1F4D1D80177B1377743D1901F70D7389BE7F7A35A35BFD234A8AAEE615B88C49,
        0x018683193AE021A2F8920FED186CDE5D9B1365116865281CCF884C1F28B1DF8F,
    )

    # S1 + G1
    S1_PLUS_G1 = PointG1(
        0x059A381FEC09E29448A58AE8905F41D1EB8FF0ED755AA0F827821AEFDE02EC7D,
        0x269D2516BF8C4F5798CC1267162E59ADD561E5537A328FE0F28A252FA287A72A,
    )

    # Sample point used by the legacy pointMulAdd2 tests
    SAMPLE_G1 = PointG1(
        0x0CCBEC17235F5B9CC5E42F3DF6364A76ECDD0101DDDA8FC5DC0BA0B59C0E5628,
        0x069EF5E376C0A1EA82F9DFC2E0001A7F385D655EEF9A6F976C7A5D2C493EA3AD,
    )

    # Invalid point: S1 with a different x coordinate (not on curve)
    S1_INVALID = PointG1(
        0x0F25919BCB43D5A57391564615C9E70A992B10EAFA4DB109709649CF48C50DD2,
        0x16DA2F5CB6BE7A0AA72C440C53C9BBDFEC6C36C7D515536431B3A865468ACBBA,
    )