LINE Blockchain Developers APIをつかってみた

本投稿は TECOTEC Advent Calendar 2021 の1日目の記事です。

どうも、次世代デジタル基盤開発事業部(旧ブロックチェーン事業部)の土田です。

アドベントカレンダー1日目はLINE Blockchainについてのハンズオン的な記事にしてみます。お手柔らかに。

概要

ローカルPC上にLINE Blockchain Developers SDKを利用したAPIを作り、LINE Blockchain Developers APIの使い方を学びつつ、ブラウザ上でLINE BITMAX WALLETにアクセスして操作したNFTを確認していきます。

続きを読む

日本のNFT事例20選【第二弾】

f:id:teco_roppongi:20211018112446p:plain こんにちは。どうも。次世代デジタル基盤開発事業部の六本木です。

2021年はNFT元年といっても過言ではないほど様々なNFTニュースがありました。

前回はNFTまとめシリーズ第一弾としてNFTマーケットプレイス18選をご紹介しました。

tec.tecotec.co.jp

今回はNFTまとめシリーズ第二弾として、「国内NFT事例20選」と題してお送りいたします。

続きを読む

TruffleSuiteで始めるDapps開発3

どうも、次世代デジタル基盤開発事業部(旧ブロックチェーン事業部)の土田です。

前回、GanacheのGUIアプリ上でコントラクトやイベントログが確認出来ませんでした。今回はこちらの対応を行っていきます。

tec.tecotec.co.jp

今回のゴール

GanacheのGUIアプリからコントラクトやイベントログを確認します。

現状の確認

ここまで手順を追っていただいた方はGUIからCONTRACTSタブとEVENTSタブを確認しても、何も表示されていないはずです。 f:id:teco_tsuchida:20210930091906p:plain f:id:teco_tsuchida:20210930091937p:plain

こちらを表示させたいと思います。

Truffle Projectsの追加

設定を開きます。 f:id:teco_tsuchida:20210930091957p:plain

WORKSPACEタブのTRUFFLE PROJECTSからtruffle-config.jsを指定します。本来はこれで完了です。 f:id:teco_tsuchida:20210930092010p:plain (wslには\\wsl$\{ディストリビューション}でファイルへアクセスできます。)

しかし、このまま再起動したらロード画面が延々と続くはずです。もしそのような状態になった場合は、一度GUIを落として再度設定を開き、REMOVE PROJECTで指定したファイルを削除して下さい。

なぜ上手く行かないのか?

原因はNode側の問題だと言われていますが、続報が無いのでなんともし難いですね・・・。

github.com

解決策

ビルドされたコントラクトが分かれば問題ないので、それらを指定するようにします。

ビルドされたコントラクトですが、truffle-config.jscontracts_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: "*"
    }
  }
};

これらをローカルにコピーします。パスはご自身の環境に合わせて読み替えて下さい。

f:id:teco_tsuchida:20210930092310p:plain

次に、truffle-config.jsをコピーします。networks等の設定は残っていても問題ないとは思いますが、気になる方はcontracts_build_directoryのみの設定ファイルを別途作成すると良いと思います。

f:id:teco_tsuchida:20210930092333p:plain

準備ができたら、GUIから再度ADD PROJECTをします。

f:id:teco_tsuchida:20210930092344p:plain

あとは再起動すれば完了です。

確認

すでにコントラクトをデプロイや実行していれば、そのままそれらが確認出来るはずです。

まずはCONTRACTSタブを確認しましょう。前回コンパイル&デプロイしたコントラクトが並んでいるはずです。 f:id:teco_tsuchida:20210930092418p:plain

EVENTSタブでは、前回実行したイベントログが確認できます。 f:id:teco_tsuchida:20210930092426p:plain

一覧のイベントログをクリックすると、より詳細なログが確認できます。今回は前回生成したゾンビが確認できると思います。 f:id:teco_tsuchida:20210930092439p:plain

終わり

今回はここまでとなります。

これでGUI上でかんたんにコントラクトやイベントが確認できるようになりました!作業効率UP間違いなしですね!
(本当はwsl2上のプロジェクトを直接指定できれば良いのですが・・・。)

次回はコントラクト開発やフロントエンド開発を進めていきたいと思います。
ここまでご覧いただき、ありがとうございました。

