[Experience Post] Versión EOS_v2.0 del tutorial oficial

Empezando

Esta experiencia se basa en el capítulo Introducción del tutorial oficial de EOSIO. Ha
experimentado iniciar nodos, administrar carteras, crear cuentas, redactar contratos, compilar e implementar contratos, llamar a contratos, etc. Para
obtener más detalles, consulte https://developers.eos.io/welcome/latest/getting- iniciado / índice /
deficiencias, corríjame.

¿Qué es EOS?

  1. Software: EOS puede entenderse como la abreviatura del software eos.io. El software eos.io es desarrollado por block.one, que construye la arquitectura técnica subyacente de la cadena de bloques EOS; eos.io es similar al sistema operativo en la cadena de bloques, y los desarrolladores pueden construir DAPP rápidamente basándose en esta herramienta.
  2. Token: EOS puede hacer referencia a un token, que actualmente admite el intercambio en EOS y BOS y tiene un cierto valor.
  3. Cadena pública: EOS también puede entenderse como una arquitectura de cadena pública subyacente que utiliza el mecanismo de consenso DPOS. Utiliza un mecanismo de votación para seleccionar 21 nodos como nodo maestro para completar el paquete de transacciones.

La EOS que probamos en este artículo se refiere al software eos.io

Una versión de prueba de instalación gratuita

Si cree que la instalación local es más problemática, puede visitar directamente:

https://gitpod.io/#https://github.com/EOSIO/eosio-web-ide

Sugerencias: debe configurar el entorno para la primera visita y es posible que la apertura de la página sea más lenta.
Página IDE en línea

Para obtener más detalles sobre Web IDE, puede visitar

https://github.com/EOSIO/eosio-web-ide

(1) Compile el contrato
Primero mire el archivo del contrato talk.cpp

#include <eosio/eosio.hpp>

// Message table
struct [[eosio::table("message"), eosio::contract("talk")]] message {
    
    
    uint64_t    id       = {
    
    }; // Non-0
    uint64_t    reply_to = {
    
    }; // Non-0 if this is a reply
    eosio::name user     = {
    
    };
    std::string content  = {
    
    };

    uint64_t primary_key() const {
    
     return id; }
    uint64_t get_reply_to() const {
    
     return reply_to; }
};

using message_table = eosio::multi_index<
    "message"_n, message, eosio::indexed_by<"by.reply.to"_n, eosio::const_mem_fun<message, uint64_t, &message::get_reply_to>>>;

// The contract
class talk : eosio::contract {
    
    
  public:
    // Use contract's constructor
    using contract::contract;

