こんにちは。どうも。次世代デジタル基盤開発事業部の六本木です。
2021年はNFT元年といっても過言ではないほど様々なNFTニュースがありました。
前回はNFTまとめシリーズ第一弾としてNFTマーケットプレイス18選をご紹介しました。
今回はNFTまとめシリーズ第二弾として、「国内NFT事例20選」と題してお送りいたします。
続きを読むこんにちは。どうも。次世代デジタル基盤開発事業部の六本木です。
2021年はNFT元年といっても過言ではないほど様々なNFTニュースがありました。
前回はNFTまとめシリーズ第一弾としてNFTマーケットプレイス18選をご紹介しました。
今回はNFTまとめシリーズ第二弾として、「国内NFT事例20選」と題してお送りいたします。
続きを読むどうも、次世代デジタル基盤開発事業部(旧ブロックチェーン事業部)の土田です。
前回、GanacheのGUIアプリ上でコントラクトやイベントログが確認出来ませんでした。今回はこちらの対応を行っていきます。
GanacheのGUIアプリからコントラクトやイベントログを確認します。
ここまで手順を追っていただいた方はGUIからCONTRACTS
タブとEVENTS
タブを確認しても、何も表示されていないはずです。
こちらを表示させたいと思います。
設定を開きます。
WORKSPACE
タブのTRUFFLE PROJECTS
からtruffle-config.js
を指定します。本来はこれで完了です。
(wslには\\wsl$\{ディストリビューション}
でファイルへアクセスできます。)
しかし、このまま再起動したらロード画面が延々と続くはずです。もしそのような状態になった場合は、一度GUIを落として再度設定を開き、REMOVE PROJECT
で指定したファイルを削除して下さい。
原因はNode側の問題だと言われていますが、続報が無いのでなんともし難いですね・・・。
ビルドされたコントラクトが分かれば問題ないので、それらを指定するようにします。
ビルドされたコントラクトですが、truffle-config.js
にcontracts_build_directory
の指定先にあるはずです。
const path = require("path"); module.exports = { // See <http://truffleframework.com/docs/advanced/configuration> // to customize your Truffle configuration! contracts_build_directory: path.join(__dirname, "client/src/contracts"), networks: { development: { host: "127.0.0.1", port: 8545, network_id: "*" } } };
これらをローカルにコピーします。パスはご自身の環境に合わせて読み替えて下さい。
次に、truffle-config.js
をコピーします。networks
等の設定は残っていても問題ないとは思いますが、気になる方はcontracts_build_directory
のみの設定ファイルを別途作成すると良いと思います。
準備ができたら、GUIから再度ADD PROJECT
をします。
あとは再起動すれば完了です。
すでにコントラクトをデプロイや実行していれば、そのままそれらが確認出来るはずです。
まずはCONTRACTS
タブを確認しましょう。前回コンパイル&デプロイしたコントラクトが並んでいるはずです。
EVENTS
タブでは、前回実行したイベントログが確認できます。
一覧のイベントログをクリックすると、より詳細なログが確認できます。今回は前回生成したゾンビが確認できると思います。
今回はここまでとなります。
これでGUI上でかんたんにコントラクトやイベントが確認できるようになりました!作業効率UP間違いなしですね!
(本当はwsl2上のプロジェクトを直接指定できれば良いのですが・・・。)
次回はコントラクト開発やフロントエンド開発を進めていきたいと思います。
ここまでご覧いただき、ありがとうございました。
こんにちは。はじめまして。 次世代デジタル基盤開発事業部の六本木です。
2021年はNFT元年といっても過言ではないほど様々なNFTニュースがありました。個人的には「世はまさに、大NFT時代!」と叫びたくなるほどでした。
本稿では、群雄割拠の様相となっているNFT界隈まとめ紹介の第一弾として、国内主要マーケットプレイス18選をご紹介します。
・NFTという単語がわかる方 ・国内主要マーケットプレイスを知りたい方 ・NFTをご自身のビジネスに活かしたい方
2017年の後半、暗号資産*1ブーム, ICOブームがありました。 その後一旦落ち着いたものの、2020年後半~2021年にかけて再燃し、 特にDeFiやNFTといった言葉が注目を集めるようになりました。
下記はGoogleで今年「NFT」が検索されたグラフです。
グラフを見てわかる通り、2021年に入ってから検索数がぐっと右肩上がりになっています。
NFTは依然海外での盛り上がりが先行していますが、国内でも様々なサービスが立ち上がり、様々な企業が参入しつつあります。
NFTは現時点まだ成熟したものではないので、今どのようなサービスがありどのような事例があるか知っておくことで、今後新たなビジネスチャンスに巡り合える可能性が高くなるのではないでしょうか。
今回は国内の主要マーケットプレイスについて紹介し、次回、第二弾としてNFT活用事例と主要プレイヤーについてご紹介する予定です。
では長くなりましたが、早速紹介していきたいと思います。
海外ではOpenSeaやRaribleなどが有名ですが、国内にもマーケットプレイスはたくさんあります。現時点*2主要なマーケットプレイスは下記です。
コインチェック株式会社が運営しています。
カードゲーム「CryptoSpells」のカード、メタバースゲーム「The Sandbox」内の土地「LAND」、SKE48のNFTトレカ、ブロックチェーンサッカーゲーム「Sorare」のカードなどが出品されています。
また最近では株式会社CyberZと協業し、エンターテインメント分野のNFT活用促進を行う予定です。
など
コインチェックテクノロジーズ株式会社*3が運営しています。
現時点12タイトルのNFTを取り扱っています。上記Coincheck NFTと連携しており、扱っているタイトルも一部同じです。
SBINFT株式会社が運営しています*4。
公認アーティストが発行したNFT、パートナー事業者のNFTを取り扱いしています。
Etherのほか、Polygonチェーンの通貨Maticでの取引が可能です*5。
GMOアダム株式会社が運営しています。
現時点、YouTuber・ヒカルさんのコンテンツをはじめ様々なコンテンツ計1192点の出品・販売が行われています。
Etherのほか日本円での購入も可能です。決済手段もクレジットカード・銀行振込など幅広いです。
二次販売があった場合、クリエイターにロイヤリティ還元される仕組みがあります。
またNFT保有者限定コンテンツを提供していたり、さらに今後も様々な機能が追加される予定です*6。
ブロックチェーンゲーム「CryptoSpells」を開発したCryptoGames株式会社*7が運営しています。
出品者はNFTStudioの審査を経た公認クリエイターなので、安心して購入することができます。
取り扱い通貨として、PolygonチェーンでのMatic, LINE BlockchainでのLINKを採用しており、販売・購入時の手数料が安く抑えられています。
暗号資産ウォレットによるログインのほか、SNSでのログインも可能です。またクレジットカードでの購入も可能で、暗号資産に馴染みのない方でも購入できるよう工夫されています。
スマホベースのマーケットプレイスです。
国内で最もシェア率の高いメッセージングアプリ「LINE」を提供するLINE株式会社の関連会社LVC株式会社が運営しています。
通貨はLINE BlockchainのLINKで、ネットワーク手数料無料で利用できます。
LINE公式NFTのほか、ももいろクローバーZのトレカなどが出品されています。出品要件に適合していればエンドユーザが出品することも可能なようです。
最近ではスクウェア・エニックス、初のNFT事業 デジタルシール「資産性ミリオンアーサー」が本マーケットプレイス上で取り扱い予定とのことで、そのキャンペーンとして、LINE公式アカウントに友だち登録したユーザーに、最大総数約100万枚のNFTを配布するキャンペーンも実施しました*8。
さらにブロックチェーンゲーム関連事業を行うアクセルマーク株式会社とスポーツ関連事業に特化したゲーム開発を行う株式会社OneSports が共同開発中のゲームにおいて、株式会社Jリーグとライセンス契約を結んだとのニュースもあり、その選手NFTの出品先を本マーケットプレイスとする予定です*9。
など
株式会社サンシェアが運営しています。
アート、イラストではなく、無形資産の既存収益権利や所有権に着目したマーケットプレイスで、具体的にはSNSインフルエンサーの会員権がNFT化しており、購入すると半永久的に、購入者の保有する商品をSNS拡散してくれるという構想のようです。
支払方法としては、Ether、USDT(ERC20)、BTC、Matic、銀行振込(日本円)・クレジットカードなどに対応しています。
prtimes.jp 公式サイト:https://market.uniqys.net/
株式会社ビットファクトリーが運営しています。
NFTの購入・アーティストへの売上還元等決済は日本円で行われます。暗号資産の購入をせずに、NFTの販売・購入が可能です。
またすべてオークション形式での購入となっております。
出品されている作品には、位置情報連動型ゲーム「駅メモ! Our Rails」内デジタルアセット「ステーションNFT」や 株式会社CHET Group提供の「いがらしゆみこの世界(デジタル原画+商品化権利)」、「Buzz Magician Shin(本人との共演・コラボ権)」 、その他数名の個人アーティストによるものがあります。
貸付ファンドのオンラインマーケット「Funds(ファンズ)」とのコラボで初回ファンド提供を実施したというニュースもありました。
など
ANIFTY合同会社が運営しています。
二次元イラストとキャラクターを専門に扱うNFTプラットフォームです。
アニメアートやキャラクター業界の中央集権的な業態を刷新することをミッションに立ち上げられたプラットフォームで、 本プラットフォームにより、著作権問題の解決、ファンによる消費を直接アーティストに還元する仕組みを提供しています。
公認絵師のみ出品可能で、一般ユーザは購入するのみです。
株式会社リードエッジコンサルティングが運営しています。
漫画家やイラストレーターなどのクリエイターがリアルに創作した作品に紐づくNFTが出品されています。
作品の制作過程はすべて動画公開されるほか、デジタルな権利の所有・再販と、実際のモノを受け取って所有が可能です。
このようなリアルなモノと引き換えられるNFTを通称Redeemable NFT(rNFT)といいます。
販売はすべてオークション形式で、Polygonネットワーク(Matic)を採用していますが、クレジットカードによる購入も可能です。
数名のアーティスト作品が出品されていますが、浜田ブリトニーさんの作品が出品されていることで話題のようです。
Fantasy Tech Incが運営する日本の二次元文化に特化したNFTマーケットプレイス&ブロックチェーンゲームです。
NFTマーケットプレイス、NFTを作成・閲覧・共有できるほか、複数チェーンでNFTをステーキングできます。
ベースとなっている通貨は、独自トークンXPですが、クロスチェーン技術によりEther, Pokadotでの取引可能で、今後順次チェーンを拡大予定です。
ZAIKO株式会社が運営しています。
本プラットフォームを使うと、ファンはブロックチェーンを通じ所有者としてアーティストやアスリートの歴史に永遠に自分の名前を刻むことができます。
マーチャンダイズ付きや投げ銭機能など自由度の高いNFT設定が可能な仕様となっており、ファンとアーティスト(アスリート)との間に強い繋がりを作ることが可能です。
最近ではアメフトXリーグ オービックシーガルズ所属バイロン・ビーティ―Jr.選手のNFTが発行・販売されました。
株式会社ギークピクチュアズのIPコンテンツ事業部門ギークワンダーズが運営しています。
国内外のアーティストによるハイクオリティな作品が出品されており、デジタル作品と実物作品のセット出品・販売・購入が可能、またOpenSea等他プラットフォームをまたいでの出品・販売・購入が可能といった特徴があります。
第1弾として、米国やインド、欧州の富裕層を中心に数百万単位で作品が取引されるインドの現代アーティスト「Shilo Shiv Suleman」のNFTアートを販売しています。
など
仮想空間「XANA」を開発したNOBORDER.zが手掛けています。
ただ運営は、非中央集権的に実施されており、スマートコントラクトによってブロックチェーン上で可視化されながら永続的に存続する新しい仕組みを採用しています。ブロックチェーンはBincance Smart Chain, Polygonで、独自通貨ALIAを用いて購入します。
このプラットフォーム上で扱われるNFTは、AR・VRゲーミフィケーションを見据えた設計がされており「XANA」での使用も想定されています。
日本マーケティングリサーチ機構によると、本プラットフォームは「期待のNFTマーケットプレイス No.1」「2021年最も成長すると思うブロックチェーンプロジェクト No.1」「価格の上昇を期待しているDeFiプロジェクト No.1」を獲得しています。
YouTuber関係のレーベル会社として知られるUUUM株式会社のグループ会社FORO 株式会社が運営しています。
YouTuberをはじめとした幅広いジャンルの人物やキャラクターのトレカを発行・売買・閲覧することができます。
販売方法としては定額販売、抽選販売、オークション販売を予定しています。
株式会社 IndieSquareが開発したブロックチェーン「HAZAMA」が基盤となっています。
また「Yahoo!ネット募金」と連携し、HABET のプラットフォーム手数料の一部を寄付しています。 HABET を利用することで環境、社会への貢献にも繋がります。
など
mediado.jp 公式サイト:https://fantop.jp/
株式会社メディアドゥが運営しています。
各コンテンツのファンが、デジタル上の「ファンアイテム」収集・鑑賞、ファン同士の共有・譲渡・売買を行えるNFTマーケットプレイスです。
Dapper Labs社が開発したブロックチェーンFlow上に構築されており、ファンアイテム入手と同時に費用負担なくNFT化することが可能です。
今年3月には株式会社トーハンと提携し、FanTopで発行できる「NFTデジタル特典」を、紙の出版物の特典として全国各地の書店で展開します。
FatTopで販売された北斗の拳NFTが即日完売したことでニュースになりました*10。
など
株式会社クレイオが運営しています*11。
音楽専門のNFTマーケットプレイスで、エイベックス・テクノロジーズ株式会社が提供する基盤「A trust」上に構築されています。
コロナ禍大打撃を受けているクラブカルチャーを支援する目的とした企画「SAVE THE CLUB MUSIC」も行い、都内有名クラブのレジデントDJや、 Daishi Dance等トップDJの作品が出品されています。
など
まだ存在しないNFTマーケットプレイスですが、2022年春にローンチするとの情報が出ており、運営会社が大きいのでご紹介します。
こちらは楽天グループ株式会社が運営予定で、様々な分野におけるNFTをエンドユーザが売買するものと、IPホルダーがワンストップでNFT発行・販売できる仕組みを兼ね備えた独自プラットフォームとなる予定です。
決済として楽天IDを用いたり、楽天ポイントとの相互変換可能となったり、楽天経済圏を拡大する形でのNFT業界参入となります。
ここまでご覧いただきありがとうございます。
NFTマーケットプレイスは大小規模を問わない場合無数に存在し、それぞれが互いに差別化を図りつつ展開している状況です。
同じようなマーケットプレイスは、今後のマーケティング・ブランディング・コンテンツクオリティなどの優劣により、一方が淘汰されていくでしょう。
提供者・ユーザ共に手探り状態なので、今後どれが生き残りどれが消滅していくのか、また生き残った者はどのような進化を遂げていくのか、それは誰にもわかりません。
現状存在しない全く新しいマーケットプレイスが、数日の間に成長し、覇権をとってしまうようなこともあるかもしれません。
それは世間一般層へのNFT認知に従い・また世の中の情勢などが複雑に絡み合った結果、数年後答え合わせができるようなものかもしれません。
次回は、第2弾として、NFT事例のご紹介をする予定です。
そちらもお楽しみに。
*1:当時は仮想通貨という名前が一般的でした。
*2:2021/10
*3:旧メタップス株式会社
*4:2021/9 株式会社スマートアプリから社名変更。
*5:https://www.fisco.co.jp/media/crypto/nanakusa-about/#index_id0
*6:https://www.gmo.jp/news/article/7362/
*7:カスタマイズNFTショップを構築できるNFTStudioOEMも提供しています。
*8:https://www.itmedia.co.jp/news/articles/2110/05/news158.html
*9:https://www.axelmark.co.jp/pr/?itemid=374&dispmid=518
*10:https://news.yahoo.co.jp/articles/ad3eff66b3ed996abe9817df00a73d3a0912b9fc
*11:2021/6 株式会社サクラゲートから一部事業移管
こんにちは、証券フロンティア事業部の西永です。
主にサーバサイドでAPI開発に携わっています。
今回の記事ではサーバサイド……ではなく、趣味でやっているフロント寄りな情報をお届けします。
Heroku はアプリの構築、提供、監視、スケールに役立つクラウドプラットフォームで、アイデアを出してから運用を開始するまでのプロセスを迅速に進めることが可能です。また、インフラストラクチャの管理の問題からも解放されます。 jp.heroku.com
公式サイトだとちょっとふわっとしていますが、要するにPaaSです。
開発したWebアプリケーションをお手軽に公開することができます。
2021/08/06現在はNode.js、Ruby、Python、Java、PHP、Go、Scala、Clojureに対応しています。
こちらのHerokuですが、GitHubからDeployする際、サブモジュールも持ってくることができます。
しかし、そのままの設定だとパブリック上のレポジトリでないと持ってくることができません。
今回はプライベートにあるレポジトリを持ってくる方法を紹介します。
続きを読むどうも、次世代デジタル基盤開発事業部(旧ブロックチェーン事業部)の土田です。
今回から前回つくった開発環境を使ってDappsを作っていきたいと思います。
tec.tecotec.co.jp
コントラクトを書いて、プライベートチェーン上にデプロイし、実行するところまでをやっていきます。
まずはGanacheで立てたノードの永続化を行います。起動時にオプションを指定するだけです。
yarn ganache-cli --db 任意のパス --mnemonic "任意の文字" --networkId 任意の数字
各種オプションについては下記を参照して下さい。 github.com
ニーモニックとネットワークIDを指定することで、同じアカウントを使うことができます。また、この指定が無いと毎回アドレスを生成してしまいますので、注意が必要です。
MetaMaskでアカウントを作成した際に12個の単語が表示されたかと思います。アレです。
Ganacheではアドレス生成やトランザクション送信の署名等に使用されるそうです。開発で使ったニーモニックは絶対に本番で使用しないでください。
というわけで、クライアントとGUIを起動します。
せっかくなのでRPCも試しておきます。Ganache-cliで実装されているメソッドは下記辺りを参考にしてください。
まずはマイニング報酬を受け取るアカウントを確認します。
curl -X POST http://127.0.0.1:8545 --data '{"jsonrpc":"2.0","method":"eth_coinbase","id":0}' {"id":0,"jsonrpc":"2.0","result":"0xffd2004aa4baa1b1498f290b4e483b6df6d06699"}
表示されたresult
のアドレスと、クライアントを起動した際に表示されていたアドレスが一致していることを確認してください。
送金も試しておきます。RPCでのコールの際、value
には10進数を16進数に変換し、0x
を追加したものを指定します。
今回は0.01ETH
を送金するので、10000000000000000
⇒2386F26FC10000
になり、0x
を追加して0x2386F26FC10000
となります。
curl -X POST http://127.0.0.1:8545 --data '{"jsonrpc":"2.0","method":"eth_sendTransaction","params":[{"from":"0xFfd2004aA4BAa1b1498F290B4E483B6Df6d06699","value":"0x2386F26FC10000","to":"0xd144FB12830e7e2C41a070D44fb2cAe24959585D"}],"id":0}' {"id":0,"jsonrpc":"2.0","result":"0xaf24403ceceb055b97fb42bfb759763e0402118e901733b9dd521e8b1d7e5bdf"}
GUI上でもトランザクションが処理されたことを確認してみます。
トランザクションも確認でき、ETHも減っていました。
諸々の準備が出来ました。コントラクトを開発していきたいと思いますが、良い題材が思い浮かばなかったので、クリプトゾンビをやっていこうと思います。(クリプトゾンビの後半にはTruffleを使ったチャプターもあるので、そちらを参考にしても良いかもしれません。)
レッスン1のチャプター13まで進めると、シンプルなゾンビを生成することができるコントラクトが完成します。こちらをプライベートチェーンにデプロイしてみましょう!
前回からの続きになりますので、truffle-boxで準備したディレクトリで作業します。まずはデプロイ用のjsを用意し、コントラクトをsolcファイルに転記します。
転記したコントラクトファイルをcontracts
ディレクトリ配下に配置して下さい。
次に、migrations
ディレクトリ配下に下記のデプロイ用ファイルを用意します。
var ZombieFactory = artifacts.require("./ZombieFactory.sol"); module.exports = function(deployer) { deployer.deploy(ZombieFactory); };
最終的な構造は下記のようになると思います。
準備ができましたので、コンソールにてtruffle console
を実行し、いざcompile!
truffle console truffle(development)> compile
すると、おそらく下記のようなエラーになるかと思います。
truffle(development)> compile Compiling your contracts... =========================== > Compiling ./contracts/ZombieFactory.sol project:/contracts/ZombieFactory.sol:18:28: TypeError: Data location must be "storage" or "memory" for parameter in function, but none was given. function _createZombie(string _name, uint _dna) private { ^----------^ ,project:/contracts/ZombieFactory.sol:23:33: TypeError: Data location must be "storage" or "memory" for parameter in function, but none was given. function _generateRandomDna(string _str) private view returns (uint) { ^---------^ ,project:/contracts/ZombieFactory.sol:28:33: TypeError: Data location must be "memory" for parameter in function, but none was given. function createRandomZombie(string _name) public { ^----------^ Compilation failed. See above.
こちらはsolidityのバージョンの違いによるものです。ゾンビファクトリーのバージョンはpragma solidity ^0.4.19;
となっていませんか?
truffleのsolidityのバージョンを確認してみましょう。
truffle(development)> version Truffle v5.4.2 (core: 5.4.2) Solidity v0.5.16 (solc-js) Node v15.14.0 Web3.js v1.4.0
執筆時点で、v0.5.16
でした。実はv0.5.0
から破壊的変更がいくつかあるようで、その変更によりエラーとなっているようです。エラーの内容は、memory
を明示する必要があるとのことです。
Explicit data location for all variables of struct, array or mapping types is now mandatory. This is also applied to function parameters and return variables. For example, change uint x = m_x to uint storage x = m_x, and function f(uint x) to function f(uint memory x) where memory is the data location and might be replaced by storage or calldata accordingly. Note that external functions require parameters with a data location of calldata.
コントラクトの一部を修正します。コンソールで指摘されている箇所をそれぞれstring memory _xxxxx
と修正してください。
それでは、もう一度コンパイル!
truffle(development)> compile Compiling your contracts... =========================== > Compiling ./contracts/ZombieFactory.sol project:/contracts/ZombieFactory.sol:20:9: TypeError: Event invocations have to be prefixed by "emit". NewZombie(id, _name, _dna); ^------------------------^ ,project:/contracts/ZombieFactory.sol:24:36: TypeError: Invalid type for argument in function call. Invalid implicit conversion from string memory to bytes memory requested. This function requires a single bytes argument. Use abi.encodePacked(...) to obtain the pre-0.5.0 behaviour or abi.encode(...) to use ABI encoding. uint rand = uint(keccak256(_str)); ^--^ Compilation failed. See above.
また違うエラーに・・・。一つずつやりましょう。
まずはTypeError: Event invocations have to be prefixed by "emit".
です。
下記ドキュメントから、emit
キーワードを明示的に付ける必要があるそうです。
該当箇所をemit NewZombie(id, _name, _dna);
と修正しましょう。
次にTypeError: Invalid type for argument in function call. 以下略
です。これは先程のv0.5.0の破壊的変更に記載があります。
The functions .call(), .delegatecall(), staticcall(), keccak256(), sha256() and ripemd160() now accept only a single bytes argument. Moreover, the argument is not padded. This was changed to make more explicit and clear how the arguments are concatenated.
keccak256()にはbytes型のみ渡すことが出来るとのことで、修正していきます。bytesで渡せばいいので、uint rand = uint(keccak256(bytes(_str)));
とすれば良いはずです。
truffle(development)> compile Compiling your contracts... =========================== > Compiling ./contracts/ZombieFactory.sol > Artifacts written to /home/tsuchida/workspace/react-truffle-box/client/src/contracts > Compiled successfully using: - solc: 0.5.16+commit.9c3226ce.Emscripten.clang
できました!!まだまだ油断はできません。そのままデプロイします。
truffle(development)> migrate Compiling your contracts... =========================== > Everything is up to date, there is nothing to compile. 中略 3_deploy_contracts.js ===================== Deploying 'ZombieFactory' ------------------------- > transaction hash: 0x3faf47ad2d2c9c080216665d6b696938c80c1ad1e47b5cc552681b9a60c996b6 > Blocks: 0 Seconds: 0 > contract address: 0x2E5F40D8e42c5c5795d63F70Ab744F814EbC3d43 > block number: 6 > block timestamp: 1629988251 > account: 0xFfd2004aA4BAa1b1498F290B4E483B6Df6d06699 > balance: 99.97594284 > gas used: 351812 (0x55e44) > gas price: 20 gwei > value sent: 0 ETH > total cost: 0.00703624 ETH > Saving migration to chain. > Saving artifacts ------------------------------------- > Total cost: 0.00703624 ETH Summary ======= > Total deployments: 3 > Final cost: 0.01224352 ETH - Blocks: 0 Seconds: 0 - Saving migration to chain. - Blocks: 0 Seconds: 0 - Saving migration to chain. - Blocks: 0 Seconds: 0 - Saving migration to chain.
成功しているようです!
トランザクションも確認してみます。コンソールに表示されたトランザクションハッシュは下記です。
0x3faf47ad2d2c9c080216665d6b696938c80c1ad1e47b5cc552681b9a60c996b6
GUIで検索してみましょう。
GUIでも確認できましたね!
ここまでで、実際にコントラクトを自分で書いて、デプロイするということが出来たと思います。
ついでなので、実行もしてみます。truffle console
にてそのまま実行できます。公式通りにやります。
コンソールに表示されたコントラクトアドレス(0x2E5F40D8e42c5c5795d63F70Ab744F814EbC3d43
)を指定します。
truffle(development)> let myZombieFactory = await ZombieFactory.at("0x2E5F40D8e42c5c5795d63F70Ab744F814EbC3d43") undefined
undefined
と出力されますが、問題ありません。取得したオブジェクトを確認してみます。
truffle(development)> myZombieFactory TruffleContract { constructor: [Function: TruffleContract] { 略
いろいろ出力されたかと思いますが、定義したNewZombie: [Function (anonymous)],
等が確認出来るはずです。
それでは、ゾンビを生成しましょう。
truffle(development)> let myZombie = myZombieFactory.createRandomZombie("tsuchida") undefined truffle(development)> myZombie { tx: '0x772b89dd762f54bf0156800d6987b47ef0739e3ffef643904c98eb8650e1e9cf', receipt: { transactionHash: '0x772b89dd762f54bf0156800d6987b47ef0739e3ffef643904c98eb8650e1e9cf', transactionIndex: 0, blockHash: '0x0e90df84c217cfb7e9dfc8a6e52f8efd45b13ac4c2ed39113b24b0c873b51e72', blockNumber: 8, from: '0xffd2004aa4baa1b1498f290b4e483b6df6d06699', to: '0x2e5f40d8e42c5c5795d63f70ab744f814ebc3d43', gasUsed: 87786, cumulativeGasUsed: 87786, contractAddress: null, logs: [ [Object] ], status: true, logsBloom: '0x00000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', rawLogs: [ [Object] ] }, logs: [ { logIndex: 0, transactionIndex: 0, transactionHash: '0x772b89dd762f54bf0156800d6987b47ef0739e3ffef643904c98eb8650e1e9cf', blockHash: '0x0e90df84c217cfb7e9dfc8a6e52f8efd45b13ac4c2ed39113b24b0c873b51e72', blockNumber: 8, address: '0x2E5F40D8e42c5c5795d63F70Ab744F814EbC3d43', type: 'mined', removed: false, id: 'log_dd10701a', event: 'NewZombie', args: [Result] } ] }
なにやらトランザクション情報が取得できました。これもGUIで確認してみましょう。
ここでスクリーンショットをとっていて気付きましたが、イベントログが取れていないようです。コントラクトの連携もしていないので当たり前なのですが、こちらは次回以降調べてみます。
より詳しくゾンビが出来ているか、コンソール上で確認してみます。トランザクションハッシュやコントラクトのABIもわかっているので、トランザクションログをデコードして調べることにします。ドンピシャなQiita記事を見つけましたので、そのまま参考にさせていただきます。
truffle(development)> let txReceipt = await web3.eth.getTransactionReceipt("0x772b89dd762f54bf0156800d6987b47ef0739e3ffef643904c98eb8650e1e9cf") undefined truffle(development)> txReceipt { transactionHash: '0x772b89dd762f54bf0156800d6987b47ef0739e3ffef643904c98eb8650e1e9cf', transactionIndex: 0, blockHash: '0x0e90df84c217cfb7e9dfc8a6e52f8efd45b13ac4c2ed39113b24b0c873b51e72', blockNumber: 8, from: '0xffd2004aa4baa1b1498f290b4e483b6df6d06699', to: '0x2e5f40d8e42c5c5795d63f70ab744f814ebc3d43', gasUsed: '0x156ea', cumulativeGasUsed: 87786, contractAddress: null, logs: [ { logIndex: 0, transactionIndex: 0, transactionHash: '0x772b89dd762f54bf0156800d6987b47ef0739e3ffef643904c98eb8650e1e9cf', blockHash: '0x0e90df84c217cfb7e9dfc8a6e52f8efd45b13ac4c2ed39113b24b0c873b51e72', blockNumber: 8, address: '0x2E5F40D8e42c5c5795d63F70Ab744F814EbC3d43', data: '0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000181898d76b058c00000000000000000000000000000000000000000000000000000000000000087473756368696461000000000000000000000000000000000000000000000000', topics: [Array], type: 'mined', removed: false, id: 'log_dd10701a' } ], status: true, logsBloom: '0x00000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000240000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' } truffle(development)> let eventAbi = ZombieFactory.abi.filter(element => element.signature == txReceipt.logs[0].topics); undefined truffle(development)> web3.eth.abi.decodeLog(eventAbi[0].inputs, txReceipt.logs[0].data, txReceipt.logs[0].topics) Result { '0': '0', '1': 'tsuchida', '2': '6782444169266572', __length__: 3, zombieId: '0', name: 'tsuchida', dna: '6782444169266572' }
回りくどいですが、しっかりname: 'tsuchida'
で生成されているようです!プライベートチェーン上とはいえ、世界に一つの自分のゾンビです!(プライベートチェーン上なので、世に出ているわけではありませんが・・・)
というわけで、今回はここまでにしたいと思います。
GanacheGUIがトランザクション確認くらいしか出来ないので、本来の使いやすさを取り戻すべく調べつつ、コントラクト開発やフロントエンド開発を進めていきたいと思います。
ここまでご覧いただき、ありがとうございました。
docs.soliditylang.org docs.soliditylang.org ethereum.stackexchange.com github.com
こんにちは。株式会社テコテック 管理部の多田です。 今回は社員紹介をさせていただきます!
2020年10月に中途で入社し、現在決済認証システム開発事業部のプロジェクトマネージャー(以下、PM)として活躍している岡田さんにお話を伺いました。
■プロフィール■
出身地:兵庫県
好きな食べ物:蕎麦
最近ハマっていること:読書、アニメ、筋トレ、麻雀
自分を表す#:#子育てエンジニア
続きを読む最近マーベル映画シリーズ沼にハマってしまった、投資戦略システム事業部の亀井です!
普段は投資を主に取り扱う業務のサーバーサイドエンジニアとしてお仕事をさせていただいております。
現状、通常業務で量子コンピューターを扱うことはないのですが、
個人的な好奇心で片足を突っ込んだので、せっかくならと記事にしてみました。
こんな人にオススメ
▶ これから社会に進出される学生様:業界分析や面接のネタに ▶ 投資家の方:来る量子技術イノベーションに向けた業界研究の入り口になるかも ▶ ニッチなもの好きなエンジニアの方:市場的人材価値向上に繋がるかも
この記事ゴール
▶ 量子コンピューターってわからないもんなんだな、と理解する(無知の知)
この時点で、
▶「量子」も「コンピューター」もわかんないのに、「量子コンピューター」なんて到底わかりっこない! ▶ それ学んでなんの役に立つの? ▶ お金にならないものなら見たくもないんだけど?
そんな抱きしめてあげたくなるような拒絶反応を示した方が、
「ねぇねぇ、量子コンピューターって知ってる?」とおちゃめに知識をお披露目する姿を想像ながら書きました。
よければ見ていってください。
注意 この記事は2021年8月時点のものとなります。 量子コンピューターを取り巻く状況は激しく移り変わっているため、 この記事の一部の内容が陳腐化する可能性がありますことをご了承ください。