仮想通貨アンテナ

仮想通貨 ブロックチェーン情報

npm イーサリアム ブロックチェーン

クリプトゾンビ チャプター 3: コントラクトへのアクセスのやり直し。

更新日:

クリプトゾンビ チャプター 3: コントラクトへのアクセスをやり直す

Web3.jsをプロジェクトに追加

// NPMを使用
npm install web3

// Yarnを使用
yarn add web3

//.jsファイルをgithubからダウンロードした場合

を追加。

Web3.js初期化

イーサリアムは ノード で構成されていて、全ノードが同じデータのコピーをシェアしている。
Web3.jsにおけるWeb3プロバイダの設定は、 どのノード に読み書きを処理させるかを設定すること。

(ウェブアプリでAPIコールをするためにリモートのウェブサーバーのURLを設定するようなもの)

例えばInfuraをWeb3プロバイダとして使うには、次のようにWeb3をセットアップする必要がある。
var web3 = new Web3(new Web3.providers.WebsocketProvider("wss://mainnet.infura.io/ws"));

上記の設定でイーサリアム(一般的なブロックチェーン)にアクセスできるが、トランザクションにデジタル署名をするために公開鍵/秘密鍵の管理が必要になる。
アプリのフロントエンドでユーザーの秘密鍵を自ら管理しようとするのは良い考えではないのでMetamaskを使用する。

infuraとMetamaskの利用設定。

  • Infura とは、高速な読み込みのためのキャッシュレイヤーをもつイーサリアム・ノードのセットを保持するサービスで、API経由でこれらノードに無料でアクセスで可能。
  • MetamaskはChromeとFirefoxのブラウザ拡張機能で、ユーザーは自分のイーサリアム・アカウントと秘密鍵を安全に管理し、そのアカウントでWeb3.jsを使用しているウェブサイトとやりとりすることが可能
  • Metamaskは、InfuraのサーバーをWeb3プロバイダーとして使用しますが、Web3プロバイダーを選択するオプションも提供。

Metamaskのweb3プロバイダの使用

Metamaskは、web3プロバイダをJavaScriptのグローバルオブジェクト web3のブラウザに導入する。なので web3が存在するか、そしてプロバイダとしてweb3.currentProviderを使用しているかをアプリがチェックすることができる。

window.addEventListener('load', function() {

  // Web3がブラウザにインジェクトされているかチェック (Mist/MetaMask)
  if (typeof web3 !== 'undefined') {
    // Mist/MetaMaskのプロバイダの使用
    web3js = new Web3(web3.currentProvider);
  } else {
    // ユーザーがweb3を持たない場合の対処。
    // アプリを使用するためにMetamaskをインストールするよう
    // 伝えるメッセージを表示。
  }

  // アプリのスタート&Web3.jsへの自由なアクセスが可能に:
  startApp()

})

Web3.jsがコントラクトにアクセスするためにコントラクトの アドレスと ABI が必要

コントラクトアドレス

コントラクトをデプロイすると、永久に有効なイーサリアム上の固定アドレスが与えられる。

ABI

ABIとは、Application Binary Interfaceの略である。
基本的にこれはコントラクトのメソッドをJSON形式で表していて、関数コールをコントラクトが理解できるようフォーマットする方法を、Web3.jsに教える。

Web3.jsコントラクトのインスタンス化

コントラクトのアドレスABIがわかったら、Web3でインスタンス化できる

// web3jsコントラクトをmyContractにインスタンス化する
var myContract = new web3js.eth.Contract(myABI, myContractAddress);

コントラクトの関数を呼び出す

 インスタンス化したWeb3.jsでコントラクトの関数を呼び出す方法。

Web3.jsは、コントラクトの関数を呼び出すためにcallsendの2つのメソッドをもつ。

CALLメソッド

callはview関数およびpure関数に使われる。
これはローカルのノードでのみ機能し、ブロックチェーン上のトランザクションを生成しない。

Web3.jsを使って、次のように123をパラメーターにしてスマートコントラクト内のmyMethodという名の関数をcallできる:

myContract.methods.myMethod(123).call()

SENDメソッド

sendはトランザクションを生成し、ブロックチェーン上のデータを変更する。
viewまたはpureではない関数には、sendを使う必要がある。

Web3.jsを使って、次のように123をパラメーターにして、スマートコントラクト内のmyMethodという名の関数を呼び出しトランザクションをsendすることができる:

