Uso básico de Web3.js (interação com contratos inteligentes Ethereum)

Introdução ao web3.js

• API do aplicativo JavaScript Web3

• web3.js é uma biblioteca de API JavaScript. Para fazer o DApp rodar no Ethereum, podemos usar o objeto web3 fornecido pela biblioteca web3.js

• web3.js se comunica com nós locais por meio de chamadas RPC, pode ser usado com qualquer nó Ethereum que exponha a camada RPC

• web3 contém o objeto eth - web3.eth (para interagir com o blockchain Ethereum) e o objeto shh - web3.shh (para interagir com o Whisper)

carregamento do módulo web3

• Primeiro, você precisa instalar o módulo web3 no projeto: npm install [email protected]
• Em seguida, crie uma instância web3 e defina um "provedor" • Para garantir que o provedor definido pelo nosso MetaMask não seja substituído, antes introduzindo o web3, geralmente fazemos a verificação do ambiente atual (tome a v0.20.1 como exemplo):

if (typeof web3 !== 'undefined') {
    
     
web3 = new Web3(web3.currentProvider); 
} else {
    
    
web3 = new Web3(new Web3.providers
.HttpProvider("http://localhost:8545")); 
}

Retorno de chamada assíncrono (retorno de chamada)

• O objetivo original do design da API web3js é principalmente para uso com nós RPC locais, portanto, solicitações HTTP síncronas são enviadas por padrão

• Se você deseja enviar uma solicitação assíncrona, pode passar uma função de retorno de chamada na última posição do parâmetro da função. A função de retorno de chamada é opcional (optioanl)

• O estilo de retorno de chamada que geralmente usamos é o que chamamos de "erro primeiro", por exemplo:

web3.eth.getBlock(48, function(error, result){
    
     
if(!error) 
console.log(JSON.stringify(result)); 
else 
console.error(error); 
});

Retorno de chamada para eventos Promise (v1.0.0)

• Para ajudar a integração do web3 em todos os tipos de projetos em diferentes padrões, a versão 1.0.0 oferece várias maneiras de lidar com funções assíncronas. A maioria dos objetos web3 permite que uma função de retorno de chamada seja passada como o último argumento da função e retorne uma promessa para encadear chamadas de função.

• Como um sistema blockchain, uma solicitação tem diferentes estágios finais. Para atender a esse requisito, a versão 1.0.0 agrupa o valor de retorno dessas chamadas de função em um "evento de promessa" (promiEvent), que é uma combinação de promessa e EventEmitter.

• PromiEvent é usado como uma promessa, com a adição dos métodos .on, .once e .off

web3.eth.sendTransaction({
    
    from: '0x123...', data: '0x432...'}) 
.once('transactionHash', function(hash){
    
     ... }) 
.once('receipt', function(receipt){
    
     ... }) 
.on('confirmation', function(confNumber, receipt){
    
     ... }) 
.on('error', function(error){
    
     ... }) 