www.tecotec.co.jp

その他参考

github.com

www.trufflesuite.com

日本のNFTマーケットプレイス18選【第一弾】

f:id:teco_roppongi:20211015113952p:plain

こんにちは。はじめまして。 次世代デジタル基盤開発事業部の六本木です。

2021年はNFT元年といっても過言ではないほど様々なNFTニュースがありました。個人的には「世はまさに、大NFT時代!」と叫びたくなるほどでした。

本稿では、群雄割拠の様相となっているNFT界隈まとめ紹介の第一弾として、国内主要マーケットプレイス18選をご紹介します。

対象読者

・NFTという単語がわかる方
・国内主要マーケットプレイスを知りたい方
・NFTをご自身のビジネスに活かしたい方

目次

2021年はNFT元年

2017年の後半、暗号資産*1ブーム, ICOブームがありました。 その後一旦落ち着いたものの、2020年後半~2021年にかけて再燃し、 特にDeFiやNFTといった言葉が注目を集めるようになりました。

下記はGoogleで今年「NFT」が検索されたグラフです。

グラフを見てわかる通り、2021年に入ってから検索数がぐっと右肩上がりになっています。

NFTは依然海外での盛り上がりが先行していますが、国内でも様々なサービスが立ち上がり、様々な企業が参入しつつあります。

NFTは現時点まだ成熟したものではないので、今どのようなサービスがありどのような事例があるか知っておくことで、今後新たなビジネスチャンスに巡り合える可能性が高くなるのではないでしょうか。

今回は国内の主要マーケットプレイスについて紹介し、次回、第二弾としてNFT活用事例と主要プレイヤーについてご紹介する予定です。

では長くなりましたが、早速紹介していきたいと思います。

国内NFTマーケットプレイス

海外ではOpenSeaRaribleなどが有名ですが、国内にもマーケットプレイスはたくさんあります。現時点*2主要なマーケットプレイスは下記です。

1. Coincheck NFT(β版)

coincheck.com

コインチェック株式会社が運営しています。

カードゲーム「CryptoSpells」のカード、メタバースゲーム「The Sandbox」内の土地「LAND」、SKE48のNFTトレカ、ブロックチェーンサッカーゲーム「Sorare」のカードなどが出品されています。

また最近では株式会社CyberZと協業し、エンターテインメント分野のNFT活用促進を行う予定です。

corporate.coincheck.com

提携会社
  • CryptoGames株式会社
  • 株式会社coinbook
  • Sorare社
  • 株式会社CyberZ

など

2. miime

miime.io

コインチェックテクノロジーズ株式会社*3が運営しています。

現時点12タイトルのNFTを取り扱っています。上記Coincheck NFTと連携しており、扱っているタイトルも一部同じです。

3. nanakusa

nanakusa.io

SBINFT株式会社が運営しています*4

公認アーティストが発行したNFT、パートナー事業者のNFTを取り扱いしています。

Etherのほか、Polygonチェーンの通貨Maticでの取引が可能です*5

4. Adam byGMO

adam.jp

GMOアダム株式会社が運営しています。

現時点、YouTuber・ヒカルさんのコンテンツをはじめ様々なコンテンツ計1192点の出品・販売が行われています。

Etherのほか日本円での購入も可能です。決済手段もクレジットカード・銀行振込など幅広いです。

二次販売があった場合、クリエイターにロイヤリティ還元される仕組みがあります。

またNFT保有者限定コンテンツを提供していたり、さらに今後も様々な機能が追加される予定です*6

5. NFTStudio

nft-studio.com

ブロックチェーンゲーム「CryptoSpells」を開発したCryptoGames株式会社*7が運営しています。

出品者はNFTStudioの審査を経た公認クリエイターなので、安心して購入することができます。

取り扱い通貨として、PolygonチェーンでのMatic, LINE BlockchainでのLINKを採用しており、販売・購入時の手数料が安く抑えられています。

暗号資産ウォレットによるログインのほか、SNSでのログインも可能です。またクレジットカードでの購入も可能で、暗号資産に馴染みのない方でも購入できるよう工夫されています。

6. LINE BITMAX Wallet, NFTマーケットβ

linecorp.com

スマホベースのマーケットプレイスです。

