Introdução ao contrato inteligente eosio.system (2) Recursos do sistema

Os blockchains baseados em EOSIO usam três recursos do sistema: RAM, CPU, NET. As contas Blockchain requerem recursos de sistema suficientes para interagir com contratos inteligentes implantados no blockchain. Este tutorial apresenta o módulo de recursos do sistema no contrato inteligente eosio.system em detalhes. Ele é adequado para desenvolvedores juniores de contratos inteligentes EOS. Eles estão familiarizados com como comprar e vender RAM, penhorar e cancelar penhor de CPU, penhorar e cancelar penhor da NET, etc.

01

visão geral

(1) Introdução aos recursos de RAM

1. RAM é o recurso de memória, onde o blockchain armazena dados

A maneira como os contratos inteligentes armazenam dados no blockchain é semelhante à operação no banco de dados, que pode ser armazenado na RAM do blockchain usando tabelas multi-índice ou singletons. O blockchain baseado em EOSIO usa RAM como meio de armazenamento e possui alto desempenho que outros blockchains não podem alcançar, portanto, o acesso aos dados do blockchain é muito rápido.

2. RAM é um recurso limitado, blockchains podem ter diferentes políticas e regras de RAM

Por exemplo, o blockchain EOS público começou com 64 GB de RAM, após o que os produtores de blocos decidiram aumentar a memória para 1 KB por bloco, aumentando continuamente o fornecimento de RAM para que seu preço não variasse dependendo da demanda do aplicativo blockchain .aumentar e crescer muito alto.

3. A RAM é usada para executar muitas operações enviadas para o blockchain

Por exemplo, para criar uma nova operação de conta, as informações da nova conta precisam ser armazenadas na memória do blockchain; da mesma forma, quando uma conta recebe um novo tipo de token, um novo registro deve ser criado na memória do blockchain e o registro é salvo O saldo do novo tipo de token recebido, e esse espaço de armazenamento no blockchain, deve ser adquirido pela conta que transfere os tokens ou pela conta que recebe o novo tipo de token.

4. Se um contrato inteligente consumir toda a RAM alocada, nenhuma informação adicional poderá ser armazenada

Se o contrato inteligente consumir toda a RAM alocada, para continuar salvando dados no banco de dados blockchain, uma das duas condições a seguir deve ser atendida: o contrato inteligente libera uma parte da RAM ocupada; é alocado para a conta do contrato inteligente por meio do Processo de compra de RAM.

(2) Introdução aos recursos de CPU e NET

1. CPU fornece poder de processamento para contas blockchain

A quantidade de CPU pertencente a uma conta é medida em microssegundos e é referida como largura de banda da CPU na saída do comando cleos get account. A largura de banda da cpu representa o tempo de processamento à disposição da conta quando as operações enviadas ao contrato são executadas pela blockchain. O blockchain consome CPU ao executar transações, portanto CPU suficiente deve ser hipotecada para concluir a transação.

2. A NET fornece largura de banda de rede para transações

A quantidade de NET pertencente à conta é medida em bytes e é chamada de largura de banda líquida na saída do comando cleos get account. NET é um recurso denominado em espaço, que é utilizado para medir o share da rede consumido pela transação durante a transmissão da camada P2P. NET é consumido quando o blockchain executa uma transação, então NET suficiente deve ser hipotecado para completar a transação.

3. Os recursos de CPU e NET são alocados pelo proprietário da conta por meio do mecanismo de garantia

Quando você aposta CPU e NET, obtém acesso aos recursos do sistema proporcional à quantidade total de tokens apostados por todos os outros usuários para o mesmo recurso do sistema ao mesmo tempo. Isso significa que você pode executar transações gratuitamente, mas dentro dos limites de seus tokens apostados. Não importa as mudanças no mercado livre, os tokens prometidos podem garantir a proporção de recursos. Se a conta consumir todos os recursos alocados de CPU e NET, há duas opções neste momento: aguardar o blockchain reabastecer os recursos consumidos; alocar mais recursos por meio do mecanismo de promessa.

4. O blockchain reabastece automaticamente os recursos consumidos de CPU e NET

Antes de executar uma transação, o blockchain primeiro calcula quantos recursos a conta que realiza a transação pode consumir. Quando faltam dados, o cálculo usa uma média móvel exponencial com extrapolação linear e multiplica a média cumulativa atual por (número de blocos na janela - número de blocos desde a última atualização) / (número de blocos na janela). A janela é definida como uma janela de 24 horas.

02

preparação ambiental

(1) Um blockchain em execução e acessível

Configuração do ambiente de teste China Mobile Chain (baseado em EOS):

