Ergo e crowdfunding
6 de setembro de 2019

O que é Crowdfunding?
Crowdfunding é uma forma de levantar capital através dos esforços coletivos de indivíduos. As campanhas são iniciadas principalmente via a web e permitem que projetos e negócios sejam financiados levantando pequenas quantias de dinheiro de um grande número de pessoas.
Um dos exemplos mais conhecidos de startups de crowdfunding bem-sucedidas é o Oculus Rift, um headset de realidade virtual. A empresa Oculus VR iniciou sua campanha em 2012 e foi adquirida pelo Facebook dois anos depois por um total de $2 bilhões. Além das startups habituais, também existem muitos projetos de blockchain que seguiram o caminho do crowdfunding, por exemplo, Ethereum, Tron e EOS. Hoje, existem inúmeras plataformas que permitem que você publique sua campanha. Algumas das maiores são Indiegogo, Kickstarter e Gofundme, apenas para citar algumas.
Crowdfunding tem muitos benefícios: um amplo alcance, eficiência e aspectos de marketing sendo os mais convincentes... Mas por enquanto, vamos ao que realmente importa!
Apresentando Crowdfunding no Ergo
Há alguns dias, em 28 de agosto, o desenvolvedor principal Kushti afirmou no (fórum Ergo)[www.ergoforum.org] que conseguiu escrever e implementar com sucesso um código que permite aos usuários iniciar uma campanha de crowdfunding em cima da blockchain Ergo (conforme mencionado na página 6 do whitepaper. Este código funciona até mesmo com a API atual da carteira. Aqui está um guia rápido sobre como configurar a carteira.
Neste artigo, você aprenderá como fazer exatamente isso: crowdfunding em cima do Ergo! Ele também o levará pela proposta da primeira campanha de todas, que é financiar o desenvolvimento do script de crowdfunding pós-EIP1.
Se você quiser entrar em todos os detalhes, leia a seção seguinte, “O Script”. Caso contrário, você pode simplesmente pular para ler as seções “Como Doar”, “Como Coletar Doações” e “Proposta de Projeto de Crowdfunding” abaixo.
O Script
O script de crowdfunding mais simples, de acordo com o White Paper do ErgoScript (página 6), é “um script para a seguinte situação de crowdfunding: um apoiador de projeto (com a chave backerPubKey) deseja dar dinheiro a um projeto (com a chave projectPubKey), mas apenas se o projeto levantar dinheiro suficiente (pelo menos minToRaise) de outras fontes até um prazo (expresso em termos de HEIGHT).
Para dar dinheiro ao projeto, o apoiador criará uma caixa de saída protegida pelo seguinte script. O script contém duas condições: uma para o caso em que o prazo passou (permitindo que o apoiador recupere o dinheiro) e uma para o caso em que teve sucesso (permitindo que o projeto gaste o dinheiro se o valor for pelo menos minToRaise antes do prazo).
Para garantir que dinheiro suficiente foi levantado, o script buscará na coleção de saídas uma caixa com um valor suficiente indo para o projectPubKey. Para verificar para onde o valor da caixa de saída está indo, o script lerá o script que protege a caixa de saída e o comparará com o script correspondente a proveDlog(projectPubKey); este script pode ser obtido por projectPubKey.propBytes.
Como atualmente a API não suporta a incorporação de variáveis de ambiente personalizadas (apenas as pré-definidas como HEIGHT), a única maneira de compilar o script é substituir tais variáveis no script do white-paper por valores concretos. Por exemplo, considere que uma campanha de crowdfunding é bem-sucedida se levantar 500 Ergs antes do bloco número 50.000. Para backerPubKey e projectPubKey, podemos usar a função PK() que aceita apenas chaves serializadas P2PK no momento. Então, o script modificado do WhitePaper se torna o seguinte:
{
val backerPubKey = PK("9h7DHKSDgE4uvP8313GVGdsEg3AvdAWSSTG7XZsLwBfeth4aePG")
val projectPubKey = PK("9gBSqNT9LH9WjvWbyqEvFirMbYp4nfGHnoWdceKGu45AKiya3Fq")
val deadline = 50000
val minToRaise = 500L * 1000000000
val fundraisingFailure = HEIGHT >= deadline && backerPubKey
val enoughRaised = {(outBox: Box) =>outBox.value >= minToRaise
&& outBox.propositionBytes == projectPubKey.propBytes
}
val fundraisingSuccess = HEIGHT < deadline && projectPubKey && OUTPUTS.exists(enoughRaised)
fundraisingFailure || fundraisingSuccess
}
Como Doar
Primeiro de tudo, JSON não suporta strings de várias linhas, então você precisa substituir quebras de linha por \n.
Além disso, as aspas devem ser escapadas, então use " em vez de ". O JSON resultante será enviado para /script/p2sAddress.
Para doar a um projeto, primeiro obtenha seu endereço de /wallet/addresses, pegue, por exemplo, o primeiro deles. Coloque o endereço no backerPubKey, então uma solicitação para /script/p2sAddress ficará assim após esta etapa:
{
"source": "{
val backerPubKey = PK(\"9...\")
val projectPubKey = PK(\"9gBSqNT9LH9WjvWbyqEvFirMbYp4nfGHnoWdceKGu45AKiya3Fq\")
val deadline = 50000
val minToRaise = 500L * 1000000000
val fundraisingFailure = HEIGHT >= deadline && backerPubKey
val enoughRaised = {
(outBox: Box) =>
outBox.value >= minToRaise && outBox.propositionBytes == projectPubKey.propBytes
}
val fundraisingSuccess = HEIGHT < deadline && projectPubKey && OUTPUTS.exists(enoughRaised)
fundraisingFailure || fundraisingSuccess
}"
}
com seu endereço em vez de “9…”.
Envie a string para /script/p2sAddress para obter uma resposta como:
{
"address": "GB3kh2izpWKvyZfMboQwsEscjPaZcz9WrzGqZB4ZrkzRreiFMV6HZYWXGMK3rqCjDCoPgWGNzfnYSUhivW4a1VRYPE7uZXwKnBcqWcRkiuTx6QW55EcPcWeELUsumwdtKoFtWY583nWnKZff"
}
Copie a string do endereço (GB3… em nosso exemplo) e envie o dinheiro para ele via /wallet/payment/send. Uma solicitação para o método da API para enviar 10 Ergs (10 bilhões de nanoErgs) será como a seguinte:
[
{
"address": "GB3kh2izpWKvyZfMboQwsEscjPaZcz9WrzGqZB4ZrkzRreiFMV6HZYWXGMK3rqCjDCoPgWGNzfnYSUhivW4a1VRYPE7uZXwKnBcqWcRkiuTx6QW55EcPcWeELUsumwdtKoFtWY583nWnKZff",
"value": 10000000000
}
]
Isso é tudo!
Agora a carteira encontrará automaticamente a caixa na blockchain, pois contém a chave pública que pertence à carteira na condição de reembolso. A carteira então verifica periodicamente se a caixa é gastável, construindo uma transação mais simples com a caixa como entrada e apenas uma saída (para o mesmo endereço). Após a altura de reembolso (50.000 em nosso exemplo), a carteira poderá gastar a caixa e assim o valor da caixa será adicionado a /wallet/balances.
Por favor, note que isso não será o caso após a implementação do EIP-1 3, pois a carteira usará padrões de reconhecimento estreitos até então.
Como Coletar Doações
A carteira que está associada à chave pública do projeto encontrará caixas de entrada na blockchain. No entanto, ela não conseguirá garantir que as caixas sejam gastáveis, pois a carteira atualmente está usando uma transação mais simples para isso, e o script falha para tal transação de gasto.
Antes do método /wallet/boxes/uncertain ser implementado, a única maneira de um projeto encontrar caixas de entrada. Então /wallet/transaction/send com caixas serializadas fornecidas manualmente (em “inputsRaw”) (use /utxo/byIdBinary para obter a caixa serializada pelo seu identificador).
Kushti fez isso por conta própria e obteve a seguinte transação.
Por favor, note que EIP-1 quebrará esse fluxo de trabalho também.
Kushti propõe levantar 500 Ergs antes do bloco 50.000 para desenvolver scripts de linha de comando (em Python) para organizar e participar de campanhas de crowdfunding após a implementação do EIP-1. Scripts de linha de comando são mais adequados do que fazer solicitações manualmente e também podem ser usados para construir interfaces gráficas em cima deles.
O tesouro forneceu metade dos fundos, então outros precisam contribuir com os 250 Ergs restantes coletivamente. Em caso de falha da campanha, os reembolsos serão dados automaticamente. Como coletar promessas não é trivial no momento, Kushti liderará o papel do projeto, então, por favor, use a seguinte chave, que é controlada por ele:
9gBSqNT9LH9WjvWbyqEvFirMbYp4nfGHnoWdceKGu45AKiya3Fq
Para doar qualquer quantia de dinheiro, siga a seção “Como Doar” acima substituindo backerPubKey pela sua chave pública e o valor da promessa pelo valor apropriado (por favor, note que está em nanoErgs, 1 Erg = 1.000.000.000 nanoErgs).
Como sempre, se você tiver mais perguntas, sugestões ou quiser participar do movimento, por favor, junte-se aos nossos canais de mídia social ou fórum.
Share post
13 de agosto de 2025
12 de agosto de 2025
9 de julho de 2025
12 de maio de 2025

7 de abril de 2022

8 de março de 2022


