国内で最もシェア率の高いメッセージングアプリ「LINE」を提供するLINE株式会社の関連会社LVC株式会社が運営しています。

通貨はLINE BlockchainのLINKで、ネットワーク手数料無料で利用できます。

LINE公式NFTのほか、ももいろクローバーZのトレカなどが出品されています。出品要件に適合していればエンドユーザが出品することも可能なようです。

最近ではスクウェア・エニックス、初のNFT事業 デジタルシール「資産性ミリオンアーサー」が本マーケットプレイス上で取り扱い予定とのことで、そのキャンペーンとして、LINE公式アカウントに友だち登録したユーザーに、最大総数約100万枚のNFTを配布するキャンペーンも実施しました*8

さらにブロックチェーンゲーム関連事業を行うアクセルマーク株式会社とスポーツ関連事業に特化したゲーム開発を行う株式会社OneSports が共同開発中のゲームにおいて、株式会社Jリーグとライセンス契約を結んだとのニュースもあり、その選手NFTの出品先を本マーケットプレイスとする予定です*9

提携会社
  • スクウェア・エニックス
  • 株式会社OneSports
  • アクセルマーク株式会社
  • 株式会社Jリーグ

など

7. Buynet

buynet.io

株式会社サンシェアが運営しています。

アート、イラストではなく、無形資産の既存収益権利や所有権に着目したマーケットプレイスで、具体的にはSNSインフルエンサーの会員権がNFT化しており、購入すると半永久的に、購入者の保有する商品をSNS拡散してくれるという構想のようです。

支払方法としては、Ether、USDT(ERC20)、BTC、Matic、銀行振込(日本円)・クレジットカードなどに対応しています。

8. ユニマ(Uniqys マーケットプレイス)

prtimes.jp 公式サイト:https://market.uniqys.net/

株式会社ビットファクトリーが運営しています。

NFTの購入・アーティストへの売上還元等決済は日本円で行われます。暗号資産の購入をせずに、NFTの販売・購入が可能です。

またすべてオークション形式での購入となっております。

出品されている作品には、位置情報連動型ゲーム「駅メモ! Our Rails」内デジタルアセット「ステーションNFT」や 株式会社CHET Group提供の「いがらしゆみこの世界(デジタル原画+商品化権利)」、「Buzz Magician Shin(本人との共演・コラボ権)」 、その他数名の個人アーティストによるものがあります。

貸付ファンドのオンラインマーケット「Funds(ファンズ)」とのコラボで初回ファンド提供を実施したというニュースもありました。

提携会社
  • 株式会社モバイルファクトリー
  • ファンズ株式会社
  • 株式会社CHET Group

など

9. ANIFTY

anifty.jp

ANIFTY合同会社が運営しています。

二次元イラストとキャラクターを専門に扱うNFTプラットフォームです。

アニメアートやキャラクター業界の中央集権的な業態を刷新することをミッションに立ち上げられたプラットフォームで、 本プラットフォームにより、著作権問題の解決、ファンによる消費を直接アーティストに還元する仕組みを提供しています。

公認絵師のみ出品可能で、一般ユーザは購入するのみです。

10. NCOMIX

ncomix.io

株式会社リードエッジコンサルティングが運営しています。

漫画家やイラストレーターなどのクリエイターがリアルに創作した作品に紐づくNFTが出品されています。

作品の制作過程はすべて動画公開されるほか、デジタルな権利の所有・再販と、実際のモノを受け取って所有が可能です。

このようなリアルなモノと引き換えられるNFTを通称Redeemable NFT(rNFT)といいます。

販売はすべてオークション形式で、Polygonネットワーク(Matic)を採用していますが、クレジットカードによる購入も可能です。

数名のアーティスト作品が出品されていますが、浜田ブリトニーさんの作品が出品されていることで話題のようです。

11. PolkaFantasy

polkafantasy.com

Fantasy Tech Incが運営する日本の二次元文化に特化したNFTマーケットプレイス&ブロックチェーンゲームです。

NFTマーケットプレイス、NFTを作成・閲覧・共有できるほか、複数チェーンでNFTをステーキングできます。

ベースとなっている通貨は、独自トークンXPですが、クロスチェーン技術によりEther, Pokadotでの取引可能で、今後順次チェーンを拡大予定です。

12. Digitama

zaiko.io

ZAIKO株式会社が運営しています。

本プラットフォームを使うと、ファンはブロックチェーンを通じ所有者としてアーティストやアスリートの歴史に永遠に自分の名前を刻むことができます。

マーチャンダイズ付きや投げ銭機能など自由度の高いNFT設定が可能な仕様となっており、ファンとアーティスト(アスリート)との間に強い繋がりを作ることが可能です。

最近ではアメフトXリーグ オービックシーガルズ所属バイロン・ビーティ―Jr.選手のNFTが発行・販売されました。

zaiko.io

提携会社
  • アメフトXリーグ オービックシーガルズ

13. Mosaic Nation

mosaic-n.com

株式会社ギークピクチュアズのIPコンテンツ事業部門ギークワンダーズが運営しています。

国内外のアーティストによるハイクオリティな作品が出品されており、デジタル作品と実物作品のセット出品・販売・購入が可能、またOpenSea等他プラットフォームをまたいでの出品・販売・購入が可能といった特徴があります。

第1弾として、米国やインド、欧州の富裕層を中心に数百万単位で作品が取引されるインドの現代アーティスト「Shilo Shiv Suleman」のNFTアートを販売しています。

prtimes.jp

提携会社
  • 株式会社クオン(NFT事業サポート)
  • 株式会社レシカ(開発)

など

14. XANALIA

xanalia.com

仮想空間「XANA」を開発したNOBORDER.zが手掛けています。

ただ運営は、非中央集権的に実施されており、スマートコントラクトによってブロックチェーン上で可視化されながら永続的に存続する新しい仕組みを採用しています。ブロックチェーンはBincance Smart Chain, Polygonで、独自通貨ALIAを用いて購入します。

このプラットフォーム上で扱われるNFTは、AR・VRゲーミフィケーションを見据えた設計がされており「XANA」での使用も想定されています。

日本マーケティングリサーチ機構によると、本プラットフォームは「期待のNFTマーケットプレイス No.1」「2021年最も成長すると思うブロックチェーンプロジェクト No.1」「価格の上昇を期待しているDeFiプロジェクト No.1」を獲得しています。

prtimes.jp

15. HABET

habet.me

YouTuber関係のレーベル会社として知られるUUUM株式会社のグループ会社FORO 株式会社が運営しています。

YouTuberをはじめとした幅広いジャンルの人物やキャラクターのトレカを発行・売買・閲覧することができます。

販売方法としては定額販売、抽選販売、オークション販売を予定しています。

株式会社 IndieSquareが開発したブロックチェーン「HAZAMA」が基盤となっています。

また「Yahoo!ネット募金」と連携し、HABET のプラットフォーム手数料の一部を寄付しています。 HABET を利用することで環境、社会への貢献にも繋がります。

提携会社
  • UUUM株式会社
  • ヤフー株式会社
  • 株式会社 IndieSquare
  • 吉本興業株式会社
  • 株式会社美少女図鑑
  • 株式会社電通
  • 株式会社 TBS ホールディングス
  • CYBERJAPAN DANCERS
  • 株式会社アイフリークモバイル

など

16. FanTop

mediado.jp 公式サイト:https://fantop.jp/

株式会社メディアドゥが運営しています。

各コンテンツのファンが、デジタル上の「ファンアイテム」収集・鑑賞、ファン同士の共有・譲渡・売買を行えるNFTマーケットプレイスです。

Dapper Labs社が開発したブロックチェーンFlow上に構築されており、ファンアイテム入手と同時に費用負担なくNFT化することが可能です。

今年3月には株式会社トーハンと提携し、FanTopで発行できる「NFTデジタル特典」を、紙の出版物の特典として全国各地の書店で展開します。

FatTopで販売された北斗の拳NFTが即日完売したことでニュースになりました*10

提携会社
  • 株式会社電通
  • 株式会社バンダイナムコアーツ
  • 株式会社エディア
  • 株式会社コアミックス
  • 株式会社日本文芸社
  • その他各出版社

など

17. The NFT Records

jp.thenftrecords.com

株式会社クレイオが運営しています*11

音楽専門のNFTマーケットプレイスで、エイベックス・テクノロジーズ株式会社が提供する基盤「A trust」上に構築されています。

コロナ禍大打撃を受けているクラブカルチャーを支援する目的とした企画「SAVE THE CLUB MUSIC」も行い、都内有名クラブのレジデントDJや、 Daishi Dance等トップDJの作品が出品されています。

newscast.jp

提携会社
  • エイベックス・テクノロジーズ株式会社
  • 株式会社 トゥエンティ・ミュージック
  • 株式会社サクラゲート(開発)

など

18. Rakuten NFT

corp.rakuten.co.jp

まだ存在しないNFTマーケットプレイスですが、2022年春にローンチするとの情報が出ており、運営会社が大きいのでご紹介します。

こちらは楽天グループ株式会社が運営予定で、様々な分野におけるNFTをエンドユーザが売買するものと、IPホルダーがワンストップでNFT発行・販売できる仕組みを兼ね備えた独自プラットフォームとなる予定です。

決済として楽天IDを用いたり、楽天ポイントとの相互変換可能となったり、楽天経済圏を拡大する形でのNFT業界参入となります。

まとめ

ここまでご覧いただきありがとうございます。

NFTマーケットプレイスは大小規模を問わない場合無数に存在し、それぞれが互いに差別化を図りつつ展開している状況です。

同じようなマーケットプレイスは、今後のマーケティング・ブランディング・コンテンツクオリティなどの優劣により、一方が淘汰されていくでしょう。

提供者・ユーザ共に手探り状態なので、今後どれが生き残りどれが消滅していくのか、また生き残った者はどのような進化を遂げていくのか、それは誰にもわかりません。

現状存在しない全く新しいマーケットプレイスが、数日の間に成長し、覇権をとってしまうようなこともあるかもしれません。

それは世間一般層へのNFT認知に従い・また世の中の情勢などが複雑に絡み合った結果、数年後答え合わせができるようなものかもしれません。

次回は、第2弾として、NFT事例のご紹介をする予定です。

そちらもお楽しみに。

tecotec.co.jp

HerokuでGitHubにあるプライベートなサブモジュールを使ってみる

こんにちは、証券フロンティア事業部の西永です。
主にサーバサイドでAPI開発に携わっています。
今回の記事ではサーバサイド……ではなく、趣味でやっているフロント寄りな情報をお届けします。

まずHerokuについて

Heroku はアプリの構築、提供、監視、スケールに役立つクラウドプラットフォームで、アイデアを出してから運用を開始するまでのプロセスを迅速に進めることが可能です。また、インフラストラクチャの管理の問題からも解放されます。 jp.heroku.com

公式サイトだとちょっとふわっとしていますが、要するにPaaSです。
開発したWebアプリケーションをお手軽に公開することができます。
2021/08/06現在はNode.js、Ruby、Python、Java、PHP、Go、Scala、Clojureに対応しています。

こちらのHerokuですが、GitHubからDeployする際、サブモジュールも持ってくることができます。
しかし、そのままの設定だとパブリック上のレポジトリでないと持ってくることができません。

f:id:teco_nishinaga:20210806163431p:plain
ローカルでは表示できていたのに
f:id:teco_nishinaga:20210806164000p:plain
herokuだとサブモジュールがインポートできないためエラーが出る

今回はプライベートにあるレポジトリを持ってくる方法を紹介します。

続きを読む

TruffleSuiteで始めるDapps開発2

どうも、次世代デジタル基盤開発事業部(旧ブロックチェーン事業部)の土田です。
今回から前回つくった開発環境を使ってDappsを作っていきたいと思います。
tec.tecotec.co.jp

今回のゴール

コントラクトを書いて、プライベートチェーン上にデプロイし、実行するところまでをやっていきます。

Ganacheの永続化

まずはGanacheで立てたノードの永続化を行います。起動時にオプションを指定するだけです。

yarn ganache-cli --db 任意のパス --mnemonic "任意の文字" --networkId 任意の数字

各種オプションについては下記を参照して下さい。 github.com

ニーモニックとネットワークIDを指定することで、同じアカウントを使うことができます。また、この指定が無いと毎回アドレスを生成してしまいますので、注意が必要です。

ニーモニック(Mnemonic)

