Обновить

Комментарии 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 файлы. Глупо и не практично. Такой магазин "без базы данных" можно сделать и без блокчейна. Просто на статичных страничках.

Можно, но он будет привязан к браузеру, либо нужно будет использовать внешнее API. Все зависит от поставленной задачи.

Очень справедливое замечание, блокчейн здесь используется только для лога покупок, но это всё то же перекладывание json в формы. Как учебный проект, всё же сойдёт, но не более того

`mapping(address => uint8[]) private boughtItems;`
интересный факт: в таком маппинге хранится, сюрприз, массив uint256 - конкретно в данном случае нет упаковки, которую (возможно) автор хотел

Точно, спасибо!

  1. Используйте для внутриигровых предметов нфтишки, которые будут хранить метаданные товаров с ссылкой на ipfs. На базе нфтишек можно легко сделать вторичный рынок предметов без участия бекенда. Логика такая: игрок покупает предмет, передает эфир на контракт и ему минтится нфт (ERC-721, ERC-1155, ERC-6909).

  2. Продавайте предметы за фиксированную цену в долларах, то есть предмет стоит 100 условно сто долларов. То есть количество эфира, взимаемое за предмет нужно рассчитывать прямо на смарт-контракте, а стоимость эфира брать из оракула, например Chainlink. Сейчас у вас товар может резко просеть в цене следом за курсом нативной валюты. Для реального бизнеса, в вашем случае игры, предметы будут отдаваться даром.

Сделать хотя бы эти два пункта и уже проект будет чуть-чуть серьезнее.

Спасибо! Буду разбираться.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации