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が出力される
});
}
}
こんな感じで取得することになります。
もっと簡単な方法あったら教えてください。