.then(function(receipt){
    
     
// will be fired once the receipt is mined });

Application Binary Interface (ABI) • web3.js cria um objeto JavaScript através da interface json (Application Binary Interface, ABI) do contrato inteligente Ethereum, que é usado para
descrever no código js

• função (funções) • tipo: tipo de função, "função" padrão, também pode ser "construtor" • constante, pagável, estadoMutabilidade: mutabilidade de estado da função
• entradas, saídas: entrada de função, lista de descrição de parâmetro de saída
• eventos (eventos) • tipo: tipo, sempre "evento" • entradas: lista de objetos de entrada, incluindo nome, tipo, solicitações de
lote indexadas (solicitações de lote) • solicitações de lote nos permitem solicitar solicitações e processá-las juntas.

• Observação: solicitações em massa não serão mais rápidas. Na verdade, em alguns casos, pode ser mais rápido fazer muitas solicitações de uma vez porque as solicitações são tratadas de forma assíncrona.

• As solicitações em lote são usadas principalmente para garantir a ordem das solicitações e são processadas em série.

var batch = web3.createBatch(); 
batch.add(web3.eth.getBalance.request('0x0000000000000000
000000000000000000000000', 'latest', callback)); 
batch.add(web3.eth.contract(abi).at(address).balance.request(a
ddress, callback2)); 
batch.execute();

API comum - consulta de informações básicas

Ver versão web3

• v0.2x.x:web3.version.api
• v1.0.0:web3.version

Visualize a versão do nó (clientVersion) à qual o web3 está conectado

• Síncrono: web3.version.node
• Assíncrono: web3.version.getNode((erro,resultado)=>{console.log(resultado)})
• v1.0.0: web3.eth.getNodeInfo().then(console. registro)

Consulta de informações básicas

obter id de rede

• Síncrono: web3.version.network
• Assíncrono: web3.version.getNetwork((err, res)=>{console.log(res)})
• v1.0.0: web3.eth.net.getId().then( console.log)

Obtenha a versão do protocolo Ethereum do nó

• Síncrono: web3.version.ethereum
• Assíncrono: web3.version.getEthereum((err, res)=>{console.log(res)})
• v1.0.0: web3.eth.getProtocolVersion().then(console. registro)

Consulta de status da rede

Se houver um nó conectado/escutando, retorne verdadeiro/falso

• Síncrono: web3.isConnect() ou web3.net.listening
• Assíncrono: web3.net.getListening((err,res)=>console.log(res))
• v1.0.0: web3.eth.net.isListening( ).then(console.log)

Ver nós de peer atualmente conectados

• Síncrono: web3.net.peerCount
• Assíncrono: web3.net.getPeerCount((err,res)=>console.log(res))
• v1.0.0: web3.eth.net.getPeerCount().then(console. registro)

Fornecedor

Veja o provedor web3 atualmente definido

• web3.currentProvider

Visualize o provedor web3 (v1.0.0) definido pelo ambiente do navegador • web3.givenProvider

definir provedor

• web3.setProvider(provedor)
• web3.setProvider(novo web3.providers.HttpProvider('http://localhost:8545'))

abordagem geral da ferramenta web3

Conversão de Unidade de Éter

• web3.deWei web3.toWei

conversão de tipo de dados

• web3.toString web3.toDecimal web3.toBigNumber

conversão de codificação de caracteres

• web3.toHex web3.toAscii web3.toUtf8 web3.fromUtf8

endereço relacionado

• web3.isAddress web3.toChecksumAddress
web3.eth – relacionado à conta

consulta de base de moedas

• Síncrono: web3.eth.coinbase
• Assíncrono: web3.eth.getCoinbase( (err, res)=>console.log(res) )
• v1.0.0: web3.eth.getCoinbase().then(console.log)

Consulta de conta

• Síncrono: web3.eth.accounts
• Assíncrono: web3.eth.getAccounts( (err, res)=>console.log(res) )
• v1.0.0: web3.eth.getAccounts().then(console.log)

Correlação de bloco

Consulta de altura do bloco

• Síncrono: web3.eth.blockNumber
• Assíncrono: web3.eth.getBlockNumber( callback )

consulta de preço de gás

• Síncrono: web3.eth.gasPrice
• Assíncrono: web3.eth.getGasPrice( callback )

bloquear consulta

• 同步:web3.eth.getBlockNumber( hashStringOrBlockNumber
[ ,returnTransactionObjects] )
• 异步:web3.eth.getBlockNumber( hashStringOrBlockNumber, callback )
块中交易数量查询
• 同步:
web3.eth.getBlockTransactionCount( hashStringOrBlockNumber ) • 异步:
web3.eth.getBlockTransactionCount( hashStringOrBlockNumber
, callback )

Transação relacionada

Consulta de saldo

• 同步:web3.eth.getBalance(addressHexString [, defaultBlock])
• 异步:web3.eth.getBalance(addressHexString [, defaultBlock]
[, callback])

Consulta de transação

• Síncrono: web3.eth.getTransaction(transactionHash)
• Assíncrono: web3.eth.getTransaction(transactionHash [, callback])

Relacionado à execução da transação
• Consulta de recebimento da transação (bloco inserido)
• Síncrono: web3.eth.getTransactionReceipt(hashString)
• Assíncrono: web3.eth.getTransactionReceipt(hashString [, callback])
• Consumo estimado de gás
• Síncrono: web3.eth. estimadoGas( callObject)
• Assíncrono: web3.eth.estimateGas(callObject [, callback])

enviar transação

• web3.eth.sendTransaction(transactionObject [, callback])
• Objeto de transação:
• from: endereço de envio
• to: endereço de recebimento, se for uma transação de criação de contrato, pode ser deixado em branco
• value: valor da transação, em wei, opcional
• gas: o limite superior de gás consumido pela transação, opcional
• gasPrice: o preço unitário do gás da transação, opcional
• data: os dados da string transportados pela transação, opcional
• nonce: o valor inteiro do nonce, opcional

chamada de mensagem

• web3.eth.call(callObject [, defaultBlock] [, callback])
• Parâmetros:
• Objeto de chamada: igual ao objeto de transação, exceto que from é opcional
• Bloco padrão: padrão "latest", que pode ser passado no especificado Altura do bloco
• Função de retorno de chamada, se nenhuma for chamada de forma síncrona

var result = web3.eth.call({
    
     to: 
"0xc4abd0339eb8d57087278718986382264244252f", 
data: 
"0xc6888fa100000000000000000000000000000000000000000000000000
0 0000000000003" }); 
console.log(result);

Filtragem de registros (monitoramento de eventos)

web3.eth.filter( filterOptions [ , callback ] )
// filterString 可以是 'latest' or 'pending' 
var filter = web3.eth.filter(filterString); 
// 或者可以填入一个日志过滤 options 
var filter = web3.eth.filter(options); 
// 监听日志变化
filter.watch(function(error, result){
    
     if (!error) console.log(result); }); 
// 还可以用传入回调函数的方法,立刻开始监听日志
web3.eth.filter(options, function(error, result){
    
     
if (!error) console.log(result); 
});

Relacionado ao contrato - criar um contrato

web3.eth.contract
var MyContract = web3.eth.contract(abiArray); 
// 通过地址初始化合约实例
var contractInstance = MyContract.at(address); 
// 或者部署一个新合约
var contractInstance = MyContract.new([constructorParam1] 
[, constructorParam2], {
    
    data: '0x12345...', from: 
myAccount, gas: 1000000});

função de contrato de chamada

• 可以通过已创建的合约实例,直接调用合约函数
// 直接调用,自动按函数类型决定用 sendTransaction 还是 call
myContractInstance.myMethod(param1 [, param2, ...] [, 
transactionObject] [, defaultBlock] [, callback]); 
// 显式以消息调用形式 call 该函数
myContractInstance.myMethod.call(param1 [, param2, ...] [, 
transactionObject] [, defaultBlock] [, callback]); 
// 显式以发送交易形式调用该函数
myContractInstance.myMethod.sendTransaction(param1 [, 
param2, ...] [, transactionObject] [, callback]); 

Ouça os eventos do contrato

• 合约的 event 类似于 filter,可以设置过滤选项来监听
var event = myContractInstance.MyEvent({
    
    valueA: 23} 
[, additionalFilterObject]) 
// 监听事件
event.watch(function(error, result){
    
     if (!error) console.log(result); }); 
//还可以用传入回调函数的方法,立刻开始监听事件
var event = myContractInstance.MyEvent([{
    
    valueA: 23}] 
[, additionalFilterObject] , function(error, result){
    
     
if (!error) console.log(result); 
}
);

Acho que você gosta

Origin blog.csdn.net/david2000999/article/details/120176244
Recomendado
Clasificación