預編譯合約

預編譯合約是 EVM 中使用的一種折衷方案,用於提供更複雜的庫函數(通常用於復雜的操作,如加密、哈希等),不適合寫在操作碼中。 它們適用於簡單但經常調用的合約,或者邏輯固定但計算量大的合約。 預編譯合約是在客戶端使用客戶端代碼實現的,因為它們不需要 EVM,所以運行速度很快。 對於開發人員而言,與使用直接在 EVM 中運行的函數相比,它的成本也更低。

MAP 預編譯合約

為了簡化輕客戶端的開發,區塊鏈級別支持各種密碼學原語,並通過預編譯合約向 EVM 公開。

MAP 中繼鏈將實施預編譯合約以支持:

Ecrecover

  • 地址 0x0000000000000000000000000000000000000001

    ecrecover 作為原生合約實現。

  func (c *ecrecover) Run(evm *EVM, contract *Contract, input []byte) ([]byte, error) {
  const ecRecoverInputLength = 128
  
      input = common.RightPadBytes(input, ecRecoverInputLength)
      // "input" is (hash, v, r, s), each 32 bytes
      // but for ecrecover we want (r, s, v)
  
      r := new(big.Int).SetBytes(input[64:96])
      s := new(big.Int).SetBytes(input[96:128])
      v := input[63] - 27
  
      // tighter sig s values input homestead only apply to tx sigs
      if !allZero(input[32:63]) || !crypto.ValidateSignatureValues(v, r, s, false) {
          return nil, nil
      }
      // We must make sure not to modify the 'input', so placing the 'v' along with
      // the signature needs to be done on a new allocation
      sig := make([]byte, 65)
      copy(sig, input[64:128])
      sig[64] = v
      // v needs to be at the end for libsecp256k1
      pubKey, err := crypto.Ecrecover(input[:32], sig)
      // make sure the public key is a valid one
      if err != nil {
          return nil, nil
      }
  
      // the first byte of pubkey is bitcoin heritage
      return common.LeftPadBytes(crypto.Keccak256(pubKey[1:])[12:], 32), nil
  }

sha256hash

  • 地址 0x0000000000000000000000000000000000000002

SHA256 作為本地合約實施。

dataCopy

  • 地址 0x0000000000000000000000000000000000000004

作為本機合約實現的數據副本。

bigModExp

  • 地址 0x0000000000000000000000000000000000000005

    bigModExp 實現原生大整數指數模運算。

bn256AddIstanbul

  • 地址 0x0000000000000000000000000000000000000006

bn256Add 實現了一個符合伊斯坦布爾共識規則的原生橢圓曲線點加法。

bn256ScalarMulIstanbul

  • 地址 0x0000000000000000000000000000000000000007

bn256ScalarMuIstanbul 實現了一個符合伊斯坦布爾共識規則的原生橢圓曲線標量乘法。

bn256PairingIstanbul

  • Address 0x0000000000000000000000000000000000000008

bn256PairingIstanbul 實現bn256曲線的配對預編譯 符合伊斯坦布爾共識規則。

儲存

  • Address 0x000068656164657273746F726541646472657373

    執行 atlas header 儲存合約

驗證

  • 地址 0x0000000000747856657269667941646472657373

    RunTxVerify execute atlas tx verify contract

轉移

  • 地址 0x00000000000000000000000000000000000000fd

    使 Atlas Gold ERC20 兼容的本地傳輸合約。

fractionMulExp

  • 地址 0x00000000000000000000000000000000000000fc

    計算 a * (b ^ exponent) 到精度的小數位,其中 a 和 b 是分數

佔有證明

  • 地址 0x00000000000000000000000000000000000000fb

    驗證validator的地址、publicKey、g1publickey、signature

getValidator 獲取驗證者

  • 地址 0x00000000000000000000000000000000000000fa

    返回簽署給定的、可能未密封的塊號所需的驗證器。 如果這個塊是一個紀元中的最後一個塊,請注意,這可能意味著這些驗證器中的一個或多個可能不再被選為後續塊。 警告:驗證器集總是從規範鏈構建,因此如果引擎知道總難度更高的鏈,則此預編譯是未定義的。

numberValidators 驗證者數量

  • 地址 0x00000000000000000000000000000000000000f9

    返回簽署此當前(可能未密封)塊所需的驗證者數量。 如果這個塊是一個紀元中的最後一個塊,請注意,這可能意味著這些驗證者中的一個或多個可能不再被選為後續塊。

epochSize 紀元大小

  • 地址 0x00000000000000000000000000000000000000f8

    返回epochSize