myContract.methods.myMethod(123).send()

ここまでのクリプトゾンビのコード

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <title>CryptoZombies front-end</title>
    <script language="javascript" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script language="javascript" type="text/javascript" src="web3.min.js"></script>
    <script language="javascript" type="text/javascript" src="cryptozombies_abi.js"></script>
  </head>
  <body>

    <script>
      var cryptoZombies;

      function startApp() {
        var cryptoZombiesAddress = "YOUR_CONTRACT_ADDRESS";
        cryptoZombies = new web3js.eth.Contract(cryptoZombiesABI, cryptoZombiesAddress);//web3jsのインスタンス化
      }

データ取得

Zombie[] public zombies;

上記の様なpublicで作成したzombies配列のデーターを取り出す。

下記コードはIDを受け取って、そのゾンビをコントラクトでクエリして結果を返す。

function getZombieDetails(id) {
  return cryptoZombies.methods.zombies(id).call();
}
// 関数を呼び出し、その結果を処理する:
getZombieDetails(15)
.then(function(result) {
  console.log("Zombie 15: " + JSON.stringify(result));
});

【参考】 JSON.stringify() メソッド:あるJavaScript のオブジェクトや値を JSON 文字列に変換する。

cryptoZombies.methods.zombies(id).call()

上記コードはWeb3プロバイダのノードと通信して、コントラクトにあるZombie[] public zombiesからデータとそのインデックスidを返している。

これは外部サーバーへのAPIコールのように非同期です。

Web3はここでpromiseを返す

このPromiseがリゾルブするとWeb3プロバイダからの応答を受けとったという意味。

result は次のようなJavaScriptオブジェクトとなる

{
"name": "H4XF13LD MORRIS'S COOLER OLDER BROTHER",
"dna": "1337133713371337",
"level": "9999",
"readyTime": "1522498671",
"winCount": "999999999",
"lossCount": "0" // Obviously.
}

Promiseの基本動作

非同期処理を操作できる。

Promise は、JavaScript や Node.js において、非同期処理のコールバック関数をに記述するための仕組み

Promise は、待機(pending)、成功(fulfilled)、失敗(rejected)の3値を持つオブジェクトです。

非同期処理の成功時(resolve)、失敗時(reject)の処理を明示的に書くことが出来る

Promise オブジェクトは then(ok_callback, ng_callback) というメソッドを持ちます。

then() は、Promise が成功または失敗になるまで処理を受け流し、成功時に ok_callback を、失敗時に ng_callback をコールバック関数として呼び出します。

Promiseドキュメント

同期処理と非同期処理

同期処理

非同期処理 → 結果が返ってきたら処理を続ける

同期処理(前の処理を待たなくてもOK)

同期処理

「getDate()」が日付を取得する処理で、「getYear()」がその日付から西暦を抽出する処理になります。

 //日付データを取得する
function getDate() {
var date = new Date;
}

//日付データを元に西暦を取得する
function getYear(data) {
var year = data.getFullYear();
}

日付データを取得しないと「getYear()」が実行できない。

そこで、日付データを元にして処理をするためにgetDate()へ「コールバック」を実装する。

function getDate(callback) {

callback(new Date);

}

「getDate()」の引数にコールバックを設定すれば関数を指定できるようになる。

getDate(function(data) {
getYear(data);
});

「Promise」の使用と基本的な構文

Promiseオブジェクトを作成することで、簡潔に非同期処理を実現することができる。

newを使ってPromiseのインスタンスを作成し、その「返り値」としてPromiseオブジェクトを取得

var result = new Promise( )

Promise()の引数には関数を設定し、その中で行いたい処理を記述する

非同期処理の成功時(resolve)、失敗時(reject)の処理を明示的に書くことが出来る
非同期処理を平行・直列に実行させることが出来る

var result = new Promise(function(resolve) {

resolve(new Date);

})

関数の引数「resolve」に取得したい値を設定することで、非同期処理の結果を格納することができる。

変数「result」にはPromiseオブジェクトが格納される

「Promise」の使用と基本的な構文(もう一つの説明例)

Promiseの基本的な書き方1

new Promise(function(resolve, reject) {
resolve('成功');
});

new Promise(function(resolve, reject) {
reject('失敗');
});

Promiseはresolveとreject、ふたつの関数を引数に取ります。

resolve:処理が成功したときのメッセージを表示する関数

reject:処理が失敗したときのメッセージを表示する関数

「then」を使ったコールバック処理

Promiseは「then()」を使うことでコールバックのような処理を実現できます。

先ほど作成したPromiseは最終的に変数「result」にPromiseオブジェクトが格納されました。

このPromiseオブジェクトが格納された「result」から、例えば日付データを取得して西暦を取得するには次のよう記述できます

result.then( function(data){

console.log(data.getFullYear());

} );

Promiseの基本的な書き方2

function asyncFunction() {

// Promiseオブジェクトを返却する.処理成功時にはresolveが呼ばれる
return new Promise(function (resolve, reject) {
setTimeout(function () {
// 成功
resolve('Async Hello world');
}, 16);
});
}

asyncFunction().then(function (value) {
// 非同期処理成功
console.log(value); // => 'Async Hello world'
}).catch(function (error) {
// 非同期処理失敗。呼ばれない
console.log(error);
});

まとめ

圧縮された.jsファイルをgithubからダウンロードして読み込む

github:Learn Git and GitHub without any code!

var a;
変数 a = new web3js.eth.Contract(ABI,コントラクトAddress);

a.methods.コントラクト名(引数).call();

その他の環境構築方法.
パッケージツールから導入.

// npmの場合
npm install web3
// yarnの場合
yarn add web3
// bowerの場合
bower install web3

チャプター 5: Metamaskとアカウントへ続く

ビットコインってなに?

2008年11月、metzdowd.comにナカモトサトシにより投稿された論文Bitcoin:A Peer-to-Peer Electronic Cash Systemで定義された仕様とをもとにビットコイン・コミュニティーで開発が続けられる製造と取引に暗号学を使った通貨のことです。

ビットコイン自体は、フリー・ソフトウエアで、ソフトウェア開発のプラットフォームGitHubに登録すれば、ソースやドキュメント閲覧が可能で、開発に参加も可能です。

ナカモトサトシは、2010年12月まで開発に携わっていましたが、その後姿を消しました。日本名ですが、国籍も含め匿名性が高く身元も不明です。

真偽のほどは、不明ですがSBI社長の北尾氏が、2018年3月期第2四半期 SBIホールディングス(株)決算説明会動画の1:29:20頃)でナカモトサトシと議論を交わしたと発言して話題になりました。

ビットコインの仕組み

ビットコインは、P2P型の公開型分散台帳技術(DLT)によって信頼性を担保され運用されるブロックチェーンで結合された暗号通貨(cryptocurrency)のことです。

ビットコインは、P2Pネットワーク上のサーバー上で同一取引情報を持ちコントロールすることで取引の妥当性のチェックが行われるため、銀行など、特定の管理者がいない非中央集権型の仮想通貨と呼ばれています。

ブロックチェーン


GitHub

ブロックチェーンの動き

マイニング

ビットコインは送信アドレス(Tx)に対するデジタル署名によって保護されており、一定時間(10分)ごとに、すべての取引記録を分散台帳に追加します。

その追加処理には、ネットワーク上の分散取引台帳データと、10分間に発生したすべての取引のデータの整合性を取りながら正確に記録することが必要です。

整合性を取る作業は、膨大な計算量が必要となるため専用のハードウエアの計算能力を使って、誰でもが取引を処理することができます。

この手伝いをしてくれた人(膨大な計算処理を行った人)の中で、結果として追記処理を成功させた人には、その見返りとしてビットコインが支払われます。

この作業をマイニングと呼びます。

マイニングには、ソロマイニングとプールマイニングがあり、個人のPCでも余った演算能力でプールマイニングに参加できます。

ジェネシス・マイニングでのハッシュパワー購入

ジェネシス・マイニングは世界最大の高く信頼されたビットコイン クラウド マイニングのプロバイダーです。ハッシュパワー購入時に,コード(kjx2uz)を使用した人は、購入時に3%の割引になります。

ブロックチェーンエクスプローラー

ブロックチェーンアドレスを入力することで、送金状況(confirmation回数の確認)が行えます。

ブロックチェーンエクスプローラー

ブロックチェーンエクスプローラー(chainFlyer)

ビットコイン価格とチャート表示

-npm, イーサリアム, ブロックチェーン

Copyright© 仮想通貨アンテナ , 2020 All Rights Reserved.