Делаем токен в Эфире, который отличается от обычных тем, что в каждой операции по переводу токена с одного адреса на другой записывалась дополнительная информация получаемая из оракула (например сумму по текущему курсу токена к доллару)
Создание токена с интеграцией оракула требует разработки смарт-контракта на языке Solidity, который использует данные оракула (например, Chainlink) для получения курса токена к доллару и записи этой информации в события транзакции.
Шаги для реализации токена:
Разработка токена:Используйте стандарт ERC-20 в качестве основы, чтобы обеспечить совместимость с экосистемой Ethereum. Для добавления функциональности записи данных от оракула потребуется расширение стандартного контракта.
Интеграция с оракулом:Используйте Chainlink, один из самых популярных и надежных оракулов в Ethereum. Chainlink предоставляет фиды данных, которые могут быть использованы для получения текущего курса токена к доллару.
Изменение логики перевода: Переопределите функцию transfer (и transferFrom, если нужно), чтобы записывать дополнительные данные о стоимости перевода в лог (событие).
Запись информации: Добавьте событие для логирования стоимости перевода. В событии укажите отправителя, получателя, количество токенов и стоимость перевода в долларах.
Пример кода
Вот пример смарт-контракта:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";
contract OracleToken is ERC20 {
AggregatorV3Interface internal priceFeed;
// Событие для записи деталей транзакции
event TransferWithPrice(
address indexed from,
address indexed to,
uint256 value,
uint256 priceInUSD
);
constructor(address _oracleAddress) ERC20("OracleToken", "ORT") {
// Chainlink Oracle для получения курса токена к USD
priceFeed = AggregatorV3Interface(_oracleAddress);
// Можем заложить начальную эмиссию
_mint(msg.sender, 1000000 * 10 ** decimals());
}
// Получение курса из оракула
function getLatestPrice() public view returns (uint256) {
(, int256 price, , , ) = priceFeed.latestRoundData();
// Возвращаем цену в виде uint256
return uint256(price);
}
// Переопределяем transfer
function transfer(address recipient, uint256 amount)
public
override
returns (bool)
{
// Получаем цену токена
uint256 priceInUSD = getLatestPrice();
// Вызываем стандартный метод transfer
bool success = super.transfer(recipient, amount);
// Логируем транзакцию с ценой
if (success) {
emit TransferWithPrice(msg.sender, recipient, amount, priceInUSD);
}
return success;
}
}
Разъяснение:
ERC-20 токен:
Основной функционал (эмиссия, передача) обеспечивается базовым контрактом OpenZeppelin ERC-20.
Оракул:
подключили Chainlink оракул, который предоставляет курс токена к USD. Контракт ожидает адрес оракула (_oracleAddress) при развертывании.
Событие TransferWithPrice:
В событии сохраняется отправитель, получатель, сумма перевода и цена токена в долларах.
Деплой контракта:
Разверните контракт с использованием адреса Chainlink-оракула для вашего токена (например, ETH/USD или другого).
Убедитесь, что адрес оракула соответствует сети (Mainnet, Testnet, etc.).
Ограничения:
Затраты на газ: Интеграция оракула увеличивает стоимость операций. Это может быть существенным для пользователей.
Обновление данных: Chainlink обновляет данные с определенной частотой, поэтому курсы могут быть не идеальными для мгновенных операций.
Тестирование: Необходимо тщательно протестировать контракт, чтобы исключить ошибки и злоупотребления.
Дополнительная информация будет видна через события (events), которые записываются в логах транзакций и доступны всем пользователям через блокчейн-эксплореры, API или прямое взаимодействие с нодой.
Как это работает:
События в Ethereum:
События — это механизмы, встроенные в Ethereum, которые позволяют контракту записывать данные в лог транзакции. Эти данные становятся частью истории транзакций и сохраняются в блокчейне.
Пример события в нашем контракте:
В приведённом ранее примере событие TransferWithPrice логирует следующую информацию:
Адрес отправителя (from).
Адрес получателя (to).
Количество токенов (value).
Стоимость перевода в долларах (priceInUSD).
Где искать данные события:
Блокчейн-эксплореры (Etherscan): На платформе вроде Etherscan вы можете найти транзакцию и увидеть данные логов в разделе Logs.
API Web3: Разработчики могут использовать библиотеки, такие как Web3.js или ethers.js, для получения данных о событиях.
Прямое взаимодействие с нодой: С помощью RPC-запросов можно извлечь данные из логов транзакции.
Как пользователи видят данные?
Блокчейн-эксплореры:
Например, на Etherscan:
Зайдите в нужную транзакцию.
Перейдите в раздел Logs (логи).
Вы увидите сырые данные события, где будут адреса и значения, включая priceInUSD.
Пример на Etherscan:
Event: TransferWithPrice
from: 0xSenderAddress
to: 0xRecipientAddress
value: 100 ORT
priceInUSD: 1.23 USD
Программы и кошельки:
Если ваш токен используется в децентрализованных приложениях (DApps), эти приложения могут обрабатывать события и показывать данные напрямую пользователям.
Кастомные интерфейсы:
можно разработать свой интерфейс, который будет отображать данные о цене из событий. Используя Web3.js или ethers.js, можно настроить обработку событий.
Пример кода для чтения событий (Web3.js):
Если разработчик хочет получить логи событий через Web3.js:
const Web3 = require('web3');
const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_KEY');
// ABI события
const abi = [
{
"anonymous": false,
"inputs": [
{ "indexed": true, "name": "from", "type": "address" },
{ "indexed": true, "name": "to", "type": "address" },
{ "indexed": false, "name": "value", "type": "uint256" },
{ "indexed": false, "name": "priceInUSD", "type": "uint256" }
],
"name": "TransferWithPrice",
"type": "event"
}
];
// Адрес контракта
const contractAddress = '0xYourContractAddress';
const contract = new web3.eth.Contract(abi, contractAddress);
// Получение событий
async function getEvents() {
const events = await contract.getPastEvents('TransferWithPrice', {
fromBlock: 0,
toBlock: 'latest',
});
console.log(events);
}
getEvents();
Плюсы использования событий:
Прозрачность: Информация видна всем пользователям, кто имеет доступ к блокчейну.
Оптимизация газа: События записываются в логи, что дешевле, чем хранение данных в самом контракте.
Доступность: Любой пользователь или приложение может легко получить информацию через API.
Минусы:
Невозможность модификации: Данные, записанные в события, неизменны.
Сложность для обычных пользователей: Данные событий могут быть сложны для понимания без подходящего интерфейса.
Если важно, чтобы информация была понятна даже неподготовленным пользователям, можно разработать удобный пользовательский интерфейс (например, через DApp).