    // Post a message
    [[eosio::action]] void post(uint64_t id, uint64_t reply_to, eosio::name user, const std::string& content) {
    
    
        message_table table{
    
    get_self(), 0};

        // Check user
        require_auth(user);

        // Check reply_to exists
        if (reply_to)
            table.get(reply_to);

        // Create an ID if user didn't specify one
        eosio::check(id < 1'000'000'000ull, "user-specified id is too big");
        if (!id)
            id = std::max(table.available_primary_key(), 1'000'000'000ull);

        // Record the message
        table.emplace(get_self(), [&](auto& message) {
    
    
            message.id       = id;
            message.reply_to = reply_to;
            message.user     = user;
            message.content  = content;
        });
    }
};

Cree una nueva terminal en el IDE y ejecute

eosio-cpp contract/talk.dpp

Una vez compilado el contrato, se generarán talk.abi y talk.wasm en el directorio de archivos del contrato.

#talk.abi内容
{
    
    
    "____comment": "This file was generated with eosio-abigen. DO NOT EDIT ",
    "version": "eosio::abi/1.1",
    "types": [],
    "structs": [
        {
    
    
            "name": "message",
            "base": "",
            "fields": [
                {
    
    
                    "name": "id",
                    "type": "uint64"
                },
                {
    
    
                    "name": "reply_to",
                    "type": "uint64"
                },
                {
    
    
                    "name": "user",
                    "type": "name"
                },
                {
    
    
                    "name": "content",
                    "type": "string"
                }
            ]
        },
        {
    
    
            "name": "post",
            "base": "",
            "fields": [
                {
    
    
                    "name": "id",
                    "type": "uint64"
                },
                {
    
    
                    "name": "reply_to",
                    "type": "uint64"
                },
                {
    
    
                    "name": "user",
                    "type": "name"
                },
                {
    
    
                    "name": "content",
                    "type": "string"
                }
            ]
        }
    ],
    "actions": [
        {
    
    
            "name": "post",
            "type": "post",
            "ricardian_contract": ""
        }
    ],
    "tables": [
        {
    
    
            "name": "message",
            "type": "message",
            "index_type": "i64",
            "key_names": [],
            "key_types": []
        }
    ],
    "ricardian_clauses": [],
    "variants": []

talk.wasm es un archivo binario compilado y se distribuirá a cada nodo cuando se implemente el contrato.

(2) Contrato de instalación

cleos create account eosio talk EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos set code talk talk.wasm
cleos set abi talk talk.abi

*** No hay respuesta después de que se ejecuta el comando, ¡así que me di por vencido! ***

Es broma, si no hay respuesta al crear una cuenta, reinicie el espacio de trabajo. Debido a que necesita guardar y llamar al contrato del sistema para crear una cuenta, tenga en cuenta que no puede cerrar el proceso de generación de bloques (la página siguiente) : el
Bloquear página de información
resultado es el siguiente:

$ cleos create account eosio talk EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
executed transaction: f08fb469311c57c280e6ebcc0f038572ed230e28c070d48a60711b4183aabb92  200 bytes  282 us
#         eosio <= eosio::newaccount            {"creator":"eosio","name":"talk","owner":{"threshold":1,"keys":[{"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcV...
warning: transaction executed locally, but may not be confirmed by the network yet         ] 

$ cleos set code talk talk.wasm
Reading WASM from /workspace/eosio-web-ide/contract/talk.wasm...
Setting Code...
executed transaction: 4afac605a367ccf58dcf093463e881221bf910b29ad65b6ece4dfc85d695cc80  4024 bytes  736 us
#         eosio <= eosio::setcode               {"account":"talk","vmtype":0,"vmversion":0,"code":"0061736d0100000001a2011a6000006000017f60027f7f006...
warn  2020-09-01T04:32:52.185 cleos     main.cpp:495            warning: transaction executed locally, but may not be confirmed by the network yet

$ cleos set abi talk talk.abi
Setting ABI...
executed transaction: 941ddd90e63716f21f2568668dd967574b696b58c3ed189ede86b8e28d80da82  200 bytes  139 us
#         eosio <= eosio::setabi                {"account":"talk","abi":"0e656f73696f3a3a6162692f312e310002076d65737361676500040269640675696e7436340...
warn  2020-09-01T04:33:03.198 cleos     main.cpp:495            warning: transaction executed locally, but may not be confirmed by the network yet

advertir: El motivo es que la transacción se acaba de subir a la cadena y no ha sido confirmada por otros nodos.

(3) Crear usuarios y llamar contratos

#创建用户bob、alice
cleos create account eosio bob EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
cleos create account eosio jane EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
#调用talk合约中post动作
cleos push action talk post '[1000, 0, bob, "This is a new post"]' -p bob
cleos push action talk post '[2000, 0, jane, "This is my first post"]' -p jane
cleos push action talk post '[1001, 2000, bob, "Replying to your post"]' -p bob

(4) Seguimiento de la información de la cadena

cleos get table talk '' message

Retroalimentará la información de la cadena del contrato de conversación:

{
    
    
  "rows": [{
    
    
      "id": 1000,
      "reply_to": 0,
      "user": "bob",
      "content": "This is a new post"
    },{
    
    
      "id": 1001,
      "reply_to": 2000,
      "user": "bob",
      "content": "Replying to your post"
    },{
    
    
      "id": 2000,
      "reply_to": 0,
      "user": "jane",
      "content": "This is my first post"
    }
  ],
  "more": false
}

(5) La
función de visualización de datos se ha implementado con React en el IDE de visualización de la página frontal , ingrese:

gp preview $(gp url 8000)

El efecto de la página de inicio emergente es el siguiente:
Inserte la descripción de la imagen aquí
(6) Genere y ejecute la prueba unitaria
Regrese al directorio superior y ejecútelo en el directorio eosio-web-ide :

./build-tests

Este comando llamará a todos los archivos .cpp en la carpeta de prueba para la operación de compilación. El proceso tarda unos 40 segundos, espera pacientemente.

Copie (o mueva) los archivos talk.wasm y talk.abi generados en el directorio del contrato al directorio donde se encuentra el probador.

correr:

./tester

Durante el funcionamiento normal, muestra

***No errors detected

Si está interesado, puede consultar talk_tests.cpp Este archivo implementa la carga de contratos, la creación de usuarios, las acciones de llamada y el manejo de excepciones al mismo tiempo;

#include <boost/test/unit_test.hpp>
#include <eosio/chain/abi_serializer.hpp>
#include <eosio/chain/permission_object.hpp>
#include <eosio/chain/resource_limits.hpp>
#include <eosio/testing/tester.hpp>

using namespace eosio;
using namespace eosio::chain;
using namespace eosio::testing;
using namespace fc;

BOOST_AUTO_TEST_SUITE(talk_tests)

BOOST_AUTO_TEST_CASE(post) try {
    
    
    tester t{
    
    setup_policy::none};

    // Load contract
    t.create_account(N(talk));
    t.set_code(N(talk), read_wasm("talk.wasm"));
    t.set_abi(N(talk), read_abi("talk.abi").data());
    t.produce_block();

    // Create users
    t.create_account(N(john));
    t.create_account(N(jane));

    // Test "post" action
    t.push_action(
        N(talk), N(post), N(john),
        mutable_variant_object //
        ("id", 1)              //
        ("reply_to", 0)        //
        ("user", "john")       //
        ("content", "post 1")  //
    );
    t.push_action(
        N(talk), N(post), N(jane),
        mutable_variant_object //
        ("id", 2)              //
        ("reply_to", 0)        //
        ("user", "jane")       //
        ("content", "post 2")  //
    );
    t.push_action(
        N(talk), N(post), N(john),
        mutable_variant_object       //
        ("id", 3)                    //
        ("reply_to", 2)              //
        ("user", "john")             //
        ("content", "post 3: reply") //
    );

    // Can't reply to non-existing message
    BOOST_CHECK_THROW(
        [&] {
    
    
            t.push_action(
                N(talk), N(post), N(john),
                mutable_variant_object       //
                ("id", 4)                    //
                ("reply_to", 99)             //
                ("user", "john")             //
                ("content", "post 3: reply") //
            );
        }(),
        fc::exception);
}
FC_LOG_AND_RETHROW()

BOOST_AUTO_TEST_SUITE_END()

(7) Restablecer cadena
Elimina la cadena existente y crea otra. Primero ingrese al terminal usado para producir bloques y presione "ctrl + c" para detener.
Luego ejecuta el siguiente código:

#删除现有链数据
rm -rf ~/eosio/chain
#初始化并启动新链
nodeos --config-dir ~/eosio/chain/config --data-dir ~/eosio/chain/data -e -p eosio --plugin eosio::chain_api_plugin --contracts-console

En este punto, encontrará que los bloques se producirán rápidamente a partir de 0.

Dos instalaciones locales

Preparación ambiental

1. Instale eosio

  • Instalación binaria
#Mac OS
brew tap eosio/eosio
brew install eosio
#Ubuntu18.04
wget https://github.com/EOSIO/eos/releases/download/v2.0.0/eosio_2.0.0-1-ubuntu-18.04_amd64.deb
sudo apt install ./eosio_2.0.0-1-ubuntu-18.04_amd64.deb
#Ubuntu16.04
wget https://github.com/EOSIO/eos/releases/download/v2.0.0/eosio_2.0.0-1-ubuntu-16.04_amd64.deb
sudo apt install ./eosio_2.0.0-1-ubuntu-16.04_amd64.deb
#CentOS
wget https://github.com/EOSIO/eos/releases/download/v2.0.0/eosio-2.0.0-1.el7.x86_64.rpm
sudo yum install ./eosio-2.0.0-1.el7.x86_64.rpm
  • Instalación de la fuente
    Debido a que se usa Ubuntu 20.04, actualmente no hay ningún archivo binario que pueda ser compatible. Intente utilizar el método de instalación de la fuente (la prueba final no es buena, no es compatible durante la compilación ).
    (1) Obtenga el código fuente de EOSIO de github [la descarga es lenta, se recomienda descargar durante el descanso] El
    sitio web oficial recomienda una nueva carpeta de eosio
mkdir -p ~/eosio && cd ~/eosio
git clone --recursive https://github.com/EOSIO/eos

(2) Submódulo de actualización

cd eosio/eos
git submodule update --init --recursive

(3) Obtenga información sobre cambios

[git checkout <branch>]  (optional)
git pull --recurse-submodules

2. Instale CDT

CDT: Kit de desarrollo de contratos de Contract Dev. Kit de desarrollo de contratos
ubuntu18.08 método de instalación:

wget https://github.com/EOSIO/eosio.cdt/releases/download/v1.6.3/eosio.cdt_1.6.3-1-ubuntu-18.04_amd64.deb
sudo apt install ./eosio.cdt_1.6.3-1-ubuntu-18.04_amd64.deb

3. Usa la billetera

Monedero: un repositorio de pares de claves públicas y privadas

(1) Crea una billetera

La opción -file puede evitar que la contraseña de la billetera aparezca en el terminal (producción real)
-to-console crea una billetera predeterminada y la página muestra la contraseña (fase de prueba)

$cleos wallet create --to-console

(2) Abrir la billetera La billetera
creada por defecto está cerrada

#打开钱包
cleos wallet open
#返回钱包列表
cleos wallet list

Si se ejecuta correctamente, la salida:

Wallets:
[
  "default"
]

(3) Desbloquear billetera

cleos wallet unlock

Después de desbloquear con éxito, dará como resultado:

Wallets:
[
  "default *"
]

(4) Importe la clave privada a la billetera

#生成私钥
cleos wallet creat_key

(5) Importar la clave de desarrollo

Cada cadena EOSIO tiene un usuario de sistema predeterminado "eosio". Esta cuenta inicia la cadena cargando un contrato de sistema para la administración designada y el consenso de la cadena. Cada nueva cadena EOS tiene la misma clave de desarrollo.

cleos wallet import
#提示输入私钥时输入:
5KQwrPbwdL6PhXujxW37FSSQZ1JiwsST4cqQzDeyXtP79zkvFD3

4. Inicie keosd & nodeos

#启动keosd
keosd &
#启动nodeos
nodeos -e -p eosio \
--plugin eosio::producer_plugin \
--plugin eosio::producer_api_plugin \
--plugin eosio::chain_api_plugin \
--plugin eosio::http_plugin \
--plugin eosio::history_plugin \
--plugin eosio::history_api_plugin \
--filter-on="*" \
--access-control-allow-origin='*' \
--contracts-console \
--http-validate-host=false \
--verbose-http-errors >> nodeos.log 2>&1 &

Después de un inicio exitoso, realice las comprobaciones necesarias:

#检查节点是否正常出块
tail -f nodeos.log
#检查电子钱包,输出为Wallets:[]
cleos wallet list
#检查Nodeos端
#可以直接浏览器打开http://localhost:8888/v1/chain/get_info
#或者:
curl http://localhost:8888/v1/chain/get_info

5. Cree una cuenta de
prueba El proceso de prueba incluye:

  • Cuenta de usuario: bob, alice
  • Cuenta predeterminada: eosio
  • Cuenta de contrato
#创建用户账号
cleos create account eosio bob YOUR_PUBLIC_KEY
cleos create account eosio alice YOUR_PUBLIC_KEY
#检查公钥--用户的关联
#注意:用户名(alice)是所有权的唯一标识,绑定的公钥变更 不会改变账户的所有权
#eosio授权机制比较特殊:owner密钥保持冷存储,当active被盗用时可以通过owner重获控制权。
cleos get account alice

Desarrollo de contrato

1. Implementación del contrato
(1) Cree un contrato
, cree un directorio de saludo en el directorio de contratos y cree un nuevo hello.cpp

#include <eosio/eosio.hpp>

using namespace eosio;

class [[eosio::contract]] hello : public contract {
    
    
  public:
      using contract::contract;

      [[eosio::action]]
      void hi( name user ) {
    
    
         print( "Hello, ", user);
      }
};

(2) Compilar el contrato

eosio-cpp hello.cpp -o hello.wasm

(3) Contrato de despliegue

#查看钱包内密钥
cleos wallet keys
#创建合约账户
cleos create account eosio hello YOUR_PUBLIC_KEY -p eosio@active
#部署合约
cleos set contract hello **CONTRACTS_DIR**/hello -p hello@active

(4) Ejecución del contrato

#调用action
cleos push action hello hi '["bob"]' -p bob@active
#切换用户调用
cleos push action hello hi '["bob"]' -p alice@active

2. Otro

Supongo que te gusta

Origin blog.csdn.net/weixin_43347204/article/details/108334280
Recomendado
Clasificación