Una breve discusión sobre el aprendizaje de blockchain DAPP

f1ee83a8c17f90f3b31b689ab8065665.gif

Prefacio

El metaverso se ha vuelto popular recientemente y he estado charlando con mis amigos sobre qué es el metaverso (realidad virtual VR, un gemelo digital del mundo real), y luego hablamos sobre web3.0, hablando de manera realista sobre el metaverso y web3. .0 todavía son pensamientos vagos, pero todos tienen algunas soluciones técnicas prácticas. Hoy no hablaré sobre el metaverso (de hecho, Internet en sí es el metaverso omnipresente.

No hablaré de eso porque no sé mucho sobre la tecnología de realidad virtual, sin embargo, ya existen muchas herramientas infalibles en China, como thingjs, y Youplait Technology tiene buenos productos. en el extranjero). Hoy quiero hablar sobre web3.0, un futuro para todos. Internet que usted puede poseer; en pocas palabras, web1.0 es una red de solo lectura (que representa a NetEase), y web2.0 es una red de lectura. red de escritura (que representa Weibo y WeChat).

Las dos primeras generaciones de redes fueron redes centralizadas y era difícil garantizar los derechos de información de los usuarios de la red, es decir, era difícil confirmar los derechos de contenido. Web3.0 puede garantizar su propiedad. Bueno, ¿cómo garantizar la propiedad? De hecho, es la cadena de bloques. El Metaverso no puede evitar este problema. Todas las redes futuras parecen necesitar la cadena de bloques. Sin embargo, en esta etapa, la cadena de bloques, tanto la cadena principal como la cadena lateral, es lento y requiere Sigue siendo una realidad que la tecnología en esta etapa todavía es lenta para escribir tantos bloques y confirmar los derechos.

b39bd4ea0129deda6cba266cc1084c38.png

¿Por qué aprender web3.0?

Empresa (pública: propiedad de varias personas; empresa: el significado de operación). Con el desarrollo de la sociedad moderna, la cooperación de producción económica entre empresas y personas se está volviendo cada vez más complicada, especialmente los diversos tipos de cooperación en Internet. ¿Cómo confirmar que la propiedad de estas personas o de muchas personas está en una o más personas? • El valor en múltiples actividades económicas de producción es un problema que Internet necesita resolver. Debido a la epidemia, el trabajo desde casa, los autónomos y las necesidades de nuevas relaciones sociales de producción impulsan constantemente la mejora de la web3.0 y el metaverso.

¿Qué tecnologías se deben dominar para aprender web3.0?

Lenguaje de redacción de contratos inteligentes de Solidity

