villagerHの日記

勉強したことや苦労した事などを書き綴ります

前進

結構前進した気がします!

前回記載した問題点
・msg.senderでアドレスを保存しているはずなのに保存されない
実際のコードより

uint id = units.push(Unit(pow, 1/*level*/));
unitToOwner[id] = msg.sender;

mappingにpushした時に返ってくるindexは
挿入したindexの次のindexです!!!!!

正しくはこう

uint id = units.push(Unit(pow, 1/*level*/)) - 1;
unitToOwner[id] = msg.sender;

アドレスと保存位置がずれてたらそりゃ正しく取得できないですよ;


これで正しく動いてくれるようになったのですが
上記のUnitを生成してるmethodのretrunでidを返してしまえばいいと思って作っていたのですが
フロントエンド側で呼び出した時にどうもうまく数値が取得できない。

ログを覗いて見ると意図しているreturnの値でなくトランザクションのハッシュやら何やらが入っていました。
どういうことだ?と思いweb3のドキュメントとか覗いてみてました。

コントラクタの状態を変化させるmethodの呼び出しはsend
変化させずに取得のみ行うようなものに関してはcallが呼び出されます

なるほど。sendのドキュメントを見てみたら先ほどのハッシュ値とかが確かに定義してありました。
でも自分で定義したreturnもどこかで返ってきてるんじゃないの?とか思いつつさらに調べました。


「状態変更関数(別名トランザクション)は、ブロックチェーンの状態を変更する前にマイニングする必要があるため、非同期にマイニングされる関数からの戻り結果は期待できません」Chrome翻訳)

な、なるほどー!
確かにいつマイニングされて初めて数値が変わるものの返りは期待できないですね。
妙に納得してスッキリしたのとブロックチェーンならではの問題だなという感じでちょっと感動しました(笑)


これにより現在できてるコントラクタのmethodは全て呼び出すことに成功しました!
少しずつではありますが前進してますね!


・eventでログを残しているはずなのに保存されない

こちらはまだ不明です。
Ganache上では確認できないですがtruffleのテストでは確認できてるのでとりあえずは後回しにしておきます。