blockNumberFromHeader

  • Address 0x00000000000000000000000000000000000000f7

返回blockNumber from header

hashHeader

  • Address 0x00000000000000000000000000000000000000f6

    返回 the hashHeader from header

getParentSealBitmap

  • Address 0x00000000000000000000000000000000000000F5

從鏈中過去區塊的父印章返回簽名者位圖signer bitmap。 請求的父印章必須在當前塊號的 4 個紀元epochs內發生。

getVerifiedSealBitmap

  • Address 0x00000000000000000000000000000000000000F4

    返回 the extra.AggregatedSeal.Bitmap from header

ed25519Verify

  • Address 0x00000000000000000000000000000000000000f3

ed25519Verify 實現了原生的 Ed25519 簽名驗證。

BLS12_G1ADD

  • 地址 0x000000000000000000000000000000000000000a

實現 EIP-2537 G1Add 預編譯。

> G1 加法調用需要“256”字節作為輸入,該輸入被解釋為兩個 G1 點(每個“128”字節)的字節串聯。

> 輸出是加法運算結果的編碼 - 單個 G1 點(128 字節)。

BLS12_G1MUL

  • 地址 0x000000000000000000000000000000000000000b

實現 EIP-2537 G1Mul 預編譯。

> G1 乘法調用需要“160”字節作為輸入,該輸入被解釋為 G1 點編碼(“128”字節)和標量值編碼(“32”字節)的字節串聯。

> 輸出是乘法運算結果的編碼 - 單個 G1 點(128 字節)。

BLS12_G1MULTIEXP

  • 地址 0x000000000000000000000000000000000000000c

實現 EIP-2537 G1MultiExp 預編譯。

> G1 乘法調用期望“160*k”字節作為輸入,該輸入被解釋為“k”切片的字節串聯,每個切片都是 G1 點編碼(“128”字節)和標量值編碼(“ 32` 字節)。

> 輸出是多重指數運算結果的編碼 - 單個 G1 點(128 字節)。

BLS12_G2ADD

  • Address 0x000000000000000000000000000000000000000d

    預編譯 EIP-2537 G2Add

> G2 加法調用需要“512”字節作為輸入,該輸入被解釋為兩個 G2 點(每個“256”字節)的字節串聯。

> 輸出是加法運算結果的編碼 - 單個 G2 點(256 字節)。

BLS12_G2MUL

  • Address 0x000000000000000000000000000000000000000e

    預編譯 EIP-2537 G2MUL 邏輯.

> G2 乘法調用需要“288”字節作為輸入,該輸入被解釋為 G2 點編碼(“256”字節)和標量值編碼(“32”字節)的字節串聯。

> 輸出是乘法運算結果的編碼 - 單個 G2 點(256 字節)。

BLS12_G2MULTIEXP

  • Address 0x000000000000000000000000000000000000000f

    預編譯 EIP-2537 G2MultiExp 邏輯

> G2 乘法調用期望將“288*k”字節作為輸入,該輸入被解釋為“k”切片的字節串聯,每個切片都是 G2 點(“256”字節)編碼和標量值編碼的字節串聯 (32 字節)。

> 輸出是多重指數運算結果的編碼 - 單個 G2 點(256 字節)。

BLS12_PAIRING

  • Address 0x0000000000000000000000000000000000000010

    預編譯 EIP-2537 Pairing 邏輯.

> 配對調用需要 384*k 字節作為輸入,被解釋為 k 切片的字節連接。 每個切片具有以下結構:

> - 128 字節的 G1 點編碼

> - 256 字節的 G2 點編碼

> 輸出是一個“32”字節,如果配對結果等於配對目標字段中的乘法標識,最後一個字節為“0x01”,否則為“0x00”

>(分別相當於 Solidity 值 uint256(1)uin256(0) 的 Big Endian 編碼)。

BLS12_MAP_FP_TO_G1

  • Address 0x0000000000000000000000000000000000000011

預變異 EIP-2537 Map_To_G1

> 字段到曲線調用需要“64”字節和一個被解釋為基本字段元素的輸入。

> 此調用的輸出是 128 個字節,並且是遵循各自編碼規則的 G1 點。

BLS12_MAP_FP2_TO_G2

  • Address 0x0000000000000000000000000000000000000012

    預編譯 EIP-2537 Map_FP2_TO_G2 邏輯

> 場到曲線調用需要“128”字節和一個輸入,該輸入被解釋為二次擴展場的一個元素。

> 此調用的輸出是 256 字節,並且是遵循各自編碼規則的 G2 點。

Last updated

Was this helpful?