El lenguaje Solidity es un lenguaje de programación orientado a contratos de alto nivel que se utiliza para implementar contratos inteligentes en la red blockchain Ethereum. Para su herramienta de desarrollo Remix, se recomienda utilizar su editor en línea [https://remix.ethereum.org]. El editor en línea se puede conectar sin problemas con matemask. Los contratos inteligentes de Blockchain deben integrarse con billeteras inteligentes.

trufa

Es un entorno de desarrollo de contratos inteligentes localizado, un marco de pruebas y una herramienta en cadena basado en la máquina virtual Ethereum (EVM).

geth

Geth puede construir un nodo Ethereum completo, no entraré en demasiados detalles aquí, porque es suficiente usar Ganache virtual de memoria local para el desarrollo.

ganache

Ganache puede iniciar rápidamente una cadena de bloques Ethereum personal y puede usarse para ejecutar pruebas, ejecutar comandos, verificar el estado y controlar cómo opera la cadena.

nodo js

Todas las soluciones técnicas web3.0 que presenté están instaladas en función de npm, incluidas trufa y Ganache. El siguiente artículo supone que todo el mundo conoce el conocimiento de Node js.

Empezar a codificar

Código de votación de solidez portátil

db7289d24040bcebb5af47d086782df8.png

Aquí hay un contrato simple sobre la votación.

pragma solidity ^0.4.0;
 contract Voting{
    //投票列表
    bytes32[] public candidateList;
    //对应的票数
    mapping(bytes32=>uint8) public votesReceived;
    //构造投票列表
    constructor(bytes32[] memory  candidateListName) public{
        candidateList = candidateListName;
    }
    //判断投票信息是否在待投票列表
    function valiCandidate(bytes32 candidateName) internal view returns(bool)
    {
        for(uint8 i=0;i〈candidateList.length;i++)
        {
            if (candidateName==candidateList[i])
            {
                return true;
            }
        }
        return false;
    }
   //对投票人增加投票
    function voteForCandidate(bytes32 candidateName) public{
        require(valiCandidate(candidateName));
        votesReceived[candidateName] = votesReceived[candidateName] + 1;
    }                                  
    function totalVotesFor(bytes32 candidateName) view public returns(uint8){
        require(valiCandidate(candidateName));
        //返回票数
        return votesReceived[candidateName];
    }
}

instalar ganache

Recuerde agregar -g para instalar globalmente

npm install ganache-cli -g# 6.12
    npm install ganache -g# 7.0
    ganache-cli -d #启动它ganache
3a284c6e4485100e118dcea7f2a58a8c.png

Instalar trufa

Recuerde agregar -g para instalar globalmente

npm install truffle -g

Inicialice el marco dapp trufa (web3.0)

mkdir voting
    cd voting
    truffle unbox webpack
La estructura del directorio del proyecto inicializado es la siguiente

e6d4963ed0d2dde32b8e50622aaa3cf4.pngEl directorio APP es un proyecto web3.0 de nodo js; el directorio de compilación es el directorio de contrato compilado para llamar; contratos es el contrato escrito en remix y migraciones es el archivo de implementación del contrato; el directorio de prueba es el archivo de prueba; trufa-config .js es el archivo de configuración.

configuración de trufa-config.js

Desmarque el comentario 127.0.0.1 puerto 8545 para indicar el enlace al Ganache local.b16a5689ccfa2307b3436a30a5c097cd.png

Implemente vote.sol en el directorio de contratos del proyecto
1227cae95e07ec381456d48a52738d5d.png
truffle compile

El contrato predeterminado del proyecto se coloca en este directorio: ejecute el comando (compilación de trufa) para compilar. Una vez completada la compilación, habrá un archivo Voting.json adicional en compilación/contratos.

Cree un nuevo archivo 3_deploy_contracts.js en el directorio de migraciones
const Voting = artifacts.require("Voting");
   
    //0x4100000000000000000000000000000000000000000000000000000000000000 代表 A
    //0x4200000000000000000000000000000000000000000000000000000000000000 代表 B
    module.exports = function(deployer) {
      //初始化合约 第二是投标列表参数
      deployer.deploy(Voting, ["0x4100000000000000000000000000000000000000000000000000000000000000","0x4200000000000000000000000000000000000000000000000000000000000000"]);
};
Ejecutar comando: migración de trufa // implementar contrato
truffle migrate

d2afb41d564a0a546da720b8941832a8.pngla dirección del contrato es la dirección del contrato y la cuenta es la dirección de la cuenta de implementación.

Implementación y operación de código en el directorio de la aplicación.

Hay dos archivos vote.js y vote.html en app/src/:

Código de votación.js:
import Web3 from "web3";
import votingArtifact from "../../build/contracts/Voting.json";
const aInBytes32 ="0x4100000000000000000000000000000000000000000000000000000000000000";
const bInBytes32 ="0x4200000000000000000000000000000000000000000000000000000000000000";
const App = {
  web3: null,
  account: null,
  meta: null,
  start: async function() {
    const { web3 } = this;
    try {
      const networkId = await web3.eth.net.getId();
      const deployedNetwork = votingArtifact.networks[networkId];
      this.voting = new web3.eth.Contract(
        votingArtifact.abi,
        deployedNetwork.address,
      );
      const accounts = await web3.eth.getAccounts();
      this.account = accounts[0];
      this.ready();
      this.refreshBalance();
    } catch (error) {
      console.error("Could not connect to contract or chain.");
    }
  },
  ready:async function(){
     try{
        this.refresh("Alice",aInBytes32);
        this.refresh("Bob",bInBytes32);
     }catch(err){
        console.log(err)
     }
  },
  refresh:async function(id,nameBytes32){
      const {totalVotesFor} = this.voting.methods;
      const tickets = await totalVotesFor(nameBytes32).call();
      const el = document.getElementById(id);
      el.innerHTML = tickets.toString();
  },
   voteForCandidate:async function(){
       try{
          const {voteForCandidate} = this.voting.methods;
          const condidateName = document.getElementById("candidate").value;
          console.log(condidateName)
          if (condidateName == "Alice")
          {
            await voteForCandidate(aInBytes32).send({from:this.account});
            this.refresh("Alice",aInBytes32);
          }
          else{
            await voteForCandidate(bInBytes32).send({from:this.account});
            this.refresh("Bob",bInBytes32);
          }
       }catch(err){
           console.log(err)
       }
   }
};
window.App = App;
window.addEventListener("load", function() {
  if (window.ethereum) {
    // use MetaMask's provider
    App.web3 = new Web3(window.ethereum);
    window.ethereum.enable(); // get permission to access accounts
  } else {
    console.warn(
      "No web3 detected. Falling back to http://127.0.0.1:8545. You should remove this fallback when you deploy live",
    );
    // fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
    App.web3 = new Web3(
      new Web3.providers.HttpProvider("http://127.0.0.1:8545"),
    );
  }
  App.start();
});
La primera línea importa web3; la segunda línea importa el contrato de votación; la tercera y cuarta líneas son dos elementos de votación.
import Web3 from "web3";
import votingArtifact from "../../build/contracts/Voting.json";
const aInBytes32 ="0x4100000000000000000000000000000000000000000000000000000000000000";
const bInBytes32 ="0x4200000000000000000000000000000000000000000000000000000000000000";
Este código obtiene la red blockchain y la cuenta de billetera e inicializa el contrato de votación.
start: async function() {
    const { web3 } = this;
       try {
      // get contract instance
      const networkId = await web3.eth.net.getId();
      const deployedNetwork = votingArtifact.networks[networkId];
      this.voting = new web3.eth.Contract(
        votingArtifact.abi,
        deployedNetwork.address,
      );
      // get accounts
      const accounts = await web3.eth.getAccounts();
      this.account = accounts[0];
      this.ready();
      this.refreshBalance();
    } catch (error) {
      console.error("Could not connect to contract or chain.");
    }
  },
});
método de votación
voteForCandidate:async function(){
       try{
          const {voteForCandidate} = this.voting.methods;
          const condidateName = document.getElementById("candidate").value;
          console.log(condidateName)
          if (condidateName == "Alice")
          {
            await voteForCandidate(aInBytes32).send({from:this.account});
            this.refresh("Alice",aInBytes32);
          }
          else{
            await voteForCandidate(bInBytes32).send({from:this.account});
            this.refresh("Bob",bInBytes32);
          }
       }catch(err){
           console.log(err)
       }
   }

