Help us understand the problem. What is going on with this article?

Solidityでブラウザからコントラクトの変数を取得する方法

web3.jsを通じてブラウザからブロックチェーン上の変数を取得するのに色々手間取ったので、書き残しておきます。

今回はstruct carの配列であるcarsから要素を取得したいと思います。(Solidity version 0.5以上です。)

sample1.sol
pragma solidity ^0.5.0;

contract sample1{
    struct car {
        string carName;
        string company;
    }

    car[] public cars;
}

Solidityではpublicな変数は自動的にgetterを定義してくれます。
なので、最初は下記の様にJavascriptで簡単にパッと取得出来ると思ってました。

app.js
function() {
    var productOwnershipInstance;
    App.contracts.sample1.deployed().then(function(instance) {
        sample1Instance = instance;
        console.log(sample1Instance.cars[0]); // undefinedが出力
      })
}

Solidity上だと上記の取得方法、つまりcars[0]だけでcars配列の最初の要素が取得できます。SolidityもJavascriptも似た様なもんだから似た様に扱えると思ってたのが間違いでした。実際はcarsというfunctionが生成され、かつPromiseが返ってくるので実際は下記の様になります。

app.js
function() {
var sample1Instance;
    App.contracts.sample1.deployed().then(function(instance) {
        sample1Instance = instance;
        sample1instance.cars(0).then(result => {
          console.log(result[0]); // carsの最初の要素のcarNameが出力される
          console.log(result[1]); // carsの最初の要素のcompanyが出力される
        });
    }
}

こんな感じで取得することになります。
もっと簡単な方法あったら教えてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away