https://mp.weixin.qq.com/s/NBNFk9Xk9FCukMVgl0tfHA

(2) Certifique-se de que a carteira local está aberta e desbloqueada

Como criar uma carteira:

https://developers.eos.io/manuals/eos/latest/cleos/how-to-guides/how-to-create-a-wallet

(3) A construção e implantação de eosio.contracts foi concluída

Como construir eosio.contracts:

https://developers.eos.io/manuals/eosio.contracts/latest/build-and-deploy

(4) A criação, emissão e transferência de tokens foram concluídas

Como criar, emitir e transferir tokens:

https://developers.eos.io/manuals/eosio.contracts/latest/guides/how-to-create-issue-and-transfer-a-token

03

operação RAM

(1) Comprar RAM

Execute o seguinte comando para comprar recursos de RAM no valor de 0,1 SYS para conta testaccount1, onde eosio=conta pagando por RAM, testaccount1=conta recebendo compra de RAM, 0,1 SYS=número de tokens pagos por RAM, -p eosio@active=por autorização comprada permissões, neste caso permissões ativas.

cleos system buyram eosio testaccount1 "0.1 SYS" -p eosio@active

# 示例输出:
executed transaction: e669b474e985c4346fddcbd98344580d56683a3856874e529d6bff065615c155  128 bytes  466 us
#         eosio <= eosio::buyram                {"payer":"eosio","receiver":"testaccount1","quant":"0.1000 SYS"}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.0995 SYS","memo":"buy ram"}
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0005 SYS","memo":"ram fee"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.0995 SYS","memo":"buy ram"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio","to":"eosio.ram","quantity":"0.0995 SYS","memo":"buy ram"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0005 SYS","memo":"ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"eosio","to":"eosio.ramfee","quantity":"0.0005 SYS","memo":"ram fee"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

(2) Vender RAM

Execute o seguinte comando para vender 1024 Bytes de recursos de RAM para a conta testaccount1, onde testaccount1=a conta que vende recursos de RAM, 1024=o número de bytes de RAM vendidos, -p testaccount1@active=a permissão usada para autorizar a venda, neste caso, é a autoridade ativa.

cleos system sellram testaccount1 1024 -p testaccount1@active

# 示例输出:
executed transaction: 9a4d3cc802a152cc26ce897571cf95b506cd56aa254becde5efc24f3304cd779  112 bytes  467 us
#         eosio <= eosio::sellram               {"account":"testaccount1","bytes":1024}
#   eosio.token <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#   eosio.token <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

04

operação da CPU

(1) Penhora de CPU

Execute o seguinte comando para garantir 0,01 SYS de recursos da CPU para a conta testaccount1, em que eosio=a conta que paga 0,01 SYS pela largura de banda da CPU prometida, testaccount1=a conta que oferece largura de banda da CPU, 0 SYS=a quantidade de tokens SYS alocados para a promessa NET, 0,01 SYS = quantidade de tokens SYS alocados para piquetagem de largura de banda da CPU, -p eosio@active = permissão para autorizar piquetagem, neste caso a permissão ativa.

cleos system sellram testaccount1 1024 -p testaccount1@active

# 示例输出:
executed transaction: 9a4d3cc802a152cc26ce897571cf95b506cd56aa254becde5efc24f3304cd779  112 bytes  467 us
#         eosio <= eosio::sellram               {"account":"testaccount1","bytes":1024}
#   eosio.token <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#   eosio.token <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#     eosio.ram <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"eosio.ram","to":"testaccount1","quantity":"0.0149 SYS","memo":"sell ram"}
#  testaccount1 <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
#  eosio.ramfee <= eosio.token::transfer        {"from":"testaccount1","to":"eosio.ramfee","quantity":"0.0001 SYS","memo":"sell ram fee"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

(2) Cancelar a promessa de CPU

Execute o seguinte comando para cancelar a contribuição de 0,01 SYS de recursos da CPU para a conta testaccount1, em que eosio=a conta que paga 0,01 SYS pela largura de banda da CPU prometida, testaccount1=a conta que oferece largura de banda da CPU, 0 SYS=a quantidade de tokens SYS alocado para largura de banda NET prometida, 0,01 SYS=Quantidade de tokens SYS alocados para largura de banda da CPU de piquetagem, -p eosio@active=Permissão para autorizar o descolamento, neste caso a permissão ativa.

cleos system undelegatebw eosio testaccount1 "0 SYS" "0.01 SYS" -p eosio@active

