Комментарии 11
А где хранятся "товары", который показываются пользователю?
Данные хранятся непосредственно в блокчейне(on-chain) в переменной boughtItems.
Она инициализируется в начале листинга смарт-контракта и представляет из себя маппинг кошельков пользователей и купленных ими предметов.
mapping(address => uint8[]) private boughtItems;Откуда изначально карточки товаров берутся? Откуда картинки, описание? При чем тут купленные товары
Все зашито в интерфейс, написан он на html-css-react. Кусок кода:
const STORE_ITEMS = {
KNIGHT_TRAINING: {
ID: 1,
TITLE: "Knight training",
DESCRIPTION: "Additional melee hit for knight. +3 damage on every 3rd hit."
},
KNIGHT_SWORD_SHARPENING: {
ID: 2,
TITLE: "Knight sword sharpening",
DESCRIPTION: "Additional melee damage for knight. +1 damage on every hit."
},
ARCHER_FLAMING_ARROWS: {
ID: 3,
TITLE: "Archer flaming arrows",
DESCRIPTION: "Archer burning arrows. +5 damage for buildings."
}
}
<div className="store-card">
{ isLoading ?
<Spinner size="lg" /> :
<Stack gap="4" direction="row" wrap="wrap">
<Card.Root width="320px" key={1}>
<Card.Body gap="2">
<Avatar.Root size="lg" shape="rounded">
<Avatar.Image src="./assets/tool_sword_b.png" />
<Avatar.Fallback name={STORE_ITEMS.KNIGHT_TRAINING.TITLE} />
</Avatar.Root>
<Card.Title mb="2">{STORE_ITEMS.KNIGHT_TRAINING.TITLE}</Card.Title>
<Card.Description>{STORE_ITEMS.KNIGHT_TRAINING.DESCRIPTION}</Card.Description>
</Card.Body>
<Card.Footer justifyContent="flex-end">
{ items.has(STORE_ITEMS.KNIGHT_TRAINING.ID) ?
"item bought"
:
<Button onClick={() => buyAction(STORE_ITEMS.KNIGHT_TRAINING.ID)}>Buy (2 gwei)</Button>
}
</Card.Footer>
</Card.Root>
...
</div>Купленные товары - это как раз важно, про это и статья.
Как провести блокчейн-транзакцию и как потом узнать, что человек купил.
В данном случае, ваша "база данных" - это html файлы. Глупо и не практично. Такой магазин "без базы данных" можно сделать и без блокчейна. Просто на статичных страничках.
`mapping(address => uint8[]) private boughtItems;`
интересный факт: в таком маппинге хранится, сюрприз, массив uint256 - конкретно в данном случае нет упаковки, которую (возможно) автор хотел
Используйте для внутриигровых предметов нфтишки, которые будут хранить метаданные товаров с ссылкой на ipfs. На базе нфтишек можно легко сделать вторичный рынок предметов без участия бекенда. Логика такая: игрок покупает предмет, передает эфир на контракт и ему минтится нфт (ERC-721, ERC-1155, ERC-6909).
Продавайте предметы за фиксированную цену в долларах, то есть предмет стоит 100 условно сто долларов. То есть количество эфира, взимаемое за предмет нужно рассчитывать прямо на смарт-контракте, а стоимость эфира брать из оракула, например Chainlink. Сейчас у вас товар может резко просеть в цене следом за курсом нативной валюты. Для реального бизнеса, в вашем случае игры, предметы будут отдаваться даром.
Сделать хотя бы эти два пункта и уже проект будет чуть-чуть серьезнее.

Web3 — Разрабатываем магазин без базы данных