Blockchain code Metaverse VR

SmartContract×VR×Crypto(585)

スポンサーリンク

//tips

これは読みたい。めちゃ長いが隙間時間で読んでいく。

海外(米国)のステーブルコインのユースケース及び関連規制分析に関する調査
https://www.fsa.go.jp/common/about/research/20220603/2022report_stablecoin.pdf

//smart contract

Approve関数の確認の続き。指定されたトークンIDをtoに転送することの許可。プラットフォーム側から行うもので、ユーザー側からこれらの許可に対して、対応が終わった時点でrevokeを行うことができる。というのも、プラットフォームに対して、転送許可を与えることになるので悪質なプラットフォームのものを許可しておくと、勝手に他のアドレスに転送されたりする可能性がある。

ここで確認しているのは、転送先が現在の保持者でないことと、トークン保持者が関数の実行者または仲介者であるmsgsenderは事前に許可されているかの確認。

isApprovedForAllはownerがoperatorの関与を事前に許可しているかを確認するもの。

function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");

require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not token owner nor approved for all"
);

_approve(to, tokenId);
}

制約を突破すると _approve関数が呼ばれる。

この内容は、新たにtoをtokenidのapprove主として記録するもの。基本的にはtokenidと所有者の関係が格納されることになる。revokeされた場合にはプラットフォーム側から再度approveの承認を依頼する流れにしておく必要がありそう。

function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}

単純にapproveされているかを確認する際にはgetApprovedを使用すればよく、tokenidが存在すれば、格納されているアドレスを返す。

元はマッピングされているものなので、 mapping(uint256 => address) private _tokenApprovals;。

function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");

return _tokenApprovals[tokenId];
}

プラットフォーム側は転送処理などを行う際には必ずこの関数を呼んで確認する必要があるか。

ここまではNFT単品に対する処理だったが、複数所持者に対して全てのトークンをapproveしてもらう関数があるので確認。イベントのApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);を実行することになるがこれは継承したIERC721Metadataの内容。

setApprovalForAll関数の場合は_operatorApprovalsによって、すべてのERC721トークンを一括approve。openseaとかが実行しているもののよう。

// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;

_operatorApprovalsについて忘れていたが2重マッピングで、ownerとoperatorとの関係を表したものだった。

一個上のレイヤーからmapping(address => uint256) private _balances;の各トークンのカウント数を把握しているのだろうか。ここはおいおい理解していく。

function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal virtual {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}

function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}

この関数を実行するのはopeaseaなどのようにユーザーのアカウントの各トークンを統合して表示させる必要がある場合か。一括委任することでapprove関数にかかるgas代を削減できるよう。

ユーザー側は、このApprovalForAllの表示は、metamaskでもイーサスキャンのログにも表示されるのできちんと確認する。

_transferはシンプルでトークンをfromからtoに転送して、それぞれの保有数_balancesを-1, +1、その上で保有者のアドレスを書き換えている。結局はこの_owners[tokenId]保有者アドレスの書き換えが転送操作と言えそう。

function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
require(to != address(0), "ERC721: transfer to the zero address");

_beforeTokenTransfer(from, to, tokenId);

// Clear approvals from the previous owner
_approve(address(0), tokenId);

_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;

emit Transfer(from, to, tokenId);

_afterTokenTransfer(from, to, tokenId);
}

人気の記事

1

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

3

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-Blockchain, code, Metaverse, VR
-, ,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.