Os contratos pré-compilados são um método de compromisso usado no EVM para fornecer funções de biblioteca mais complexas (geralmente usadas para operações complexas, como criptografia e hash), e também podem ser entendidas como um contrato especial que não é adequado para escrever opcodes. Eles são adequados para contratos que são simples, mas invocados com frequência, ou contratos que são logicamente fixos, mas computacionalmente intensivos. Os contratos pré-compilados são implementados usando o código do cliente do nó e, como não exigem um EVM, são executados rapidamente. Também é mais barato para o desenvolvedor do que usar funções executadas diretamente no EVM.
Como pode ser visto no código a seguir, a função run no contrato evm.go tem duas ramificações: a primeira ramificação é instanciar o parâmetro de índice por meio do índice pré-compilado para especificar o contrato pré-compilado e a segunda ramificação é especificar o pré-compilado contract se não for um contrato pré-compilado Esse evm será chamado.
// run executa o contrato fornecido e cuida da execução de pré-compilações com um fallback para o interpretador de código de byte.
func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) {
if contract.CodeAddr != nil {
pré-compila:= PrecompiledContractsHomestead
if evm.ChainConfig().IsByzantium(evm.BlockNumber) {
precompiles = PrecompiledContractsByzantium
}
if p := pré-compila[*contract.CodeAddr]; p != nil {
return RunPrecompiledContract(p, entrada, contrato)
}
}
for _, interpreter := range evm.interpreters {
if interpreter.CanRun(contract.Code) {
if evm.interpreter != interpreter {
// Certifique-se de que o ponteiro do interpretador está definido para trás
// ao seu valor atual ao retornar.
defer func(i Interpretador) {
evm.interpreter = i
}(evm.interpreter)
evm.interpreter = interpretador
}
return interpreter.Run(contract, input, readOnly)
}
}
return nil, ErrNoCompatibleInterpreter
}
Se expressa graficamente, a lógica específica é a seguinte:
Onde está o gargalo do contrato pré-compilado?
Atualmente, a Ethereum possui oito contratos pré-compilados:
ECRecover - Recupere o endereço correspondente através da assinatura
SHA256 - Calcula hash SHA256
RIPEMD160 - Calcula o hash RIPEMD160
Identity - retorna o valor original dos dados de entrada
ModExp - Executa a Exponenciação do Módulo
ECAdd - Adição de ponto de curva elíptica
ECMul - Multiplicação de Pontos de Curvas Elípticas
ECPairing - operação de emparelhamento, verificando os pontos da curva elíptica
Você pode ver que do primeiro ao quarto contratos pré-compilados fornecem assinatura básica, hash e outras funções de criptografia, e do quinto ao oitavo fornecem operações de curva elíptica, que estão relacionadas ao zk-snark.
Portanto, a questão é: por que a pré-compilação do Ethereum suporta apenas oito contratos pré-compilados? Os contratos pré-compilados não reduzem o consumo de gás? E por que não implantar diretamente o ECS (a estrutura de todo o jogo da cadeia) no contrato pré-compilado do Ethereum?
Na verdade, existem três razões principais:
A dependência excessiva de contratos pré-compilados reduzirá o grau de descentralização de toda a plataforma:
Em primeiro lugar, o código do contrato pré-compilado precisa ser integrado ao código do nó cliente, o que aumenta a complexidade do cliente. Em segundo lugar, os nós de verificação podem filtrar o cálculo de contratos pré-compilados por motivos de segurança, portanto, a maioria das solicitações de contratos pré-compilados são concluídas por nós completos. Atualmente, existem apenas 4.000-6.000 nós completos Ethereum no mundo e existem 500.000 verificações nodes, que é de fato muito mais centralizado do que contratos não pré-compilados.
A adição e modificação de contratos pré-compilados requerem atualizações de hard fork, que não são fáceis de evoluir de forma flexível.
O suporte de contratos pré-compilados requer o processo EIP.Por exemplo: EIP-196 adiciona dois contratos pré-compilados, ECADD() e ECMUL(), na curva alt_bn128. EIP-197 adiciona a função Pairing na curva alt_bn128. Basicamente, é disponibilizar privacidade no Ethereum para suporte, e todo o processo EIP é longo e elegante, e esperar que o EIP passe não é um problema realista.
É difícil interagir e combinar contratos pré-compilados e a escalabilidade é ruim.
Isso não é muito para explicar, é muito intuitivo.
Qual é o papel do contrato pré-compilado em todo o jogo da cadeia?
Os contratos pré-compilados ignoram o EVM e são executados diretamente através dos nós, o que pode melhorar a eficiência da computação, mas ao mesmo tempo reduz o grau de descentralização de toda a cadeia. A pré-compilação da lógica principal de jogos usados com frequência pode otimizar o desempenho desses jogos. Diferentes tipos de jogos têm diferentes lógicas de chave. Portanto, para a cadeia dedicada de um determinado tipo de jogo, seu design pré-compilado pode otimizar muito as necessidades desse tipo de jogo. Durante o processo de iteração do jogo, a combinação de contrato pré-compilada mais eficiente será gradualmente otimizada.
Ver original
Esta página pode conter conteúdo de terceiros, que é fornecido apenas para fins informativos (não para representações/garantias) e não deve ser considerada como um endosso de suas opiniões pela Gate nem como aconselhamento financeiro ou profissional. Consulte a Isenção de responsabilidade para obter detalhes.
Jogo Full Chain 101: Contratos pré-compilados
**O que é um contrato pré-compilado? **
Os contratos pré-compilados são um método de compromisso usado no EVM para fornecer funções de biblioteca mais complexas (geralmente usadas para operações complexas, como criptografia e hash), e também podem ser entendidas como um contrato especial que não é adequado para escrever opcodes. Eles são adequados para contratos que são simples, mas invocados com frequência, ou contratos que são logicamente fixos, mas computacionalmente intensivos. Os contratos pré-compilados são implementados usando o código do cliente do nó e, como não exigem um EVM, são executados rapidamente. Também é mais barato para o desenvolvedor do que usar funções executadas diretamente no EVM.
Como pode ser visto no código a seguir, a função run no contrato evm.go tem duas ramificações: a primeira ramificação é instanciar o parâmetro de índice por meio do índice pré-compilado para especificar o contrato pré-compilado e a segunda ramificação é especificar o pré-compilado contract se não for um contrato pré-compilado Esse evm será chamado.
// run executa o contrato fornecido e cuida da execução de pré-compilações com um fallback para o interpretador de código de byte. func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) { if contract.CodeAddr != nil { pré-compila:= PrecompiledContractsHomestead if evm.ChainConfig().IsByzantium(evm.BlockNumber) { precompiles = PrecompiledContractsByzantium } if p := pré-compila[*contract.CodeAddr]; p != nil { return RunPrecompiledContract(p, entrada, contrato) } } for _, interpreter := range evm.interpreters { if interpreter.CanRun(contract.Code) { if evm.interpreter != interpreter { // Certifique-se de que o ponteiro do interpretador está definido para trás // ao seu valor atual ao retornar. defer func(i Interpretador) { evm.interpreter = i }(evm.interpreter) evm.interpreter = interpretador } return interpreter.Run(contract, input, readOnly) } } return nil, ErrNoCompatibleInterpreter }
Se expressa graficamente, a lógica específica é a seguinte:
Onde está o gargalo do contrato pré-compilado?
Atualmente, a Ethereum possui oito contratos pré-compilados:
Você pode ver que do primeiro ao quarto contratos pré-compilados fornecem assinatura básica, hash e outras funções de criptografia, e do quinto ao oitavo fornecem operações de curva elíptica, que estão relacionadas ao zk-snark.
Portanto, a questão é: por que a pré-compilação do Ethereum suporta apenas oito contratos pré-compilados? Os contratos pré-compilados não reduzem o consumo de gás? E por que não implantar diretamente o ECS (a estrutura de todo o jogo da cadeia) no contrato pré-compilado do Ethereum?
Na verdade, existem três razões principais:
Em primeiro lugar, o código do contrato pré-compilado precisa ser integrado ao código do nó cliente, o que aumenta a complexidade do cliente. Em segundo lugar, os nós de verificação podem filtrar o cálculo de contratos pré-compilados por motivos de segurança, portanto, a maioria das solicitações de contratos pré-compilados são concluídas por nós completos. Atualmente, existem apenas 4.000-6.000 nós completos Ethereum no mundo e existem 500.000 verificações nodes, que é de fato muito mais centralizado do que contratos não pré-compilados.
O suporte de contratos pré-compilados requer o processo EIP.Por exemplo: EIP-196 adiciona dois contratos pré-compilados, ECADD() e ECMUL(), na curva alt_bn128. EIP-197 adiciona a função Pairing na curva alt_bn128. Basicamente, é disponibilizar privacidade no Ethereum para suporte, e todo o processo EIP é longo e elegante, e esperar que o EIP passe não é um problema realista.
Isso não é muito para explicar, é muito intuitivo.
Qual é o papel do contrato pré-compilado em todo o jogo da cadeia?
Os contratos pré-compilados ignoram o EVM e são executados diretamente através dos nós, o que pode melhorar a eficiência da computação, mas ao mesmo tempo reduz o grau de descentralização de toda a cadeia. A pré-compilação da lógica principal de jogos usados com frequência pode otimizar o desempenho desses jogos. Diferentes tipos de jogos têm diferentes lógicas de chave. Portanto, para a cadeia dedicada de um determinado tipo de jogo, seu design pré-compilado pode otimizar muito as necessidades desse tipo de jogo. Durante o processo de iteração do jogo, a combinação de contrato pré-compilada mais eficiente será gradualmente otimizada.