Как закодировать фантастическую функцию пакетных платежей с помощью Solidity: метод, который необходимо знать

Как закодировать фантастическую функцию пакетных платежей с помощью Solidity: метод, который необходимо знать

5 мая 2022 г.

Вступление


Посмотрим правде в глаза, пока вы используете Solidity для разработки смарт-контрактов, вы будете сталкиваться с проблемой обработки громоздких транзакций. Вам нужно повысить уровень своих навыков обработки платежей, и вам нужно сделать это быстро.


В этом уроке вы научитесь очень важному навыку смарт-контракта для выплаты денег (эфиров) на несколько счетов одним нажатием кнопки.


Кстати, если вы ищете личного репетитора, который поможет вам ускорить разработку Web3, пожалуйста, запишитесь на занятие со мной.


Если вы так же возбуждены, как и я, давайте приступим к этому руководству…


Почему вы должны освоить пакетную обработку платежей в Solidity


Solidity — это специальный язык программирования для обработки платежей между учетными записями. Это редкая черта среди языков программирования в Интернете. Solidity была создана с целью управления транзакциями с цифровой валютой Ethereum, устраняя необходимость в посредниках и крупных корпорациях.


С программированием смарт-контрактов Solidity вам не нужен банк или какая-либо женщина-банкир для обработки вашего платежа, все ваши платежи будут обрабатываться в сети.


Но сам факт того, что Solidity дает вам возможность совершать цифровые транзакции быстрее, безопаснее и в больших масштабах, не означает, что вы можете делать это в совершенстве, не обучаясь.


Поскольку эта финансовая сеть предоставила нам способ быстрого, безопасного и безграничного перемещения денег между точками, она также привлекла хищные взгляды воров, известных как (хакеры).


Да, они следят за слабостью вашей системы, особенно за тем, как деньги перемещаются в вашем смарт-контракте. Когда они найдут способ использовать эту слабость, они ограбят вашу систему и сделают ваш бизнес неработоспособным.


Чтобы этого не произошло, вы должны понимать, как обрабатывать пакетные платежи с помощью смарт-контрактов.


Пример смарт-контракта пакетной оплаты


Я хочу проиллюстрировать это на примере созданного мною смарт-контракта под названием Payroll. Ниже приведен полный код смарт-контракта…


```javascript


//SPDX-идентификатор лицензии: MIT


прочность прагмы >=0,7,0 <0,9,0;


контракт Заработная плата {


адрес публичной компанииAcc;


uint256 публичная компания Бал;


uint256 public totalWorkers = 0;


uint256 публичная общая зарплата = 0;


uint256 публичная общая оплата = 0;


отображение (адрес => логическое значение) isWorker;


событие Оплачено(


идентификатор uint256,


адрес из,


uint256 всегоЗарплата,


uint256 метка времени


структура PaymentStruct {


идентификатор uint256;


адрес работника;


зарплата uint256;


uint256 метка времени;


Сотрудники PaymentStruct[];


модификатор ownerOnly(){


require(msg.sender == companyAcc, "Только владелец зарезервирован");


конструктор () {


companyAcc = msg.sender;


функция addWorker(


адрес работника,


зарплата uint256


) external ownerOnly возвращает (bool) {


require(salary > 0 ether, "Зарплата не может быть нулевой!");


require(!isWorker[worker], "Запись уже существует!");


всего рабочих++;


общая зарплата += зарплата;


isWorker[рабочий] = истина;


сотрудники.push(


ПлатежнаяСтруктура(


всегоРабочие,


рабочий,


зарплата,


block.timestamp


вернуть истину;


функция payWorkers() оплачиваемая внешняя ownerOnly возвращает (bool) {


require(msg.value >= totalSalary, "Слишком мало эфира");


require(totalSalary <= companyBal, "Недостаточно баланса");


for(uint i = 0; i < employee.length; i++) {


payTo(сотрудники[i].рабочий, сотрудники[i].зарплата);


общая оплата++;


companyBal -= msg.value;


выдать платно(


всего к оплате,


компанияAcc,


общаяЗарплата,


block.timestamp


вернуть истину;


function fundCompanyAcc() оплачиваемые внешние возвраты (bool) {


require(companyAcc != msg.sender, "Вы не можете финансировать себя!");


payTo(companyAcc, msg.value);


companyBal += msg.value;


вернуть истину;


Функция внешнего представления getWorkers() возвращает (память PaymentStruct[]) {


вернуть сотрудников;


функция payTo(


Отправить,


сумма uint256


) внутренние возвраты (bool) {


(логический успех) = подлежащий оплате (кому). call {значение: сумма} ("");


требуют(успех, "Платеж не прошел");


вернуть истину;


Отлично, выше приведен смарт-контракт для оплаты труда сотрудников компании в соответствии с их зарплатой. Давайте посмотрим, как мы шаг за шагом выполняем этот смарт-контракт.


Шаг 1:


На этом первом этапе мы настраиваем нашу структуру смарт-контракта. Мы используем идентификатор лицензии MIT и диапазон компилятора от 0.7.0 до 0.9.0. Затем мы определили смарт-контракт с именем Payroll.


```javascript