votacion.htmlcode

<!DOCTYPE html>
<html>
  <head>
    <title>My Voting Dapp</title>
  </head>
  <style>
    input {
      display: block;
      margin-bottom: 12px;
    }
  </style>
  <body>
    <h1>Voting Dapp</h1>
    <p>Alice <strong id="Alice">loading...</strong> tickets</p>
    <p>Bob <strong id="Bob">loading...</strong> tickets</p>
    <input type="text" id="candidate" />
    <button onclick="App.voteForCandidate()">Send</button>
    <script src="voting.js"></script>
  </body>
</html>
Inicialice el proyecto DAPP e inícielo
npm install
  npm run dev

dafbead345261405879bf248f0a6f168.pngVisite http://localhost:8080/voting.html 100f406ada124d85594060eaa271518d.pnge ingrese Alice--"Haga clic en enviar (la billetera matemask le indicará que necesita gastar algunas monedas eth para confirmar, yo solo las gasto como monedas simuladas locales) Después de confirmar, usted 228c13bf34160fb5b3088817cc1e9fc4.pngencontrará a Alice votando. El número se ha convertido en 2. Esto no se puede cambiar en la cadena de bloques.

96fdad6293833a08d8ef3e573cbccb23.png

Resumir

En el lenguaje de solidez del contrato, el almacenamiento requiere gas y se almacenará permanentemente en el bloque. Usamos esta característica para escribir el contrato de votación, de modo que la votación no cambie durante mucho tiempo. También hay una memoria que se almacena en la memoria y no cuesta gasolina. . De esta manera, podemos encontrar que web3.0 o dapp guarda contenido que requiere garantía de crédito en la blockchain a través de contratos inteligentes, lo que juega un papel de confianza descentralizado y también asegura la garantía de propiedad. De esta manera, web3.0 proporciona la función de confirmar los derechos y los derechos de propiedad de la red de lectura y escritura anterior, sentando las bases para el metaverso.

Supongo que te gusta

Origin blog.csdn.net/weixin_47479625/article/details/123911587
Recomendado
Clasificación