【Caliper】 Resumo da armadilha do Hyperledger Besu (3) Testar rede independente

Abstrato

Quando escrevo isto, quero reclamar mais do posicionamento do Caliper do que das armadilhas em que pisei.

Acho que a maioria das pessoas que desejam usar o Caliper para testar contratos devem estar familiarizadas com redes blockchain, protocolos, etc. Eles querem ver o
desempenho de seus contratos, se podem suportar uso comercial, etc.

No entanto, a documentação e a estrutura do Caliper contêm muitas coisas
. O Docker inicia o blockchain e assim por diante. Entendo que quero que os desenvolvedores comecem rapidamente, mas é realmente redundante.

Para obter mais documentação e casos de teste, você pode se concentrar mais na parte de teste,
afinal ainda há muito o que aprofundar na parte de teste.

No entanto, ainda sou grato por este projeto de código aberto. Depois de fazer algum esforço para entendê-lo, ainda é um pouco divertido de usar.

Este artigo pretende focar principalmente na parte de teste, ignorando a implantação do contrato de inicialização do Docker no estágio inicial do Caliper. Por padrão, já existe uma rede e um contrato em execução.

Se você também precisa testar a rede ao vivo, não perca.

A versão do calibrador é v0.4.2

Repositório

  • O Github
    está se preparando: pretendo criar um novo repositório. Sou preguiçoso. Para atualizações subsequentes, você
    pode usar o anterior
    https://blog.csdn.net/weixin_44565484/article/details/123062975?spm=1001.2014.3001.5501

Índice

  1. Capítulo 1: Instale o Caliper
  2. Capítulo2: Configuração de rede
  3. Capítulo 3: Execução
  4. Resumo

Capítulo 1

O processo de instalação é igual ao anterior
https://blog.csdn.net/weixin_44565484/article/details/123062975?spm=1001.2014.3001.5501

Capítulo 2

networkconfig.json

Para testar uma rede existente, você deve primeiro estabelecer uma rede Besu
e depois implantar o contrato na rede. Defina o URL da rede, o endereço do contrato e a chave privada do proprietário para o arquivo abaixo. O
local do arquivo é arbitrário e npx caliper ...o caminho será especificado durante a execução.

{
    "caliper": {
        "blockchain": "ethereum",
        "command": {}
    },
    "ethereum": {
        "url": "ws://127.0.0.1:8541",
        // 这里0x后面是Owner的私钥
        "fromAddressSeed": "0x8d5...",
        "transactionConfirmationBlocks": 2,
        "contracts": {
             // 合约名
            "contract_name": {
                // 合约Deploy后生成的地址
                "address": "0x8e89...",
                "estimateGas": true,
                "gas": {
                	// 函数名并设置一个gas值,如果太小会被Revert
                    "contract_function":1000000
                },
                // 合约Deployhou生成的abi.json,仅测试函数部分就可以
                "abi": [
                  {
                    "inputs": [
                      {
                        "internalType": "uint256",
                        "name": "issuerId",
                        "type": "uint256"
                      },
                    ],
                    "name": "contract_function",
                    "outputs": [],
                    "stateMutability": "nonpayable",
                    "type": "function"
                  }
                  ]
            }
            }
        }
    }
}

config.yaml

O arquivo de configuração da carga de trabalho é usado principalmente para definir o método de teste.
Se você testar apenas a função de transferência, pode ser mais simples. Basta passar a conta de envio, a conta de recebimento e o valor como parâmetros para a carga de trabalho. Depende de qual é a entrada de a função do contrato está escrita.

Além de passar parâmetros na configuração, o muito importante é txNumber, trabalhadores e
rodadas tps são o número de execuções.Se trabalhadores -> número estiver definido como 1, significa que cada trabalhador é executado em ordem, uma rodada de cada vez.

  • txNumber é o número de execuções de carga de trabalho para cada rodada. Cada rodada pode ser definida de forma independente.
  • trabalhadores é o número de trabalhadores executando ao mesmo tempo. Por exemplo, 10 rodadas podem configurar 3 trabalhadores, e cada pessoa executa 10 rodadas aleatoriamente ao mesmo tempo.
  • tps é o número de tx enviados por segundo. Por exemplo, se txNumber estiver definido como 500 e tps como 10, 10 tx serão enviados em um segundo e um total de 500 serão enviados.

O Caliper possui uma função de monitoramento. O tx enviado será monitorado em um determinado intervalo. No log, você pode ver quantos tx foram enviados, quantos foram executados, quantos não foram executados, quantos tiveram sucesso e quantos falharam .

