web3-eth
Пакет предоставляет мощный набор функций.,Может взаимодействовать с блокчейном Ethereum и смарт-контрактами. В этом уроке,Мы подскажем вам, как использоватьweb3.jsВерсия4изweb3-eth
Сумкаизбазовые знания。В примерах мы будем использоватьTypeScript。
Прежде чем мы начнем писать и развертывать наш контракт, нам необходимо настроить нашу среду. Для этого нам необходимо установить следующее:
Сначала создайте новый каталог проекта для вашего проекта и перейдите к нему:
$ mkdir smart-contract-tutorial
$ cd smart-contract-tutorial
а затем использоватьnpm
Проект инициализации:
$ npm init -y
это будет в твоемиз Каталог проектасерединасоздать новыйизpackage.json
документ。
$ npm i typescript @types/node
Это установит машинопись для нашего проекта.
На этом этапе мы настроим библиотеку web3.js и подключимся к сети Ganache. Итак, если у вас еще не запущен Ganache, обязательно сделайте это.
первый,использоватьnpmУстановитьweb3
Сумка:
$ npm i web3
Следующий,над вамииз Каталог проектасередина Создайте файл с именемindex.ts
изновыйдокумент,и добавьте в него следующий код:
import { Web3 } from 'web3';
// Set up a connection to the Ganache network
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545'));
/* NOTE:
instead of using ganache, you can also interact with a testnet/mainnet using another provider
https://app.infura.io/
https://dashboard.alchemy.com/
or use a public provider https://chainlist.org/
*/
// Log the current block number to the console
const block = await web3.eth.getBlockNumber();
console.log('Last block:', block);
// ↳ Last block: 4975299n
Этот код устанавливает соединение с сетью Ganache и записывает текущий номер блока на консоль.
Запустите следующую команду, чтобы проверить соединение:
$ npx ts-node index.ts
если все в порядке,Вы должны увидеть текущий номер блока в консоли. Однако,Если вы получили ошибку,Причина в томconnect ECONNREFUSED 127.0.0.1:7545
,Затем, пожалуйста, проверьте еще раз, если вы местныйиз7545
запустить в портуGanache。
На этом этапе мы развернем смарт-контракт в сети Ganache с помощью web3.js.
В первом примере,Мы отправим простойизторговля。Создайте файл с именемtransaction.ts
издокумент,и заполните его следующим кодом:
import { Web3 } from 'web3';
import fs from 'fs';
import path from 'path';
// Set up a connection to the Ethereum network
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545'));
web3.eth.Contract.handleRevert = true;
async function interact() {
//fetch all the available accounts
const accounts = await web3.eth.getAccounts();
console.log(accounts);
let balance1, balance2;
//The initial balances of the accounts should be 100 Eth (10^18 wei)
balance1 = await web3.eth.getBalance(accounts[0]);
balance2 = await web3.eth.getBalance(accounts[1]);
console.log(balance1, balance2);
//create a transaction sending 1 Ether from account 0 to account 1
const transaction = {
from: accounts[0],
to: accounts[1],
// value should be passed in wei. For easier use and to avoid mistakes,
// we utilize the auxiliary `toWei` function:
value: web3.utils.toWei('1', 'ether'),
};
//send the actual transaction
const transactionHash = await web3.eth.sendTransaction(transaction);
console.log('transactionHash', transactionHash);
balance1 = await web3.eth.getBalance(accounts[0]);
balance2 = await web3.eth.getBalance(accounts[1]);
// see the updated balances
console.log(balance1, balance2);
// irrelevant with the actual transaction, just to know the gasPrice
const gasPrice = await web3.eth.getGasPrice();
console.log(gasPrice);
}
(async () => {
await interact();
})();
Важная информация При запуске блокчейна локальной разработки с использованием Ganache,Все учетные записи обычно разблокированы по умолчанию.,Обеспечивает легкий доступ и выполнение транзакций во время разработки и тестирования.。Это означает, что его можно использовать без закрытого ключа или парольной фразы.изполучить доступ к этим аккаунтам。Вот почему в нашем примере мы просто используем
from
Поле указывает аккаунт。
Выполните следующую команду:
$ npx ts-node transaction.ts
Если все в порядке, вы должны увидеть что-то вроде этого:
[
'0xc68863f36C48ec168AD45A86c96347D520eac1Cf',
'0x80c05939B307f9833d905A685575b45659d3EA70',
'0xA260Cf742e03B48ea1A2b76b0d20aaCfe6F85E5E',
'0xf457b8C0CBE41e2a85b6222A97b7b7bC6Df1C0c0',
'0x32dF9a0B365b6265Fb21893c551b0766084DDE21',
'0x8a6A2b8b00C1C8135F1B25DcE54f73Ee18bEF43d',
'0xAFc526Be4a2656f7E02501bdf660AbbaA8fb3d7A',
'0xc32618116370fF776Ecd18301c801e146A1746b3',
'0xDCCD49880dCf9603835B0f522c31Fcf0579b46Ff',
'0x036006084Cb62b7FAf40B979868c0c03672a59B5'
]
100000000000000000000n 100000000000000000000n
transactionHash {
transactionHash: '0xf685b64ccf5930d3779a33335ca22195b68901dbdc439f79dfc65d87c7ae88b0',
transactionIndex: 0n,
blockHash: '0x5bc044ad949cfd32ea4cbb249f0292e7dded44c3b0f599236c6d20ddaa96cc06',
blockNumber: 1n,
from: '0xc68863f36c48ec168ad45a86c96347d520eac1cf',
to: '0x80c05939b307f9833d905a685575b45659d3ea70',
gasUsed: 21000n,
cumulativeGasUsed: 21000n,
logs: [],
status: 1n,
logsBloom: '0x......000'
}
98999580000000000000n 101000000000000000000n
20000000000n
На что следует обратить внимание Чтобы рассчитать фактически потраченный эфир, нам нужно вычислить отправленную сумму плюс комиссию. Начальный баланс = (остаток + стоимость + gasUsed*gasPrice). В нашем случае:
98999580000000000000 + 1000000000000000000 + (20000000000*21000) = 100 Ether
В следующем примере,мы будемиспользоватьestimateGas
Функция просмотра ожиданий развертывания контрактаизgas。(О контрактеиз Дополнительная информация,Пожалуйста, обратитесь к соответствующемуиз Учебное пособие)。Создайте файл с именемestimate.ts
издокумент,и заполните его следующим кодом:
import { Web3, ETH_DATA_FORMAT, DEFAULT_RETURN_FORMAT } from 'web3';
async function estimate() {
// abi of our contract
const abi = [
{
inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }],
stateMutability: 'nonpayable',
type: 'constructor',
},
{
inputs: [],
name: 'myNumber',
outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
stateMutability: 'view',
type: 'function',
},
{
inputs: [{ internalType: 'uint256', name: '_myNumber', type: 'uint256' }],
name: 'setMyNumber',
outputs: [],
stateMutability: 'nonpayable',
type: 'function',
},
];
const web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:7545'));
//get the available accounts
const accounts = await web3.eth.getAccounts();
let acc = await accounts[0];
let contract = new web3.eth.Contract(abi);
const deployment = contract.deploy({
data: '0x608060405234801561001057600080fd5b506040516101d93803806101d983398181016040528101906100329190610054565b806000819055505061009e565b60008151905061004e81610087565b92915050565b60006020828403121561006657600080fd5b60006100748482850161003f565b91505092915050565b6000819050919050565b6100908161007d565b811461009b57600080fd5b50565b61012c806100ad6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806323fd0e401460375780636ffd773c146051575b600080fd5b603d6069565b6040516048919060bf565b60405180910390f35b6067600480360381019060639190608c565b606f565b005b60005481565b8060008190555050565b60008135905060868160e2565b92915050565b600060208284031215609d57600080fd5b600060a9848285016079565b91505092915050565b60b98160d8565b82525050565b600060208201905060d2600083018460b2565b92915050565b6000819050919050565b60e98160d8565b811460f357600080fd5b5056fea2646970667358221220d28cf161457f7936995800eb9896635a02a559a0561bff6a09a40bfb81cd056564736f6c63430008000033',
// @ts-expect-error
arguments: [1],
});
let estimatedGas = await deployment.estimateGas({ from: acc }, DEFAULT_RETURN_FORMAT);
// the returned data will be formatted as a bigint
console.log('Default format:', estimatedGas);
estimatedGas = await deployment.estimateGas({ from: acc }, ETH_DATA_FORMAT);
// the returned data will be formatted as a hexstring
console.log('Eth format:', estimatedGas);
}
(async () => {
await estimate();
})();
Выполните следующую команду:
$ npx ts-node estimate.ts
Если все в порядке, вы должны увидеть что-то вроде этого:
Default format: 140648n
Eth format: 0x22568
На что следует обратить внимание отweb3.jsвозвращатьсяиз Числа по умолчанию
BigInt
возврат формата。В этом примере,насиспользовать ПонятноETH_DATA_FORMAT
параметр,Его можно передать в большинство методов web3.js.,чтобы отформатировать результат в шестнадцатеричном формате.
В следующем примере,мы подпишем сделку,ииспользоватьsendSignedTransaction
отправить подписанныйизторговля。Создайте файл с именемsendSigned.ts
издокумент,и заполните его следующим кодом:
import { Web3 } from 'web3';
const web3 = new Web3('http://localhost:7545');
//make sure to copy the private key from ganache
const privateKey = '0x0fed6f64e01bc9fac9587b6e7245fd9d056c3c004ad546a17d3d029977f0930a';
const value = web3.utils.toWei('1', 'ether');
async function sendSigned() {
const accounts = await web3.eth.getAccounts();
const fromAddress = accounts[0];
const toAddress = accounts[1];
// Create a new transaction object
const tx = {
from: fromAddress,
to: toAddress,
value: value,
gas: 21000,
gasPrice: web3.utils.toWei('10', 'gwei'),
nonce: await web3.eth.getTransactionCount(fromAddress),
};
// Sign the transaction with the private key
const signedTx = await web3.eth.accounts.signTransaction(tx, privateKey);
// Send the signed transaction to the network
const receipt = await web3.eth.sendSignedTransaction(signedTx.rawTransaction);
console.log('Transaction receipt:', receipt);
}
(async () => {
await sendSigned();
})();
Выполните следующую команду:
$ npx ts-node sendSigned.ts
Если все в порядке, вы должны увидеть что-то вроде этого:
Transaction receipt: {
transactionHash: '0x742df8f1ad4d04f6e5632889109506dbb7cdc8a6a1c80af3dfdfc71a67a04ddc',
transactionIndex: 0n,
blockNumber: 1n,
blockHash: '0xab6678d76499b0ee383f182ab8f848ba27bd787e70e227524255c86b25224ed3',
from: '0x66ce32a5200aac57b258c4eac26bc1493fefddea',
to: '0x0afcfc43ac454348d8170c77b1f912b518b4ebe8',
cumulativeGasUsed: 21000n,
gasUsed: 21000n,
logs: [],
logsBloom: '0x...0000',
status: 1n,
effectiveGasPrice: 10000000000n,
type: 2n
}
Чтобы воспользоваться преимуществами функциональности пакета web3-eth, вы можете импортировать этот пакет напрямую, а не полагаться на глобальный пакет web3, что уменьшит размер сборки.
НапримериспользоватьgetBalanceметод:
import { Web3Eth } from 'web3-eth';
const eth = new Web3Eth('http://localhost:7545');
async function test() {
const accounts = await eth.getAccounts();
const currentBalance = await eth.getBalance(accounts[0]);
console.log('Current balance:', currentBalance);
// 115792089237316195423570985008687907853269984665640564039437613106102441895127n
}
(async () => {
await test();
})();
import { Web3Eth } from 'web3-eth';
const eth = new Web3Eth('http://localhost:8545');
console.log('defaultTransactionType before', eth.config.defaultTransactionType);
// defaultTransactionType before 0x0
eth.setConfig({ defaultTransactionType: '0x1' });
console.log('eth.config.defaultTransactionType after', eth.config.defaultTransactionType);
// defaultTransactionType before 0x1
В Эфириуме «традиционная «Торговля» обычно относится к традиционной транзакции, в которой плата за газ явно устанавливается отправителем и может меняться в зависимости от спроса в сети. Эти традиционные торговля реализует Предложение по улучшению Ethereum (EIP) До 1559 года это было очень распространено в сети Ethereum.
К основным особенностям традиционной торговли относятся:
Хотя EIP-1559 значительно улучшает взаимодействие с пользователем.,Но традиционная торговля по-прежнему поддерживается в сети Ethereum.,Если пользователь желает,Транзакции могут продолжать отправляться с указанием вручную цен на газ и лимитов газа. Однако,Механизм EIP-1559 теперь является рекомендуемым методом для большинства транзакций.,потому что это упрощает процесс,Уменьшает возможность переплаты за комиссионные.
отправитьтрадиционная торговля, пожалуйста, используйте следующий код:
import { Web3 } from 'web3';
const web3 = new Web3('http://localhost:8545');
async function test() {
const privateKey = 'YOUR PRIVATE KEY HERE';
// add private key to wallet to have auto-signing transactions feature
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
// create transaction object
const tx = {
from: account.address,
to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
value: '0x1',
gas: BigInt(21000),
gasPrice: await web3.eth.getGasPrice(),
type: BigInt(0), // <- specify type
};
// send transaction
const receipt = await web3.eth.sendTransaction(tx);
console.log('Receipt:', receipt);
// Receipt: {
// blockHash: '0xc0f2fea359233b0843fb53255b8a7f42aa7b1aff53da7cbe78c45b5bac187ad4',
// blockNumber: 21n,
// cumulativeGasUsed: 21000n,
// effectiveGasPrice: 2569891347n,
// from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
// gasUsed: 21000n,
// logs: [],
// logsBloom: '0x0...00000',
// status: 1n,
// to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
// transactionHash: '0x0ffe880776f5631e4b64caf521bd01cd816dd2cc29e533bc56f392211856cf9a',
// transactionIndex: 0n,
// type: 0n
// }
}
(async () => {
await test();
})();
Предложение по улучшению Ethereum 2930 — это предлагаемое изменение сети Ethereum, которое было реализовано в рамках хард-форка Berlin, активированного в апреле 2021 года. В EIP-2930 появилась функция под названием «Типы транзакций и списки доступа». Это улучшение повышает эффективность использования газа при определенных взаимодействиях смарт-контрактов и обеспечивает большую гибкость при указании того, кто может получить доступ к определенным ресурсам в смарт-контракте. Ниже приведены основные компоненты EIP-2930:
EIP-2930 является частью постоянных усилий Ethereum по повышению эффективности сети и снижению транзакционных издержек, что делает ее более доступной и масштабируемой для децентрализованных приложений и пользователей. Это особенно полезно для взаимодействия с контрактами с отслеживанием состояния, которые полагаются на определенные операции хранения и механизмы контроля доступа.
Отправить Транзакцию EIP-2930, используйте код ниже:
import {Web3} from 'web3';
const web3 = new Web3('http://localhost:8545');
async function test() {
const privateKey = 'YOUR PRIVATE KEY HERE';
// add private key to wallet to have auto-signing transactions feature
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
// create transaction object
const tx = {
from: account.address,
to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
value: '0x1',
gasLimit: BigInt(21000),
type: BigInt(1), // <- specify type
// gasPrice - you can specify this property directly or web3js will fill this field automatically
};
// send transaction
const receipt = await web3.eth.sendTransaction(tx);
console.log('Receipt:', receipt);
// Receipt: {
// blockHash: '0xd8f6a3638112d17b476fd1b7c4369d473bc1a484408b6f39dbf64410df44adf6',
// blockNumber: 24n,
// cumulativeGasUsed: 21000n,
// effectiveGasPrice: 2546893579n,
// from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
// gasUsed: 21000n,
// logs: [],
// logsBloom: '0x...0000',
// status: 1n,
// to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
// transactionHash: '0xd1d682b6f6467897db5b8f0a99a6be2fb788d32fbc1329b568b8f6b2c15e809a',
// transactionIndex: 0n,
// type: 1n
// }
}
(async () => {
await test();
})();
Ниже приведен пример использования списков доступа в транзакциях.
Уведомление Вы можете найти это здесь
Greeter
договоризкод
import {Web3} from 'web3';
import { GreeterAbi, GreeterBytecode } from './fixture/Greeter';
const web3 = new Web3('http://localhost:8545');
async function test() {
const privateKey = 'YOUR PRIVATE KEY HERE';
// add private key to wallet to have auto-signing transactions feature
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
// deploy contract
const contract = new web3.eth.Contract(GreeterAbi);
const deployedContract = await contract
.deploy({
data: GreeterBytecode,
arguments: ['My Greeting'],
})
.send({ from: account.address });
deployedContract.defaultAccount = account.address;
const transaction = {
from: account.address,
to: deployedContract.options.address,
data: '0xcfae3217', // greet function call data encoded
};
const { accessList } = await web3.eth.createAccessList(transaction, 'latest');
console.log('AccessList:', accessList);
// AccessList: [
// {
// address: '0xce1f86f87bd3b8f32f0fb432f88e848f3a957ed7',
// storageKeys: [
// '0x0000000000000000000000000000000000000000000000000000000000000001'
// ]
// }
// ]
// create transaction object with accessList
const tx = {
from: account.address,
to: deployedContract.options.address,
gasLimit: BigInt(46000),
type: BigInt(1), // <- specify type
accessList,
data: '0xcfae3217',
// gasPrice - you can specify this property directly or web3js will fill this field automatically
};
// send transaction
const receipt = await web3.eth.sendTransaction(tx);
console.log('Receipt:', receipt);
// Receipt: {
// blockHash: '0xc7b9561100c8ff6f1cde7a05916e86b7d037b2fdba86b0870e842d1814046e4b',
// blockNumber: 43n,
// cumulativeGasUsed: 26795n,
// effectiveGasPrice: 2504325716n,
// from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
// gasUsed: 26795n,
// logs: [],
// logsBloom: '0x...00000000000',
// status: 1n,
// to: '0xce1f86f87bd3b8f32f0fb432f88e848f3a957ed7',
// transactionHash: '0xa49753be1e2bd22c2a8e2530726614c808838bb0ebbed72809bbcb34f178799a',
// transactionIndex: 0n,
// type: 1n
// }
}
(async () => {
await test();
})();
Предложение по улучшению Ethereum 1559 — это серьезное обновление рынка комиссий сети Ethereum и механизма ценообразования за транзакции. Он был реализован в рамках хардфорка Ethereum London, который состоялся в августе 2021 года. EIP-1559 вносит несколько изменений в способ работы комиссий за транзакции в блокчейне Ethereum, основная цель которых — улучшить взаимодействие с пользователем и эффективность сети.
Вот некоторые ключевые функции и изменения, представленные EIP-1559:
EIP-1559 получил высокую оценку за его потенциал создания более удобной и эффективной системы комиссий за транзакции, что делает сеть Ethereum более доступной и предсказуемой для пользователей. Это также рассматривается как важный шаг в переходе на Ethereum 2.0, целью которого является решение проблем масштабируемости и устойчивости сети.
Отправить Транзакцию EIP-1559, используйте код ниже:
import { Web3 } from 'web3';
const web3 = new Web3('http://localhost:8545');
async function test() {
const privateKey = 'YOUR PRIVATE KEY HERE';
// add private key to wallet to have auto-signing transactions feature
const account = web3.eth.accounts.privateKeyToAccount(privateKey);
web3.eth.accounts.wallet.add(account);
// create transaction object
const tx = {
from: account.address,
to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
value: '0x1',
gasLimit: BigInt(21000),
type: BigInt(2), // <- specify type
// maxFeePerGas - you can specify this property directly or web3js will fill this field automatically
// maxPriorityFeePerGas - you can specify this property directly or web3js will fill this field automatically
};
// send transaction
const receipt = await web3.eth.sendTransaction(tx);
console.log('Receipt:', receipt);
// Receipt: {
// blockHash: '0xfe472084d1471720b6887071d32a793f7c4576a489098e7d2a89aef205c977fb',
// blockNumber: 23n,
// cumulativeGasUsed: 21000n,
// effectiveGasPrice: 2546893579n,
// from: '0xe2597eb05cf9a87eb1309e86750c903ec38e527e',
// gasUsed: 21000n,
// logs: [],
// logsBloom: '0x0000...00000000000',
// status: 1n,
// to: '0x27aa427c1d668ddefd7bc93f8857e7599ffd16ab',
// transactionHash: '0x5c7a3d2965b426a5776e55f049ee379add44652322fb0b9fc2f7f57b38fafa2a',
// transactionIndex: 0n,
// type: 2n
// }
}
(async () => {
await test();
})();
В этом уроке,нас学习Понятно如何использоватьweb3-eth
Сумкапоставлятьиздругойметод。
Вооружившись этими знаниями, вы можете начать экспериментировать с блокчейном Ethereum. Помните, это только начало, вам еще многое предстоит узнать об Ethereum и web3.js. Так что продолжайте исследовать, строить и получайте удовольствие!
Web3.js версии 4.x предоставляет мощный и простой в использовании интерфейс для взаимодействия с сетью Ethereum и создания децентрализованных приложений. Он был переписан на TypeScript, но для упрощения этого руководства мы взаимодействуем с ним на JavaScript.
Экосистема Ethereum постоянно развивается, и всегда есть чему поучиться и открыть. Продолжая развивать свои навыки и знания, продолжайте исследовать и пробовать новые технологии и инструменты для создания инновационных и децентрализованных решений.
estimateGas
函数来估算торговля所需изгаз。заявление:Эта работа принимаетС указанием авторства-Некоммерческая-ShareAlike 4.0 интернациональность (CC BY-NC-SA 4.0)Дать разрешение,При использовании указывайте источник.
blog: mengbin
Github: mengbin92
cnblogs: Влюбиться в воду невольно
Сообщество разработчиков облачных технологий Tencent:Мюнстер