título do diretório
- Introdução ao web3.js
- carregamento do módulo web3
- API comum - consulta de informações básicas
- abordagem geral da ferramenta web3
-
- Conversão de Unidade de Éter
- conversão de tipo de dados
- conversão de codificação de caracteres
- endereço relacionado
- consulta de base de moedas
- Consulta de conta
- Correlação de bloco
- Transação relacionada
- chamada de mensagem
- Filtragem de registros (monitoramento de eventos)
- Relacionado ao contrato - criar um contrato
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);
}
);