Programas

No Solana, um contrato inteligente é chamado de programa. Um programa é uma conta sem estado que contém código executável. Este código é organizado em funções chamadas instruções. Os usuários interagem com um programa enviando uma transação contendo uma ou mais instruções. Uma transação pode incluir instruções de múltiplos programas.

Quando um programa é implantado, o Solana usa LLVM para compilá-lo em formato executável e vinculável (ELF). O arquivo ELF contém o binário do programa no Formato de Bytecode Solana (sBPF) e é salvo na cadeia em uma conta executável.

sBPF é a versão personalizada do Solana do bytecode eBPF.

Escrever programas

A maioria dos programas são escritos em Rust, com duas abordagens comuns de desenvolvimento:

  • Anchor: Anchor é um framework projetado para desenvolvimento rápido e fácil no Solana. Ele usa macros Rust para reduzir código repetitivo—tornando-o ótimo para iniciantes.
  • Rust Nativo: Escreva programas em Rust sem utilizar nenhum framework. Esta abordagem oferece mais flexibilidade, mas vem com maior complexidade.

Atualizar programas

Para modificar um programa existente, uma conta deve ser designada como a autoridade de atualização. (Tipicamente a mesma conta que originalmente implantou o programa.) Se a autoridade de atualização for revogada e definida como None, o programa não poderá mais ser atualizado.

Verificar programas

O Solana suporta builds verificáveis, que permitem aos usuários verificar se o código on-chain de um programa corresponde ao seu código-fonte público. O framework Anchor fornece suporte integrado para criar uma build verificável.

Para verificar se um programa existente está verificado, pesquise seu ID de programa no Solana Explorer. Alternativamente, você pode usar o CLI de Build Verificável do Solana da Ellipsis Labs, para verificar independentemente programas on-chain.

Programas integrados

O System Program

O System Program é a única conta que pode criar novas contas. Por padrão, todas as novas contas são de propriedade do System Program, embora muitas sejam atribuídas a um novo proprietário após a criação. O System Program executa as seguintes funções principais:

FunçãoDescrição
Criação de Nova ContaApenas o System Program pode criar novas contas.
Alocação de EspaçoDefine a capacidade em bytes para o campo de dados de cada conta.
Atribuir Propriedade do ProgramaUma vez que o System Program cria uma conta, ele pode reatribuir o proprietário do programa designado para uma conta de programa diferente. É assim que programas personalizados assumem a propriedade de novas contas criadas pelo System Program.
Transferir SOLTransfere lamports (SOL) de Contas do Sistema para outras contas.

O endereço do System Program é 11111111111111111111111111111111.

Programas carregadores

Todo programa é de propriedade de outro—seu carregador. Os carregadores são usados para implantar, reimplantar, atualizar ou fechar programas. Eles também são usados para finalizar um programa e transferir a autoridade do programa.

Programas carregadores às vezes são chamados de 'BPF Loaders'.

Atualmente existem cinco programas carregadores, como mostrado na tabela abaixo.

CarregadorID do ProgramaNotasLink de Instruções
nativeNativeLoader1111111111111111111111111111111Possui os outros quatro carregadores
v1BPFLoader1111111111111111111111111111111111Instruções de gerenciamento estão desativadas, mas os programas ainda executam
v2BPFLoader2111111111111111111111111111111111Instruções de gerenciamento estão desativadas, mas os programas ainda executamInstruções
v3BPFLoaderUpgradeab1e11111111111111111111111Programas podem ser atualizados após a implantação. O executável do programa é armazenado em uma conta de dados de programa separadaInstruções
v4LoaderV411111111111111111111111111111111111Em desenvolvimento (não lançado)Instruções

Programas implantados com loader-v3 ou loader-v4 podem ser modificáveis após a implantação, conforme determinado por sua autoridade de atualização.

Quando um novo programa é implantado, a versão mais recente do loader será usada por padrão.

Programas pré-compilados

Além dos programas de carregamento, a Solana fornece os seguintes programas pré-compilados.

