Как отправлять эфиры программно без метамаски
9 февраля 2023 г.Введение
В этом руководстве показано, как передавать эфиры с помощью кода, а не с помощью Metamask. В реализации используется библиотека ethers, которая позволяет JavaScript взаимодействовать с сетями и контрактами Ethereum.
По завершении вы получите более глубокое понимание того, как программно передавать эфиры, и у вас будет рабочий образец для дальнейшего использования.
Отправка эфиров без метамаски
Вот полный код, выполняющий программную транзакцию эфиров между аккаунтами.
https://gist.github.com/Daltonic/bc4f985537de2bd700eef8289a3617a1?embedable=true р>
Чтобы глубже погрузиться в мир разработки Web3, посмотрите это видео о том, как создать децентрализованную автономную организацию.
https://www.youtube.com/watch?v=Gm442Ihv1GU&embedable=true а>
Давайте начнем с более подробного изучения кода и понимания того, как он работает.
Клонируйте этот репозиторий в предпочитаемый вами рабочий каталог с помощью приведенной ниже команды. Перед выполнением этих шагов убедитесь, что на вашем локальном компьютере установлены NodeJs и Git Bash.
git clone https://github.com/Daltonic/tailwind_ethers_starter_kit <PROJECT NAME>
Затем вам нужно установить пакеты с помощью npm install
или yarn install
в этом каталоге проекта.
Затем создайте файл в корне этого проекта с именем transactions.js
и начните с импорта библиотеки **ethers**
из каски:
const { ethers } = require('hardhat')
Затем он определяет две вспомогательные функции, **toWei**
и **fromWei**
, для преобразования эфира в его наименьшую единицу Wei. Это важно, потому что сеть Ethereum работает в Wei, поэтому мы должны убедиться, что суммы, которые мы отправляем, находятся в Wei.
const toWei = (num) => ethers.utils.parseEther(num.toString())
const fromWei = (num) => ethers.utils.formatEther(num)
Эти две функции, **toWei**
и **fromWei**
, преобразуют эфир в wei. **toWei**
преобразует значение в эфире в его эквивалент в wei, а **fromWei**
делает обратное. Методы **parseEther**
и **formatEther**
из модуля **ethers.utils**
используются для этого преобразования. .
const sendEthers = async (recipientAddress, amountInWei) => {
return new Promise(async (resolve, reject) => {
const privateKey =
'0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80';
const provider = new ethers.providers.JsonRpcProvider(
'http://localhost:8545',
);
const wallet = new ethers.Wallet(privateKey, provider);
const gasPrice = provider.getGasPrice();
const nonce = provider.getTransactionCount(wallet.address, 'latest');
const transaction = {
to: recipientAddress,
value: amountInWei,
gasPrice,
gasLimit: ethers.utils.hexlify(100000),
nonce,
};
await wallet
.sendTransaction(transaction)
.then((transactionHash) => resolve(transactionHash))
.catch((error) => reject(error));
});
};
Функция **sendEthers**
предназначена для отправки эфиров из одного кошелька в другой. Он принимает два параметра: **recipientAddress**
и **amountInWei**
, которые представляют адрес получателя и сумму для отправки соответственно.
Создаются **privateKey**
и **provider**
. Транзакция подписывается закрытым ключом, и провайдер связывается с сетью Ethereum. С помощью закрытого ключа и провайдера создается экземпляр кошелька
.
Методы поставщика getGasPrice
и getTransactionCount используются для получения текущего gasPrice
и одноразового номера кошелька соответственно. gasPrice
представляет собой стоимость одной единицы газа, а одноразовый номер представляет количество транзакций, отправленных из кошелька.
Объект **transaction**
создается со следующими параметрами: **to**
(recipientAddress), **value**
( количествоInWei), **gasPrice**
, **gasLimit**
(100000 в шестнадцатеричном формате) и **nonce**
. Затем для отправки транзакции используется метод **sendTransaction**
экземпляра **wallet**
.
Если транзакция прошла успешно, обещание разрешается с помощью хэша транзакции, в противном случае оно отклоняется с ошибкой.
const getBalance = async (walletAddress) => {
return new Promise(async (resolve, reject) => {
const provider = new ethers.providers.JsonRpcProvider(
'http://localhost:8545',
)
await provider
.getBalance(walletAddress)
.then((balanceInWei) => resolve(balanceInWei))
.catch((error) => reject(error))
})
}
Функция **getBalance**
возвращает обещание, которое разрешается балансом кошелька в wei. Функция создает объект JsonRpcProvider и вызывает для него метод **getBalance**
.
В качестве аргумента метод принимает адрес кошелька. Метод **getBalance**
возвращает обещание, которое разрешается балансом кошелька в wei. Если возникает ошибка, обещание отклоняется с ошибкой.
Посмотрите видео ниже, чтобы узнать, как кодировать смарт-контракт блога в Solidity. Это даст вам преимущество в том, как продвигаться в разработке Web3.
https://www.youtube.com/watch?v=UbidE-tAibk&embedable =правда
async function main() {
// the rest of the codes goes in here
}
Функция **main**
предназначена для передачи эфиров.
;[sender, receiver] = await ethers.getSigners()
const amountInWei = toWei(4.7)
console.log('n')
let balance = await getBalance(sender.address)
console.log('Sender balance before transfer: ', fromWei(balance))
balance = await getBalance(receiver.address)
console.log('Receiver balance before transfer: ', fromWei(balance))
console.log('n')
Метод **ethers.getSigners**
вызывается для получения адресов отправителя и получателя. Отправляемая сумма конвертируется в wei с помощью функции **toWei**
.
Баланс отправителя и получателя регистрируется перед переводом путем двойного вызова функции **getBalance**
и передачи адресов отправителя и получателя в качестве аргументов.
await sendEthers(receiver.address, amountInWei).then((data) =>
console.log('Transaction Details: ', data),
)
console.log('n')
Функция **sendEthers**
вызывается для инициации передачи эфиров. Функция принимает в качестве аргументов адрес получателя и сумму в wei.
Функция **sendEthers**
возвращает обещание, которое разрешается с деталями транзакции. Этот промис зарегистрирован в консоли.
balance = await getBalance(sender.address)
console.log('Sender balance after transfer: ', fromWei(balance))
balance = await getBalance(receiver.address)
console.log('Receiver balance after transfer: ', fromWei(balance))
console.log('n')
Баланс отправителя и получателя снова регистрируется, чтобы показать, что перевод прошел успешно. Функция **getBalance**
вызывается дважды, чтобы получить баланс отправителя и получателя после перевода. Результат регистрируется на консоли.
Заключение
В заключение, в этом руководстве показано, как программно отправлять эфиры без использования метамаски.
Предоставленный код демонстрирует использование библиотеки **ethers**
в JavaScript для взаимодействия с сетью Ethereum и выполнения программной транзакции эфиров между учетными записями.
Код включает в себя вспомогательные функции для преобразования между эфиром и его наименьшей единицей, вэй, а также функции для отправки эфиров и получения баланса кошелька.
Код также демонстрирует использование закрытых ключей, провайдеров, кошельков, цен на газ, одноразовых номеров и транзакций в Ethereum.
Статья послужила хорошей основой для понимания того, как программно отправлять эфиры, и служит полезным справочником для тех, кто только начинает работать в этой области.
Получите копию моей книги "Захват разработки смарт-контрактов", чтобы получить навыки и знания, необходимые для того, чтобы стать востребованным разработчиком смарт-контрактов.
Не забудьте зарегистрироваться на моем канале, чтобы смотреть различные видео о разработке Web3. Будьте осторожны до нашего следующего урока.
Об авторе
Госпел Дарлингтон – разработчик комплексного блокчейна с 6+
летним опытом работы в индустрии разработки программного обеспечения.
Совмещая разработку программного обеспечения, написание текстов и преподавание, он демонстрирует, как создавать децентрализованные приложения в блокчейн-сетях, совместимых с EVM.
Для получения дополнительной информации о нем посетите и подпишитесь на его страницу в Twitter, Github, LinkedIn или его веб-сайт.
Если вы увлечены разработкой Web3, не забудьте подписаться на мой канал< /strong> для различных обучающих видео. Если вы хотите связаться со мной, ознакомьтесь с моими услугами. р>
Оригинал