Frequentemente converso com parceiros comerciais que querem entrar no mundo das criptos e um questionamento comum é qual Blockchain e rede utilizar. Dentro do ecossistema do Ethereum temos diversas alternativas rápidas e baratas, como a Binance Chain, cuja moeda é a BNB, a Polygon (Matic), entre outras, mas, mesmo usando uma dessas, ainda haverá custos. Então, por que não criar a nossa própria Sidechain?

Prós e contras

O primeiro benefício de ter a própria Sidechain está relacionado aos custos. Fazer um Smart Contract e enviar comandos para mint ou burn custa dinheiro, optar por criar uma aplicação na rede do Ethereum pode custar bem caro. Há alguns meses eu criei alguns ERC-721 na rede ETH e custou por volta de US$700 enviar o contrato para a Blockchain e cada mint (criar novas NFTs) custaria em torno de US$5. Tendo sua própria Sidechain não existe o custo das operações internas, basta pagar os servidores que mantém os Nodes.

Porém nem tudo são flores. Eu recomendo apenas manter uma Sidechain em produção com uma boa equipe de DevOps, que irá configurar réplicas de Full Nodes e que possa monitorar de perto a segurança e estabilidade da rede. Várias Sidechains foram invadidas e milhões de dólares roubados. O caso recente mais emblemático foi a invasão da rede Ronin, do Axie Infinity, que é uma Sidechain da rede Ethereum, em que mais de US$600 milhões foram roubados.

Caso a realidade de seu projeto não comporte contratar e manter uma equipe de segurança e DevOps, a opção mais viável é usar de uma Sidechain existente, abaixo segue uma lista das maiores:

Lista das maiores Sidechains Ethereum

Geth

Como já citei em outros posts, o Ethereum é muito mais do que uma moeda, ele é um ecossistema que envolve diversas aplicações. Na verdade o nome da moeda da rede nem é Ethereum e sim Ether. Ethereum é um protocolo open source e possui três implementações oficiais: uma em C++, uma em Phyton e outra na linguagem Go, sendo que Geth significa Go Ethereum. E por que vamos usar o Geth ao invés de usar C++ ou Python? Eu particularmente prefiro pela simplicidade de uso, porém fique a vontade para usar a que achar melhor.

A instalação do Geth é relativamente simples e existe toda uma documentação oficial completa, que você encontra nesse link aqui, por isso não vou fazer um passo a passo.

Genesis

Depois de realizar a instalação do Geth, nosso próximo passo é criar o primeiro bloco da Blockchain, chamado Genesis (aparentemente uma analogia ao livro cristão da criação do mundo ou algo do tipo). O arquivo é relativamente simples, mas vou explicar algumas coisas bem importantes.

{
    "config": {
        "chainId": 5315,
        "homesteadBlock": 1,
        "eip150Block": 2,
        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",
        "eip155Block": 3,
        "eip158Block": 3,
        "byzantiumBlock": 4,
        "constantinopleBlock": 5,
        "petersburgBlock": 6,
        "ethash": {}
    },
    "timestamp": "0x5a5df135",
    "extraData": "",
    "coinbase": "0x0000000000000000000000000000000000000000",
    "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
    "difficulty": "0x100",
    "gasLimit": "8000000",
    "gasUsed": "0x0",
    "number": "0x0",
    "alloc": {
        "0x29fe7D62dbB707712E20894F320ddfC488f8BEB9": {
            "balance": "100000000000000000000000000"
        },
        "0XBDFE587967BAA63B29E8DE574D1AA0E30909B4DA": {
            "balance": "120000000000000000000000000"
        }
    }
}

Acima temos o arquivo genesis.json que foi usado para a criação da Sidechain da Uzmi Games. Antes de tudo você deve utilizar um ChainId que não exista, caso pense em listar publicamente sua rede, para isso será necessário verificar a disponibilidade aqui. Caso vá utilizar a Sidechain somente como estudo, pode deixar qualquer Id. A ordem desses EIP requer um pouco mais de leitura da documentação do Geth, na época eu tive alguns problemas até chegar nessa configuração, que agora está funcionando perfeitamente. O mais importante nessas configurações são as carteiras em que serão alocadas as primeiras unidades da moeda circulante da rede. Eu aconselho a criação de duas ou mais carteiras, para isso basta seguir o post:

Com o arquivo Genesis, agora vamos criar a Blockchain usando o seguinte comando:

geth init --datadir /root/data genesis.json

O diretório que será criado os arquivos pode ficar salvo aonde você achar melhor. É importante fazer backup e criar outros Full Nodes para replicar essa base de dados e evitar que a rede caia.

Iniciando a Sidechain

Existem diversos parâmetros de configuração que devem ser entendidos e definidos para o uso em produção. Por exemplo, é possível habilidade mineração na sua rede, liberar acesso por meio de HTTP, RPC, Websocket, utilizar Proof Of Stake invés de Proof Of Work, entre outros. Os parâmetros do Geth podem ser vistos nesta lista. Para facilitar, vamos usar uma configuração simples, liberando acesso HTTP e habilitando a mineração interna pelos Nodes da rede.

geth --http --http.port 8566 --http.addr "0.0.0.0" --http.corsdomain '*' --http.vhosts '*' --http.api "db, eth, net, web3" --datadir "/root/data" --networkid 5315 --mine --miner.threads 1 --miner.etherbase 0x29fe7D62dbB707712E20894F320ddfC488f8BEB9 >> Eth.log

Fazendo um script em Shell Script para iniciar a aplicação, basta criar um serviço para iniciar automaticamente a rede:

[Unit]
Description=Sidechain

[Service]
User=root
Type=simple
WorkingDirectory=/root/sidechain
ExecStart=/bin/bash /root/sidechain/startgeth.sh
Restart=on-failure
RestartSec=5

[Install]
WantedBy=default.target

Usando o Nginx e LetsEncrypt é possível ativar HTTPS de forma simples:

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
limit_conn_zone $binary_remote_addr zone=addr:10m;

upstream websocket {
	server 127.0.0.1:443;  
}

server {
    listen 80 http2 default_server;
    listen [::]:80 http2;
    server_name minhasidechain.com.br;

    location / {
        proxy_set_header Host $host;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://127.0.0.1:8566;
    }

    listen [::]:443 ssl http2 ipv6only=on default_server; # managed by Certbot
    listen 443 ssl http2 default_server; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/minhasidechain.com.br/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/minhasidechain.com.br/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}

Parabéns! Agora você é proprietário de uma Sidechain. Nos próximos posts o assunto vai ficar cada vez mais técnico, pois vamos criar Smart Contracts e implementar um marketplace totalmente Web3. Ficou com alguma dúvida? Estude! Leia a documentação e não desista!