Verificar assinatura ed25519

O programa ed25519 é usado para verificar uma ou mais assinaturas ed25519.

ProgramaID do ProgramaDescriçãoInstruções
Programa Ed25519Ed25519SigVerify111111111111111111111111111Verifica assinaturas ed25519. Se alguma assinatura falhar, um erro é retornado.Instruções

O programa ed25519 processa uma instrução. O primeiro u8 da instrução contém uma contagem do número de assinaturas a serem verificadas, seguido por um único byte de preenchimento. Depois disso, a seguinte estrutura é serializada, uma para cada assinatura a ser verificada.

Ed25519SignatureOffsets
struct Ed25519SignatureOffsets {
signature_offset: u16, // offset to ed25519 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to public key of 32 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}
Signature verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
instruction_index = ed25519_signature_instruction_index != u16::MAX ? ed25519_signature_instruction_index : current_instruction;
signature = instructions[instruction_index].data[ed25519_signature_offset..ed25519_signature_offset + 64]
instruction_index = ed25519_pubkey_instruction_index != u16::MAX ? ed25519_pubkey_instruction_index : current_instruction;
pubkey = instructions[instruction_index].data[ed25519_pubkey_offset..ed25519_pubkey_offset + 32]
instruction_index = ed25519_message_instruction_index != u16::MAX ? ed25519_message_instruction_index : current_instruction;
message = instructions[instruction_index].data[ed25519_message_data_offset..ed25519_message_data_offset + ed25519_message_data_size]
if pubkey.verify(signature, message) != Success {
return Error
}
}
return Success
}

Verificar recuperação secp256k1

O programa secp256k1 é usado para verificar operações de recuperação de chave pública secp256k1.

ProgramaID do ProgramaDescriçãoInstruções
Programa Secp256k1KeccakSecp256k11111111111111111111111111111Verifica operações de recuperação de chave pública secp256k1 (ecrecover).Instruções

O programa secp256k1 processa uma instrução. O primeiro byte da instrução contém uma contagem do número de chaves públicas a serem verificadas. Depois disso, a seguinte estrutura é criada uma vez para cada chave pública, então serializada e adicionada aos dados da instrução.

Secp256k1SignatureOffsets
struct Secp256k1SignatureOffsets {
secp_signature_offset: u16, // offset to [signature,recovery_id] of 64+1 bytes
secp_signature_instruction_index: u8, // instruction index to find signature
secp_pubkey_offset: u16, // offset to ethereum_address pubkey of 20 bytes
secp_pubkey_instruction_index: u8, // instruction index to find pubkey
secp_message_data_offset: u16, // offset to start of message data
secp_message_data_size: u16, // size of message data
secp_message_instruction_index: u8, // instruction index to find message data
}
Recovery verification pseudocode
process_instruction() {
for i in 0..count {
// i'th index values referenced:
instructions = &transaction.message().instructions
signature = instructions[secp_signature_instruction_index].data[secp_signature_offset..secp_signature_offset + 64]
recovery_id = instructions[secp_signature_instruction_index].data[secp_signature_offset + 64]
ref_eth_pubkey = instructions[secp_pubkey_instruction_index].data[secp_pubkey_offset..secp_pubkey_offset + 20]
message_hash = keccak256(instructions[secp_message_instruction_index].data[secp_message_data_offset..secp_message_data_offset + secp_message_data_size])
pubkey = ecrecover(signature, recovery_id, message_hash)
eth_pubkey = keccak256(pubkey[1..])[12..]
if eth_pubkey != ref_eth_pubkey {
return Error
}
}
return Success
}

Isso permite que o usuário especifique quaisquer dados de instrução na transação para dados de assinatura e mensagem. Ao especificar uma sysvar de instruções especial, também é possível receber dados da própria transação.

O custo da transação contará o número de assinaturas a verificar multiplicado pelo multiplicador de custo de verificação de assinatura.

O programa secp256r1 é usado para verificar até 8 assinaturas secp256r1.

