【初心者向け】web3.jsで展開済のコントラクトを呼び出す時にハマったこと


初投稿です。よろしくお願い致します。こちらの記事を参考にweb3.jsを使って展開済のコントラクトを呼び出そうとしたのですが、えらいハマってしまい大変な思いをしたので、どんな点でハマってしまったのかを書いていきたいと思います。

前提条件

  • gethが正常に動作している(gethのバージョンは1.8.8)。
  • Remixが正常に動作している(Remixのバージョンは0.6.3)。
  • gethとRemixの連携ができており、コントラクトのデプロイまでできている。
  • web3.jsがインストールされている(web3.jsのバージョンは0.20.0)。
  • なお、こちらはgethとRemixをレンタルサーバー(VPS)上で動かしています。OSはUbuntu16.04です。

なお、前提条件ができていない場合は、一番下の参考記事を参考にしてみて下さい。

展開済のコントラクトを呼び出してみる

test.js
var Web3 = require('web3');
var web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

//abi情報
var abi = [{"constant": true,"inputs": [],"name": "HelloEther","outputs": [{"name": "","type": "string"}],"payable": false,"stateMutability": "pure","type": "function"}];

//コントラクトのアドレス
var address = "0xb37ea71ecdcb442c3a5c9ce3ce63fdaaa6976da5";

//コントラクトの取得
var contract = web3.eth.contract(abi).at(address);

//実行
var response = contract.HelloEther.call();

console.log(response);

web3.jsをインストールしたフォルダに、上記のjsファイルを置いて、実行します。なお、IPアドレスと、abi情報、コントラクトのアドレスはご自身の環境のものを記して下さい。

コントラクトは、以下のファイルになります。

HelloWorld.sol
pragma solidity ^0.4.22;
contract helloWorld {
 function HelloEther () public pure returns (string) {
   return 'Hi Ether';
 }
}

上記のコントラクトをデプロイまでしてあげてから、上のjsファイルを実行して下さい。

自分がハマったポイント

では、自分がハマってしまったポイントをご紹介しようと思います。以下の3つになります。

コントラクトのアドレス

まずは、test.jsの中にある、コントラクトのアドレスですね。これを自分はてっきり図の①のアドレスだと思っていましたが、そうではなく②のアドレスなのですね。

abiはコピペしないとダメ

abi情報は目で見れるものを打ち込むのではなく、クリップボード機能を使ってコピペしたものを書いてあげないとダメです。

contractの次は関数名

こんなの間違えるのは自分だけかもしれませんが、var response = contract.HelloEther.call();のcontractの次はコントラクト名ではなく、その中の関数名を書いてあげないとダメです(この場合、HelloEther)。自分はここをhelloWorldって書いてました。

まとめ

以上駆け足で、ハマったポイントをご紹介してきました。いかがでしたでしょうか。こんなの当たり前じゃんと思われる方が大半かもしれませんが、自分のような初心者はハマっちゃうんじゃないかなと思い、書いてみました。この記事が誰かのお役に立てれば幸いです。

参考記事