預編譯合約
預編譯合約是 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?