Como Implantar Localmente as Cadeias de Sub-rede Avalanche para teste: Configuração Manual usando a API P-Chain e a Metamask
Introdução
Para o projeto do meu time, construímos uma ferramenta que exigia a ponte entre blockchains Avalanche em diferentes sub-redes. Para testar nossa implementação, precisávamos de uma maneira de compilar e executar localmente várias cadeias de sub-rede. Encontramos vários problemas ao configurar esse ambiente necessário e compilamos este documento para melhorar a frustração e esclarecer algumas inconsistências na documentação sobre esse tópico.
Acabamos ganhando o melhor hack geral no hackathon CFT Ava Labs. Confira nosso projeto aqui, se você estiver curioso :)
Go! Go! Go!
Em primeiro lugar, você precisa do Go. Instale o Go!
Configurar Validador
Veja como instalar o AvalancheGo para testes locais (baseado em https://docs.avax.network/build/tutorials/nodes-and-staking/run-avalanche-node#download-avalanchego)
Navegue até a pasta raiz do Go, que provavelmente está no diretório do usuário. Clone https://github.com/ava-labs/avalanchego nesse diretório raiz do Go.
Não faça a compilação padrão listada nos documentos, em vez disso, execute o seguinte:
./scripts/build.sh
./build/avalanchego --network-id=local --staking-enabled=false
Isso deve configurar o validador do nó que precisamos. O staking está definido como falso porque não votamos no consenso neste ambiente de teste.
Configurar Sub-rede EVM
Precisamos do plugin para a SubnetEVM configurado localmente para que nossa sub-rede seja executada na máquina virtual (VM) correta.
No mesmo diretório raiz Go em que o avalanchego está, clone https://github.com/ava-labs/subnet-evm. Temos que garantir que esses dois repositórios estejam no mesmo nível de diretório para que os caminhos relativos funcionem nos seguintes scripts, que você deve executar agora:
cd subnet-evm./scripts/build.sh
./build/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy
cp ./build/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy ../avalanchego/build/plugins/
# srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy é o hash id do SubnetEVM
Após esta compilação, devemos reiniciar o validador de nó AvalancheGo para que ele possa suportar o novo plugin VM. Portanto, copie o conteúdo do terminal ativo do nó e execute novamente ./build/avalanchego — network-id=local — staking-enabled=false.
Implantar Sub-rede Localmente
Agora usaremos comandos CURL manuais para configurar nossa sub-rede. Devemos primeiro configurar nosso combo user-pass para nosso nó. De acordo com a documentação oficial:
Cada nó tem um keystore integrado. Os clientes criam usuários no keystore, que atuam como identidades a serem usadas ao interagir com blockchains. Um keystore existe no nível do nó, portanto, se você criar um usuário em um nó, ele existirá apenas nesse nó. No entanto, os usuários podem ser importados e exportados usando esta API.
curl -X POST --data '{
"jsonrpc":"2.0",
"id" :1,
"method" :"keystore.createUser",
"params" :{
"username":"<nome_de_usuario>",
"password":"<senha_segura>"
}
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/keystore
⚠️ Certifique-se de escolher uma senha forte ou você receberá um erro irritante, embora informativo.
"username":"seanyu",
"password":"Strongp@assw0rd"
# Por favor, não me culpe pelo erro de digitação da senha.
💡 Como temos o sinalizador habilitado para validadores definido como falso para nosso nó AvalancheGo, não precisamos conectar o nó como um validador na sub-rede. Este nó que construímos deve lidar automaticamente com todas as transações em nossa rede local.
Encontrei alguns problemas com a documentação oficial ao criar um endereço diretamente usando o método createAddress e recebi um erro em um comando curl createSubnet. Isso ocorre porque não temos fundos suficientes em nosso endereço gerado. Para resolver isso (sem trocadilhos), usaremos o método importKey, que nos fornecerá um endereço que já possui fundos, usando a seguinte chave privada:
PrivateKey-ewoqjP7PxY4yr3iLTpLisriqt94hdyDFNgchSxGGztUrTXtNN
curl -X POST --data '{
"jsonrpc":"2.0",
"id" :1,
"method" :"platform.importKey",
"params" :{
"username": "seanyu",
"password": "Strongp@assw0rd",
"privateKey": "PrivateKey-ewoqjP7PxY4yr3iLTpLisriqt94hdyDFNgchSxGGztUrTXtNN"
}
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P
Anote o endereço da resposta:
P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u
Podemos confirmar que os fundos estão lá com este comando:
curl -X POST --data '{
"jsonrpc":"2.0",
"id" : 1,
"method" :"platform.getBalance",
"params" :{
"address":"P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u"
}
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/bc/P
Agora podemos criar a sub-rede!
curl -X POST --data '{
"jsonrpc": "2.0",
"method": "platform.createSubnet",
"params": {
"controlKeys":["P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u"],
"threshold":1,
"from": ["P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u"],
"changeAddr": "",
"username":"seanyu",
"password":"Strongp@assw0rd"
},
"id": 1
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P
Vamos verificar se nossa sub-rede está funcionando com o seguinte comando CURL
curl -X POST --data '{
"jsonrpc": "2.0",
"method": "platform.getSubnets",
"params": {},
"id": 1
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P
Construa a Blockchain
Vamos gerar o arquivo genesis usando a função buildGenesis neste momento. O arquivo genesis fornece a base para o início da blockchain – basicamente, metadados de configuração para que ela possa começar a ser executada.
curl -X POST --data '{
"jsonrpc": "2.0",
"id": 1,
"method": "subnetevm.buildGenesis",
"params": {
"genesisData": {
"config": {
"chainID": 11111,
"homesteadBlock": 0,
"eip150Block": 0,
"eip150Hash": "0x2086799aeebeae135c246c65021c82b4e15a2c451340993aacfd2751886514f0",
"eip155Block": 0,
"eip158Block": 0,
"byzantiumBlock": 0,
"constantinopleBlock": 0,
"petersburgBlock": 0,
"istanbulBlock": 0,
"muirGlacierBlock": 0,
"subnetEVMTimestamp": 0,
"feeConfig": {
"gasLimit": 8000000,
"targetBlockRate": 2,
"minBaseFee": 13000000000,
"targetGas": 15000000,
"baseFeeChangeDenominator": 36,
"minBlockGasCost": 0,
"maxBlockGasCost": 1000000,
"blockGasCostStep": 200000
},
"allowFeeRecipients": false
},
"alloc": {
"8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC": {
"balance": "333333333333333333333"
}
},
"timestamp": "0x0",
"gasLimit": "0x7A1200",
"difficulty": "0x0",
"mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"number": "0x0",
"gasUsed": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"
}
}
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/vm/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy/rpc
💡 Para fins de informação! Se você deseja implantar duas cadeias de uma só vez e conectá-las à sua Metamask, certifique-se de que o atributo chainId do seu arquivo genesis seja diferente. Ou então pode haver um conflito na assinatura das cadeias que impede que elas sejam adicionadas à Metamask corretamente.
Vamos criar uma blockchain real agora.
vmID neste caso seria o ID de hash mencionado acima, do SubnetEVM
subnetID pode ser encontrado na resposta da chamada do getSubnets
Certifique-se também de alterar o atributo from para o endereço fornecido por importKey. changeAddr também pode ser definido para isso, opcionalmente.
O atributo genesisData deve ser o hash da resposta do comando CURL acima.
curl -X POST --data '{
"jsonrpc": "2.0",
"method": "platform.createBlockchain",
"params" : {
"vmID":"srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy",
"subnetID":"<your subnet id>",
"name":"11111chainid",
"genesisData": "8WigDBVuqFPxoanycxLED2YCVuzjCBoLU244uuorVzGE1rS4GnaQzMWSVJBNUapGrm3L4R4oGEdWZbE8ZNLPD4Lr9xVmU4gdCv3r4vFnx1srnc3g3sDqRUzV9meYmSxHDkTN8wAiYmiQwJemgt9pqKYQjt2LkX8ppKCw2H1VNyzarh7UkvrQxFiEQSxChMy5PjtLFbE6shyLsQyhTcEQuKUA98QDdqxLvV4erJCF5gjtqfcCtwU2yg9mSrfhif1DTAUzUEdYaZFboFXQoPac1Px4wBUNByf2jWZ1ewcjJExEVKC3KstxkTaM5SFcWvfepDy5pQC1d1Qjo6EhTj962oFAQDqwgWcwx998LiroZs4dsgYpXv5GkrY4nS3MuX5bWVr1Msufx6AaAy8BncTroTnHLiEJAjQi3g7A9VLdxJgMsfHeG6FtmD9TYFtYzeoRmsacpfhErAruVuCdU1KYbWBoTpeBEpJndMcETdTojBdSDto8E5FddGBhKzQLuWoaQ6tJJ1WHE511ocY4ELKeChCmB3Kowk8fRC6ueGLxGjdLqPc1srU6MREg6wFSUQ5yFUpgVL3WQHcY627SNmxNEsbVAUMhZMu5FnbHAFLTFvnXuXcUNkCuu4uWjcrwT8x2CJxvtBydLQhwLfNqZ4QvJo7iUZ5fKwyfNn6jQqmp7KGHep4FnoeRFmNcYccziq3EqtUbTrP5ePvZDaZvmmGmrPaMkKvWpUKaXFhK2qQFXRPV5e2kGE5gQFMkn7AMiEsPBJctpEwyW2CvxxPhatJGpvcquc1Z8rfVA1LfQsaMhbhsFFUhMHcFBj56FSTa6MMLQJQ3fkyiFeiAspEvVTFggkfBLN8VQ6YqKmSp2RyuwTNT5QHEPu1TVQTxU2kd8CFXeNmVv9ZihUB4265DW8A7Z31NbgwS1AE61AModZLcic4DgEgHQdKCLMtXDo2gUwJihm7rKSayXy9iMCuPjfcPAf43eyvLKHRru31pCAPhtLFwruiapfDeFv9K7iaMQYA6XP4m8RHYvCHReTn2pMe8ch9YPonkZKcbya2RzN487YLZLGrPPVzDM8RPtg26VkoHbFZ1cybDY9b4FutJmDy3UiPcCP47vxWVD8wix7KPZC2Gh2xHF7YcNJKhmjyt1DFZC2yYGMw14nPmjK2CSPq5pYJZ6ayMZeDLY4nRvzXzpgf9r3ReJJ6Gw4YPdHG6UQPkkVey5hLjbGzYrU1tZxdx4pRrt5hEnEnj5ACoK6anK7QjxXpz5AMxqtey66XN5wLET13RWx1qkn2iLR3yMfvEG6i2MzydSVvTPRsKnt6ZZd7Xm1gYwq3GSvKMYWo4uVNJvPSN4YuwXGUoEEUGzQpETCVyMajP1GxQZ9t3JC1gQx3ScMV1siBAvYeGyvoXgqzGiyLHRx757R1w2qTXYVuCqPpHGqspPGVNPdsxGezQUB71yzFAbcaHYLnBBtfwUmmEmhfqCrGSBVhdc7X9DBJs3xruK9n6texiYGW59ezfPRHmjpRCF8DwZuc4BX8UyefSQeFX89MGp8ZhkmQAykmwwLjZrb7WT3UYEWwo6kwAsmxMiXdvhLFyh4E7p7s21YPd6YTu1D7kAnC8kckyVUMaMhRm1vPdyr4TWLS9yx7nj18BDoGxLg4hTF8VfvSLNmGwgoT6qnVEo3eMNSpA7t7zMsuDKE4BUYmgqm7zhsd3QCBT5ksNJ7LD3zfuLLbZK6H8DVfcVPmsJhzJPKhPC9K",
"encoding": "cb58",
"from": ["P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u"],
"changeAddr": "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u",
"username":"seanyu",
"password":"Strongp@assw0rd"
},
"id": 1
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P
Verifique se a blockchain está funcionando corretamente:
curl -X POST --data '{
"jsonrpc": "2.0",
"method": "platform.getBlockchains",
"params": {},
"id": 1
}' -H 'content-type:application/json;' 127.0.0.1:9650/ext/P
Excelente! Agora, criamos nossa primeira cadeia de sub-redes implantada localmente.
Para conectar várias cadeias locais à Metamask, teremos que executar os dois comandos CURL anteriores novamente, mas alterar o chainId para algo diferente de antes, o que geraria um novo hash genesisData. Use isso como o novo campo genesisData para a nova cadeia. Dessa forma, criamos várias cadeias que não possuem chainId's conflitantes de assinaturas, atendendo aos requisitos de rede da Metamask.
💡 Se você deseja implantar duas ou mais cadeias em diferentes sub-redes, isso também é bem fácil de fazer. Basta executar novamente o método createSubnet (você pode reutilizar as mesmas controlKeys) e usar o ID dessa resposta como o subnetID da nova cadeia para vincular essa cadeia à nova sub-rede.
Conectando as Cadeias à Metamask
Clique no ícone de rede à esquerda do ícone do perfil e depois em “Adicionar rede”
Chegando ao formulário “Adicionar rede”, precisamos do ID da blockchain correspondente (dica: getBlockchains)
Coloque o que quiser para o nome da rede e o símbolo da moeda.
O URL RPC terá o seguinte formato:
# observe que o URL é HTTP e não HTTPS
<http://127.0.0.1:9650/ext/bc/{blockchainId}/rpc>
Depois de formatar e inserir o URL corretamente, insira '0x' no chainId e a Metamask deve sugerir o chainId correto a ser inserido.
Depois disso, clique em salvar e você terá importado sua rede local!
Obter Fundos
Você provavelmente notou que tem 0 fundos agora em suas carteiras da cadeia de teste. Para depositar dinheiro em sua conta, clique no ícone do perfil no canto superior direito e use o recurso de importação descrito abaixo.
Digite a string da chave privada (retirada diretamente do repositório AvalancheGo): 56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027
Você deve então ver o dinheiro fluir em sua conta!
Compilar e Implantar Contratos
Para a parte final deste passo a passo, seguiremos as instruções em https://docs.avax.network/build/tutorials/smart-contracts/deploy-a-smart-contract-on-avalanche-using-remix-and -metamask/.
Primeiro, queremos ter certeza de que a rede ativa é a associada à sua blockchain local.
Contratos Inteligentes no Remix
A próxima etapa envolve compilar e executar contratos inteligentes no Solidity (este é um ótimo tutorial). Para começar, você pode desenvolver diretamente no IDE fornecido pelo Remix, fazer upload de arquivos locais ou conectar seus contratos a um repositório do GitHub. Depois de escrever seus próprios contratos, vá e compile seus contratos nesta guia.
Depois que essa etapa for concluída e todos os seus contratos inteligentes forem compilados, estaremos prontos para implantá-los!
Agora podemos escolher e implantar seus contratos em nossa rede local. Nesta mesma aba devemos poder interagir e enviar transações na blockchain.
Oba!
Com a carteira Metamask conectada às suas cadeias implantadas localmente, agora temos o poder de depurar, compilar e implantar contratos inteligentes em diferentes cadeias de sub-rede usando ferramentas e IDEs poderosos, como Remix, e testar a funcionalidade de interoperabilidade e ponte entre os cruzamentos de cadeias/sub-redes. Boa compilação e bons testes!
Artigo escrito por: Sean Yu e Ishan Bhatt. Tradução por Paulinho Giovannini
Top comments (0)