Введение
Вы думаете о том, как стать успешным разработчиком блокчейна? Тогда этот учебник для вас.
Глобальный спрос на блокчейн-разработчиков сейчас просто зашкаливает. Технологические компании и стартапы ищут разработчиков блокчейна, которые могут помочь им создать удивительные технологии в этой области.
Но одним из важнейших навыков, которые вам понадобятся для получения этой высокооплачиваемой работы, является изучение solidity и обработки платежей по смарт-контрактам.
В этом учебнике вы изучите очень важный навык работы со смарт-контрактами для выплаты денег (Эфиров) на несколько счетов одним нажатием кнопки.
Кстати, если вы ищете личного репетитора, который ускорит вас в разработке web3, пожалуйста, запишитесь ко мне на занятие.
Если вы, как и я, воодушевлены, давайте приступим к этому уроку…
Посмотрите на моем канале YouTube БЕСПЛАТНЫЕ учебники по web3 прямо сейчас.
Почему вы должны освоить пакетную обработку платежей в Solidity
Solidity — это специфический язык программирования для обработки платежей между счетами. Это редкая особенность среди языков программирования в Интернете. Solidity был создан с целью управления транзакциями с цифровой валютой Ethereum, устраняя необходимость в посредниках и крупных корпорациях.
С программированием смарт-контрактов Solidity вам не нужен банк или какая-либо банковская дама для обработки вашего платежа, все ваши платежи будут обрабатываться в сети.
Но сам факт того, что Solidity дает вам возможность совершать цифровые транзакции быстрее, безопаснее и в больших масштабах, не означает, что вы сможете делать это идеально без обучения.
Поскольку эта финансовая сеть предоставила нам возможность быстро, безопасно и безгранично перемещать деньги между пунктами, она также привлекла хищные глаза воров, известных как (хакеры).
Да, они следят за слабыми местами в вашей системе, в частности за тем, как перемещаются деньги в вашем смарт-контракте. Когда они найдут способ использовать такую слабость, они разграбят вашу систему и сделают ваш бизнес неработоспособным.
Чтобы этого не произошло, вы должны понимать, как обрабатывать пакетные платежи с помощью смарт-контрактов.
Пример смарт-контракта для пакетных платежей
Я хочу проиллюстрировать это на примере смарт-контракта, который я создал под названием Payroll. Ниже приведен полный код смарт-контракта…
Отлично, выше представлен смарт-контракт для оплаты труда сотрудников компании в соответствии с их зарплатой. Давайте рассмотрим, как мы выполняем этот смарт-контракт шаг за шагом.
Шаг 1:
На этом первом шаге мы создаем структуру нашего смарт-контракта. Мы используем идентификатор лицензии MIT и диапазон компилятора от 0.7.0 до 0.9.0. Далее мы определили смарт-контракт с именем Payroll.
//SPDX-License-Identifier: MIT
pragma solidity >=0.7.0 <0.9.0;
contract Payroll {
// Codes goes here...
}
Шаг 2:
Здесь мы определяем основные переменные состояния для нашего смарт-контракта. CompanyAcc указывает счет или адрес развертывания. CompanyBal хранит все средства, которые поступают в компанию. Затем мы определили некоторые переменные для отслеживания общего количества работников, зарплат и платежей в нашем смарт-контракте.
address public companyAcc; // Owner's account
uint256 public companyBal; // Companies fund
uint256 public totalWorkers = 0;
uint256 public totalSalary = 0;
uint256 public totalPayment = 0;
mapping(address => bool) isWorker; // Identifies workers
Шаг 3:
Этот шаг определяет журнал событий смарт-контракта. Мы хотим, чтобы некоторые важные данные записывались в журнал при каждой успешной выплате. Данные, которые должны быть записаны здесь, включают Id выплаты, плательщика, общую сумму выплаченной зарплаты и время выплаты.
event Paid(
uint256 id,
address from,
uint256 totalSalary,
uint256 timestamp
);
Шаг 4:
Здесь указывается структура платежа. Struct — это ключевое слово solidity, обозначающее структуру. Мы хотим, чтобы у каждого сотрудника были следующие записи:
- Id, который должен быть беззнаковым целым числом.
- Адрес кошелька, указанный как рабочий.
- Указанная зарплата.
-
Временная метка, представляющая время присоединения к компании.
struct PaymentStruct {
uint256 id;
адрес работника;
uint256 зарплата;
uint256 timestamp;
}
PaymentStruct[] employees; //Массив сотрудников
Шаг 5:
В этом шаге мы создали модификатор под названием ownerOnly. Его единственная цель — защитить функцию от несанкционированного доступа. В какую бы функцию мы ни включили этот модификатор, доступ будет разрешен только владельцу компании, который в данном случае является разработчиком смарт-контракта.
modifier ownerOnly(){
require(msg.sender == companyAcc, "Owner reserved only");
_;
}
Шаг 6:
Здесь мы устанавливаем адрес развертывателя в качестве учетной записи компании.
constructor() {
companyAcc = msg.sender;
}
Шаг 7:
Эта функция отвечает за добавление нового работника в список сотрудников. Она может выполняться только развертывателем смарт-контракта, которым является счет компании.
function addWorker(
address worker,
uint256 salary
) external ownerOnly returns (bool) {
// Checks for salary and work's existence...
require(salary > 0 ether, "Salary cannot be zero!");
require(!isWorker[worker], "Record already existing!");
// Performs essential computations...
totalWorkers++;
totalSalary += salary;
isWorker[worker] = true;
// Includes worker in the employees array...
employees.push(
PaymentStruct(
totalWorkers,
worker,
salary,
block.timestamp
)
);
return true;
}
Шаг 8:
Эта функция отвечает за оплату труда работников компании. Именно эта функция выполняет массовые транзакции. Вы должны уделить ей должное внимание.
function payWorkers() payable external ownerOnly returns (bool) {
// Ensures that salary can be paid...
require(msg.value >= totalSalary, "Ethers too small");
require(totalSalary <= companyBal, "Insufficient balance");
// Performs recursive payment to each employee...
for(uint i = 0; i < employees.length; i++) {
payTo(employees[i].worker, employees[i].salary);
}
// Performs essential computations...
totalPayment++;
companyBal -= msg.value;
// Emits payment event...
emit Paid(
totalPayment,
companyAcc,
totalSalary,
block.timestamp
);
return true;
}
Секрет обработки пакетных платежей заключается в том, чтобы поместить их в конструкцию цикла и заставить цикл вызывать функцию защищенного платежа снова и снова, пока все случаи не будут отработаны.
Шаг 9:
Эта функция получает платежи извне и пополняет счет компании.
function fundCompanyAcc() payable external returns (bool) {
require(companyAcc != msg.sender, "You can't fund yourself!");
payTo(companyAcc, msg.value);
companyBal += msg.value;
return true;
}
Шаг 10:
Эта функция просто возвращает список сотрудников, которые теперь входят в состав компании.
function getWorkers() external view returns (PaymentStruct[] memory) {
return employees;
}
Шаг 10:
Эта функция отвечает за отправку денег с одного адреса на другой. Она многократно вызывалась во время пакетной выплаты денег работникам.
function payTo(
address to,
uint256 amount
) internal returns (bool) {
(bool success,) = payable(to).call{value: amount}("");
require(success, "Payment failed");
return true;
}
Предупреждение о пакетной обработке платежей
Обратите внимание, что обработка пакетных платежей — это автономная деятельность, поэтому перед обработкой целесообразно провести некоторую проверку. Вот несколько советов, на которые следует обратить внимание.
Проверьте данные
Перед обработкой платежей обязательно проверьте правильность данных. Использование необходимых функций и специальных модификаторов, таких как adminOnly, гарантирует, что в систему вводятся только точные записи.
Обработать платеж
Прежде чем изменять переменные состояния, убедитесь в том, что вы сначала списали средства со счета. Это поможет защититься от атак реентерабельности.
Перекалибровать запись
Обновляйте переменные состояния только после выполнения вышеуказанных действий. Например, если злоумышленник намерен атаковать вашу платежную функцию, отправив несколько запросов одновременно. Он будет вынужден платить дважды, и при каждом запросе оплата должна быть произведена до обновления переменных состояния.
Смотрите мои БЕСПЛАТНЫЕ учебники по web3 на YouTube прямо сейчас.
Заключение
Обработка платежей — обязательный навык, если вы всерьез намерены стать web3-разработчиком. Также важно знать, как защищаться от таких атак, как reentrancy.
На этом у меня все, надеюсь, эта информация была для вас полезной. Я все еще провожу частные занятия с преподавателями для тех, кто хочет освоить web3. Если вы заинтересованы, пожалуйста, запишитесь на моем сайте.
Надеюсь увидеть вас в следующем уроке, а до тех пор, хорошего дня!
Об авторе
Госпел Дарлингтон начал свой путь в качестве инженера-программиста в 2016 году. За эти годы он приобрел полноценные навыки работы с такими стеками JavaScript, как React, ReactNative, NextJs, а теперь и блокчейн.
В настоящее время он работает фрилансером, создает приложения для клиентов и пишет технические руководства, обучая других тому, как делать то, что делает он.
Госпел Дарлингтон открыт и готов выслушать вас. Вы можете связаться с ним на LinkedIn, Facebook, Github или на его сайте.