MetaMaskでアカウントを作成した際に12個の単語が表示されたかと思います。アレです。
Ganacheではアドレス生成やトランザクション送信の署名等に使用されるそうです。開発で使ったニーモニックは絶対に本番で使用しないでください。

Ganache起動(永続化)

というわけで、クライアントとGUIを起動します。 f:id:teco_tsuchida:20210827180146p:plain f:id:teco_tsuchida:20210827180216p:plain

RPCを試す

せっかくなのでRPCも試しておきます。Ganache-cliで実装されているメソッドは下記辺りを参考にしてください。

github.com github.com

まずはマイニング報酬を受け取るアカウントを確認します。

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を送金するので、100000000000000002386F26FC10000になり、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上でもトランザクションが処理されたことを確認してみます。 f:id:teco_tsuchida:20210827180829p:plain f:id:teco_tsuchida:20210827180836p:plain

トランザクションも確認でき、ETHも減っていました。

いざ、コントラクト開発

諸々の準備が出来ました。コントラクトを開発していきたいと思いますが、良い題材が思い浮かばなかったので、クリプトゾンビをやっていこうと思います。(クリプトゾンビの後半にはTruffleを使ったチャプターもあるので、そちらを参考にしても良いかもしれません。)

cryptozombies.io

レッスン1のチャプター13まで進めると、シンプルなゾンビを生成することができるコントラクトが完成します。こちらをプライベートチェーンにデプロイしてみましょう!

前回からの続きになりますので、truffle-boxで準備したディレクトリで作業します。まずはデプロイ用のjsを用意し、コントラクトをsolcファイルに転記します。
転記したコントラクトファイルをcontractsディレクトリ配下に配置して下さい。

次に、migrationsディレクトリ配下に下記のデプロイ用ファイルを用意します。

var ZombieFactory = artifacts.require("./ZombieFactory.sol");

module.exports = function(deployer) {
  deployer.deploy(ZombieFactory);
};

最終的な構造は下記のようになると思います。
f:id:teco_tsuchida:20210827184335p:plain

準備ができましたので、コンソールにて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を明示する必要があるとのことです。

docs.soliditylang.org

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キーワードを明示的に付ける必要があるそうです。

docs.soliditylang.org

該当箇所をemit NewZombie(id, _name, _dna);と修正しましょう。

次にTypeError: Invalid type for argument in function call. 以下略 です。これは先程のv0.5.0の破壊的変更に記載があります。

docs.soliditylang.org

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で検索してみましょう。

f:id:teco_tsuchida:20210827181804p:plain GUIでも確認できましたね!
ここまでで、実際にコントラクトを自分で書いて、デプロイするということが出来たと思います。

実行までやってしまえ!

ついでなので、実行もしてみます。truffle consoleにてそのまま実行できます。公式通りにやります。

www.trufflesuite.com

コンソールに表示されたコントラクトアドレス(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で確認してみましょう。 f:id:teco_tsuchida:20210827181917p:plain

ここでスクリーンショットをとっていて気付きましたが、イベントログが取れていないようです。コントラクトの連携もしていないので当たり前なのですが、こちらは次回以降調べてみます。

より詳しくゾンビが出来ているか、コンソール上で確認してみます。トランザクションハッシュやコントラクトのABIもわかっているので、トランザクションログをデコードして調べることにします。ドンピシャなQiita記事を見つけましたので、そのまま参考にさせていただきます。

qiita.com

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がトランザクション確認くらいしか出来ないので、本来の使いやすさを取り戻すべく調べつつ、コントラクト開発やフロントエンド開発を進めていきたいと思います。

ここまでご覧いただき、ありがとうございました。

tecotec.co.jp

その他参考

docs.soliditylang.org docs.soliditylang.org ethereum.stackexchange.com github.com

【社員紹介】PMって大変? テコテックのPMとして働く魅力とは

f:id:teco_kanri:20210730154112j:plain

こんにちは。株式会社テコテック 管理部の多田です。 今回は社員紹介をさせていただきます!

2020年10月に中途で入社し、現在決済認証システム開発事業部のプロジェクトマネージャー(以下、PM)として活躍している岡田さんにお話を伺いました。

■プロフィール■

出身地:兵庫県

好きな食べ物:蕎麦

最近ハマっていること:読書、アニメ、筋トレ、麻雀

自分を表す#:#子育てエンジニア

続きを読む