Blockchain code Metaverse VR

SmartContract×VR×Crypto(620)

スポンサーリンク

//tips

//smart contract

PudgyPenguins.solのwithdrawの中身を確認。onlyownerのみが実行できるpayble関数。これは誰でも預金できるのだろうか。他にpayableがついているのはfunction mint(address _to, uint256 _count) public payable saleIsOpen の初期購入の場合のみ。他にはAddress.solの中に多少支払い関係の関数があった。

function withdrawAll() public payable onlyOwner {
uint256 balance = address(this).balance;
require(balance > 0);
_widthdraw(devAddress, balance.mul(35).div(100));
_widthdraw(creatorAddress, address(this).balance);
}

function _widthdraw(address _address, uint256 _amount) private {
(bool success, ) = _address.call{value: _amount}("");
require(success, "Transfer failed.");
}

(bool success, ) = _address.call{value: _amount}(“”);について少し深掘りする必要がありそう。

まず(bool success, ) の仕組みから。これはcall関数と一緒に理解するとよさそう。

先にtransferで送金を行ったpayable(msg.sender).transfer(_amount);が、これはcallでもでき、どちらかというと支払いではcallが主流なよう。

call関数は、他のコントラクトとやり取りするための関数で、address型であれば.call()を付けるだけで実行可能。基本的にcall関数はfallback関数を呼び出してのether送金のみでの使用を推奨されている。

左辺では戻り値を格納する変数を定義しており、右辺ではcall関数を実行。

(bool success, ) = payable(msg.sender).call{ value: 1 ether, } (“”);

(bool success, bytes memory data) = payable(msg.sender).call{ value: 1000000000000000000 wei, gas: 10000 }(abi.encodeWithSignature(“test(string,uint256), “call test”, 100″));

call関数には2つの戻り値があり、

1つ目の戻り値であるbool型successにはcall関数が正常に実行されたかどうかの判定結果が入り、

上記の場合、2つ目の戻り値であるbytes型dataにはcall関数で呼び出した関数の戻り値が入る。

etherを送金する場合は2つ目の戻り値ないので、空白となっている。

call関数を呼び出すaddress型をpayable(msg.sender)と表す。対象addressがcall関数を実行しているというイメージ。valueで送金するweiの量、gasで関数呼び出しの際に送信するガス量を指定。(“”)は呼び出したい関数と引数をまとめてABI形式にエンコードしたものを入れることが可能。

transfer関数やsend関数ではなく、call関数を使用するのは、送信するガス量に制限がなく、使い勝手が良いため。

payable(msg.sender).callはmsg.senderが送金するのか、msg.senderに送金するのかがわからず調べたところ、これは関数を呼び出したものへコントラクトから支払いをするという流れでいいよう。これでコントラクトへの預け入れとコントラクトからの支払いはできたことになる。

function withdraw() public {
//この関数を呼び出したアカウントにamountが支払われる
msg.sender.transfer(amount);
}

Openseaでの取引の流れを確認。

Openseaのコントラクトソースコードを調査してみる

https://qiita.com/oggata/items/99b496cb0118df36a29c

https://blog.opensphere.co.jp/posts/dapps003

https://docs.opensea.io/docs/2-adding-metadata

Openseaに対応させるjsonの設定は既にしている。openseaのテストバージョンで実際に売買できるか試してみる。

売買できたら、なぜ売買できているのかを理解する必要がある。コントラクトのもとで発行されているトークンの一つがNFTなので、トークンの受け渡しはtransferでできるにしても支払いはどこを根拠になされているかを知っておいた方がよさそう。

現在のコントラクトの状態でOpenseaでは問題なく売買できそう。

余計なfunctionの追加はしない方が良いのか。

Openseaでの出品を行う際に各プロジェクトコントラクト(おそらくEOAのこと、EOAはmetamaskを想像すると良い)は、初めて取引する際にregisterProxy()を実行し、専用のproxyを作成。これはNFT ContractのsetApprovalForAllを呼び出して、このproxyがsafeTransferFromを実行できるよう権限を付与するもの。

結局のところsafeTransferFromを実行できる権限をopenseaに移譲できていれば良い。function safeTransferFrom(はERC721.solを継承しておけば問題ない。

OpenseaのExchangeCoreにて出品や購入、出品キャンセルなど基本的な機能が使用できるようにされる。

購入の場合はatomicMatch_(…)を実行し、条件を満たしていれば、ETHのtransfe、続いてproxy(..)が実行され、safeTransferFromによりNFTの所有が移る。

つまり、資金の移動はプロジェクトのコントラクトを経由せず、出品者アドレス-opensea-自分のアドレスとなるのでプロジェクトのコントラクトで支払い機能を設定しておく必要はないことがわかった。

※一部EOAとコントラクトを混同して直した箇所があるので下記参考

https://pol.techtec.world/blockchain-usecase/ethereum/ethereum-account-transaction

人気の記事

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.