ProgramaID do ProgramaDescriçãoInstruções
Programa Secp256r1Secp256r1SigVerify1111111111111111111111111Verifica até 8 assinaturas secp256r1. Recebe uma assinatura, chave pública e mensagem. Retorna erro se alguma falhar.Instruções

O programa secp256r1 processa uma instrução. O primeiro instruction data da instrução é uma contagem do número de assinaturas a serem verificadas, seguido por um único byte de preenchimento. Depois disso, a seguinte estrutura é criada para cada assinatura, então serializada e adicionada aos dados da instrução.

Secp256r1SignatureOffsets
struct Secp256r1SignatureOffsets {
signature_offset: u16, // offset to compact secp256r1 signature of 64 bytes
signature_instruction_index: u16, // instruction index to find signature
public_key_offset: u16, // offset to compressed public key of 33 bytes
public_key_instruction_index: u16, // instruction index to find public key
message_data_offset: u16, // offset to start of message data
message_data_size: u16, // size of message data
message_instruction_index: u16, // index of instruction data to get message data
}

Valores S baixos são aplicados para todas as assinaturas para evitar maleabilidade acidental de assinatura.

Signature verification psuedocode
process_instruction() {
if data.len() < SIGNATURE_OFFSETS_START {
return Error
}
num_signatures = data[0] as usize
if num_signatures == 0 || num_signatures > 8 {
return Error
}
expected_data_size = num_signatures * SIGNATURE_OFFSETS_SERIALIZED_SIZE + SIGNATURE_OFFSETS_START
if data.len() < expected_data_size {
return Error
}
for i in 0..num_signatures {
offsets = parse_signature_offsets(data, i)
signature = get_data_slice(data, instruction_datas, offsets.signature_instruction_index, offsets.signature_offset, SIGNATURE_SERIALIZED_SIZE)
if s > half_curve_order {
return Error
}
pubkey = get_data_slice(data, instruction_datas, offsets.public_key_instruction_index, offsets.public_key_offset, COMPRESSED_PUBKEY_SERIALIZED_SIZE)
message = get_data_slice(data, instruction_datas, offsets.message_instruction_index, offsets.message_data_offset, offsets.message_data_size)
if !verify_signature(signature, pubkey, message) {
return Error
}
}
return Success
}

Programas principais

Os programas na lista abaixo fornecem a funcionalidade principal da rede.

ProgramaID do ProgramaDescriçãoInstruções
System11111111111111111111111111111111Criar novas contas, alocar dados de conta, atribuir contas a programas proprietários, transferir lamports de contas pertencentes ao Programa do Sistema e pagar taxas de transaçãoSystemInstruction
VoteVote111111111111111111111111111111111111111Criar e gerenciar contas que rastreiam o estado de votação do validator e recompensasVoteInstruction
StakeStake11111111111111111111111111111111111111Criar e gerenciar contas que representam stake e recompensas para delegações a validatorsStakeInstruction
ConfigConfig1111111111111111111111111111111111111Adicionar dados de configuração à cadeia, seguidos pela lista de chaves públicas que têm permissão para modificá-la. Diferentemente de outros programas, o programa Config não define instruções individuais. Ele tem apenas uma instrução implícita: "store". Seus dados de instrução são um conjunto de chaves que controlam o acesso à conta e aos dados armazenados nelaConfigInstruction
Compute BudgetComputeBudget111111111111111111111111111111Definir limites e preços de unidades de computação para transações, permitindo que os usuários controlem recursos de computação e taxas de priorizaçãoComputeBudgetInstruction
Address Lookup TableAddressLookupTab1e1111111111111111111111111Gerenciar tabelas de consulta de endereços, que permitem que as transações referenciem mais contas do que normalmente caberia na lista de contas da transaçãoProgramInstruction
ZK ElGamal ProofZkE1Gama1Proof11111111111111111111111111111Fornece verificação de prova de conhecimento zero para dados criptografados com ElGamal

Is this page helpful?

Índice

Editar Página

Gerenciado por

© 2025 Fundação Solana.
Todos os direitos reservados.