# 示例输出:
executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606  184 bytes  452 us
#         eosio <= eosio::undelegatebw          {"from":"eosio","receiver":"testaccount1","unstake_net_quantity":"0.0000 SYS","unstake_cpu_qu...
warning: transaction executed locally, but may not be confirmed by the network yet         ]

05

operação NET

(1) Promessa LÍQUIDA

Execute o seguinte comando para garantir 0,01 SYS de recursos NET para a conta testaccount1, onde eosio=a conta que pagou 0,01 SYS pela largura de banda NET prometida, testaccount1=a conta que prometeu largura de banda NET, 0 SYS=a quantidade de tokens SYS alocados para prometidos NET, 0,01 SYS = quantidade de tokens SYS alocados para piquetagem de largura de banda da CPU, -p eosio@active = permissão para autorizar piquetagem, neste caso a permissão ativa.

cleos system delegatebw eosio testaccount1 "0.01 SYS" "0 SYS" -p eosio@active

# 示例输出:
executed transaction: d25c7deff42f3a420081b8b717820a78a01cf42fc173fe57d305e7ddaebebc12  144 bytes  422 us
#         eosio <= eosio::delegatebw            {"from":"eosio","receiver":"testaccount1","stake_net_quantity":"0.0100 SYS","stake_cpu_quantity":"0....
#   eosio.token <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"0.0100 SYS","memo":"stake bandwidth"}
#         eosio <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"0.0100 SYS","memo":"stake bandwidth"}
#   eosio.stake <= eosio.token::transfer        {"from":"eosio","to":"eosio.stake","quantity":"0.0100 SYS","memo":"stake bandwidth"}
warning: transaction executed locally, but may not be confirmed by the network yet         ]

(2) Cancelar o penhor da NET

Execute o seguinte comando para cancelar a contribuição de 0,01 SYS de recursos NET para a conta testaccount1, onde eosio=a conta que pagou 0,01 SYS pela largura de banda NET prometida, testaccount1=a conta que prometeu largura de banda NET, 0 SYS=a quantidade de tokens SYS alocados para largura de banda NET prometida, 0,01 SYS = a quantidade de tokens SYS alocados para a largura de banda da CPU de piquetagem, -p eosio@active = permissão para autorizar o descolamento, neste caso a permissão ativa.

cleos system undelegatebw eosio testaccount1 "0.01 SYS" "0 SYS" -p eosio@active

# 示例输出:
executed transaction: e7e7edb6c5556de933f9d663fea8b4a9cd56ece6ff2cebf056ddd0835efa6606  184 bytes  452 us
#         eosio <= eosio::undelegatebw          {"from":"eosio","receiver":"testaccount1","unstake_net_quantity":"0.01 SYS","unstake_cpu_qu...
warning: transaction executed locally, but may not be confirmed by the network yet         ]

06

problema comum

(1) Um erro é relatado ao executar o método sellram: falha na asserção eosio_assert_message?

Resposta: O número de bytes de RAM vendidos é muito pequeno e o número mínimo de bytes correspondente a 0,0001 SYS não foi atingido e mais bytes precisam ser vendidos.

(2) Qual é a unidade de token para recursos prometidos de CPU e NET e como verificar?

Resposta: A unidade de token de CPU e recursos NET prometidos é geralmente SYS, que é definida pelo contrato do sistema, e a unidade de token de uso de CPU e NET pode ser consultada por meio da conta cleos get.

(3) Sobre os três recursos do EOS: RAM, NET, CPU, quais são as unidades de quantidade e como calcular a quantidade restante?

Resposta: Você pode consultar as informações de recursos restantes pela conta cleos get. A unidade de recurso de RAM é byte e o campo correspondente da quantidade de RAM restante é: cota - usada; a unidade de recurso NET também é byte e o campo correspondente de a quantidade NET restante está disponível; a unidade de recurso da CPU é nós, o campo correspondente ao número de CPUs restantes: disponível.

(4) Por que não é recomendado inicializar RAM, CPU e recursos NET suficientes de uma só vez?

Resposta: A RAM corresponde aos recursos de memória do servidor, e a alocação excessiva pode afetar o funcionamento de outros serviços. Ao calcular a RAM consumida por 10.000 cópias de DDC, pode-se estimar a RAM necessária para cada DDC, para que possa ser recarregada uma vez em um período de tempo de acordo com as necessidades do negócio. Os recursos de CPU e NET são prometidos e serão devolvidos linearmente em 24 horas após a conclusão da transação, portanto, é suficiente recarregar os recursos de CPU e NET necessários para um dia.

-FIM-

Acho que você gosta

Origin blog.csdn.net/BSN_yanxishe/article/details/131375757
Recomendado
Clasificación