// 设置参数传递给workload.js
simpleArgs: &params
  count: 1
  fromAccountId: 3000
  moneyToTransfer: 100
  toAccountId: 3000
  
test:
  name: test
  description: >-
    test
  workers:
    type: local
    number: 1
  rounds:
    - label: round1
      description: Test description
      txNumber: 1
      rateControl:
        type: fixed-rate
        opts:
          tps: 1
      workload:
        // workload的路径
        module: dir/to/workload.js
        arguments:
          <<: *params
     - label: round2
      description: Test description
      txNumber: 1
      ...

workload.js

Esta parte gera principalmente a entrada da função de contrato
, como transferência, e envia o envio, recebimento e valor correspondente para a rede Besu em um formato que satisfaça a função de contrato.

  • A classe que o Caliper é responsável por enviar para a rede Besu é sutAdapter, o principal aqui é passar parâmetros para ela.
  • sutAdapter pode receber parâmetros diretamente ou empacotá-los em um array. Ele reconhecerá automaticamente que, se for um array, gerará uma solicitação à rede Besu para cada elemento nele contido.
  • Escrevi um modelo e foquei apenas em getParameters().
'use strict';

const { WorkloadModuleBase } = require('@hyperledger/caliper-core');

class Workload extends WorkloadModuleBase {
    constructor() {
        super();
    }
     async initializeWorkloadModule(workerIndex, totalWorkers, roundIndex, roundArguments, sutAdapter, sutContext) {
        await super.initializeWorkloadModule(workerIndex, totalWorkers, roundIndex, roundArguments, sutAdapter, sutContext);
    }
    
    /**
     * Custom parameters setting
     */
    getParameters() {
    	// this.roundArguments.count是获取的config传递过来的参数
    	// 有时候每次执行的Request的参数都不同,可以用来生成不同内容
    	// 比如登陆账号,需要每个账号都不同
        const txs = [...Array(this.roundArguments.count).keys()].map((v) => {
        const Args = [这里写合约输入参数]; 
            return {
                // Contract名
                contract: 'contract_name',
                // Method名
                verb: 'contract_function',
                // 此函数内设置的参数
                args: Args
            }
        })
        return txs
    }
    async submitTransaction() {
        const txs = await this.getParameters();
        await this.sutAdapter.sendRequests(txs);
    }
}

function createWorkloadModule() {
    return new Workload();
}

module.exports.createWorkloadModule = createWorkloadModule;
  • Dependendo do conteúdo do contrato, os parâmetros serão muito diferentes. Caso exista uma função de contrato da classe AccessControl, uma Assinatura deverá ser gerada localmente e enviada em conjunto.
  • Se precisar distinguir cada rodada, você também pode usar this.roundIndex diretamente em getParameters.O valor vai de 0 ao número total de rodadas menos um.

Desta forma, após definir o valor inicial e a contagem na configuração, você pode obter um índice diferente para diferentes rodadas e cada solicitação.

 const testids = this.roundArguments.testidstart + v + (this.roundIndex * this.roundArguments.count);

Capítulo 3

Ao executar o teste

  • Definido --caliper-flow-only-test=truepara executar apenas teste
  • Defina o arquivo config.yaml criado no Capítulo 2 como benchconfig
  • Defina o arquivo networkconfig.json criado no Capítulo 2 como networkconfig
  • Defina o caminho atual para o espaço de trabalho
npx caliper launch manager \
  --caliper-flow-only-test=true \
  --caliper-benchconfig dir/to/config.yaml \
  --caliper-networkconfig dir/to/networkconfig.json \
  --caliper-workspace .

Por fim, além do Ternimal gerar resultados, também será gerado um arquivo report.html no caminho do espaço de trabalho, que pode ficar mais decente quando colado no relatório.

Se ocorrer uma exceção durante a execução, existem diversas situações:

  • A anormalidade é cant open ... connenct()semelhante (não me lembro bem), a rede não está conectada, é preciso verificar se as portas coincidem e se a rede Besu está funcionando normalmente.
  • Se a exceção retornada por Revert estiver relacionada ao gás, será necessário modificar o valor do gás em networkconfig.json.

Resumo

  • Encontrei muitas anomalias ao longo do caminho e não consigo me lembrar delas com clareza se não fizer anotações. Farei anotações com cuidado na próxima vez.
  • O tps testado não é o ideal, o IBFT2.0 ainda é muito lento.

おすすめ

転載: blog.csdn.net/weixin_44565484/article/details/123276256