//SPDX-идентификатор лицензии: MIT


прочность прагмы >=0,7,0 <0,9,0;


контракт Заработная плата {


// Здесь идут коды...


Шаг 2:


Здесь мы определяем основные переменные состояния для нашего смарт-контракта. В companyAcc указывается учетная запись или адрес развертывания. CompanyBal владеет всеми фондами, поступающими в компанию. Затем мы указали некоторые переменные для отслеживания общего числа работников, заработной платы и платежей в нашем смарт-контракте.


```javascript


адрес публичной компанииAcc; // Аккаунт владельца


uint256 публичная компания Бал; // Фонд компаний


uint256 public totalWorkers = 0;


uint256 публичная общая зарплата = 0;


uint256 публичная общая оплата = 0;


отображение (адрес => логическое значение) isWorker; // Идентифицирует рабочих


Шаг 3:


На этом шаге указывается журнал событий смарт-контракта. Мы хотим, чтобы некоторые важные данные регистрировались при каждой успешной выплате. Данные, которые необходимо вывести здесь, включают идентификатор выплаты, плательщика, общую выплаченную заработную плату и время выплаты.


```javascript


событие Оплачено(


идентификатор uint256,


адрес из,


uint256 всегоЗарплата,


uint256 метка времени


Шаг 4:


Это определяет структуру платежа. Структура — это ключевое слово прочности, обозначающее структуру. Мы хотим, чтобы у каждого сотрудника были следующие записи:


  • Идентификатор, который должен быть целым числом без знака.

  • Адрес кошелька указан как рабочий.

  • Определенная заработная плата.

  • Временная метка, представляющая время присоединения к компании.

```javascript


структура PaymentStruct {


идентификатор uint256;


адрес работника;


зарплата uint256;


uint256 метка времени;


Сотрудники PaymentStruct[]; // Массив сотрудников


Шаг 5:


На этом шаге мы создали модификатор ownerOnly. Его единственной целью является защита функции от несанкционированного доступа. В какую бы функцию мы ни включили этот модификатор, доступ будет разрешен только владельцу компании, которая в данном случае является исполнителем смарт-контракта.


```javascript


модификатор ownerOnly(){


require(msg.sender == companyAcc, "Только владелец зарезервирован");


Шаг 6:


Здесь мы настраиваем адрес развертывателя в качестве учетной записи компании.


```javascript


конструктор () {


companyAcc = msg.sender;


Шаг 7:


Эта функция отвечает за добавление нового работника в записи сотрудников. Им может управлять только тот, кто развернул смарт-контракт, который является учетной записью компании.


```javascript


функция addWorker(


адрес работника,


зарплата uint256


) external ownerOnly возвращает (bool) {


// Проверяет зарплату и наличие работы...


require(salary > 0 ether, "Зарплата не может быть нулевой!");


require(!isWorker[worker], "Запись уже существует!");


// Выполняет необходимые вычисления...


всего рабочих++;


общая зарплата += зарплата;


isWorker[рабочий] = истина;


// Включает работника в массив сотрудников...


сотрудники.push(


ПлатежнаяСтруктура(


всегоРабочие,


рабочий,


зарплата,


block.timestamp


вернуть истину;


Шаг 8:


Эта функция отвечает за оплату труда работников компании. Это функция, выполняющая массовые транзакции. Вы должны обратить на это хорошее внимание.


```javascript


функция payWorkers() оплачиваемая внешняя ownerOnly возвращает (bool) {


// Обеспечивает выплату зарплаты...


require(msg.value >= totalSalary, "Слишком мало эфира");


require(totalSalary <= companyBal, "Недостаточно баланса");


// Выполняет рекурсивную выплату каждому сотруднику...


for(uint i = 0; i < employee.length; i++) {


payTo(сотрудники[i].рабочий, сотрудники[i].зарплата);


// Выполняет необходимые вычисления...


общая оплата++;


companyBal -= msg.value;


// Выдает платежное событие...


выдать платно(


всего к оплате,


компанияAcc,


общаяЗарплата,


block.timestamp


вернуть истину;


Секрет обработки пакетного платежа заключается в том, чтобы поместить его в конструкцию цикла и заставить цикл вызывать функцию защищенного платежа снова и снова, пока не будут обработаны все случаи.


Шаг 9:


Эта функция принимает платежи извне и пополняет счет компании.


```javascript


function fundCompanyAcc() оплачиваемые внешние возвраты (bool) {


require(companyAcc != msg.sender, "Вы не можете финансировать себя!");


payTo(companyAcc, msg.value);


companyBal += msg.value;


вернуть истину;


Шаг 10:


Эта функция просто возвращает список сотрудников, которые теперь являются частью компании.


```javascript


Функция внешнего представления getWorkers() возвращает (память PaymentStruct[]) {


вернуть сотрудников;


Шаг 10:


Эта функция отвечает за отправку денег с одного адреса на другой. Он неоднократно вызывался во время пакетной выплаты рабочим.


```javascript


функция payTo(


Отправить,


сумма uint256


) внутренние возвраты (bool) {


(логический успех) = подлежащий оплате (кому). call {значение: сумма} ("");


требуют(успех, "Платеж не прошел");


вернуть истину;


Предупреждение о пакетной обработке платежей


Обратите внимание, что пакетная обработка платежей — это автономная деятельность, поэтому перед обработкой целесообразно выполнить некоторую проверку. Вот несколько советов, на которые следует обратить внимание.


Проверить данные


Убедитесь, что вы проверяете правильность данных перед обработкой платежей. Использование необходимых функций и специальных модификаторов, таких как adminOnly, для обеспечения ввода в систему только точных записей.


Обработка платежа


Прежде чем изменять переменные состояния, убедитесь, что вы взимаете плату со счета. Это поможет защититься от повторных атак.


Перекалибровать запись


Обновляйте переменные состояния только после выполнения вышеуказанных действий. Например, если злоумышленник намеревается атаковать вашу платежную функцию, отправив несколько запросов одновременно. Он будет вынужден заплатить дважды, и при каждом запросе оплата должна производиться до того, как будут обновлены переменные состояния.


Вывод


Обработка платежей — обязательный навык, если вы серьезно относитесь к тому, чтобы стать веб-разработчиком. Также важно знать, как защищаться от таких атак, как повторный вход.


Это все для этого урока, надеюсь, эта информация была вам полезна. Я все еще провожу частные уроки для тех, кто хочет окунуться в мир web3. Если вы заинтересованы, пожалуйста, забронируйте меня на моем сайте.


Надеюсь увидеть вас в следующем, а пока, хорошего дня!


Об авторе


Госпел Дарлингтон начал свой путь в качестве инженера-программиста в 2016 году. За эти годы он приобрел полноценные навыки работы со стеками JavaScript, такими как React, ReactNative, NextJs, а теперь и с блокчейном.


В настоящее время он работает фрилансером, создает приложения для клиентов и пишет технические руководства, обучая других тому, что делает он.


Евангелие в Дарлингтоне открыто и доступно для вас. Вы можете связаться с ним на LinkedIn, Facebook, Github или на его веб-сайте.



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE