//tips
//smart contract
Udemyで最適な環境構築部分を知りたかったのだが、基礎部分もがっつりあるので先にそちらも確認していく。
自分のlaptopにてコンパイルしたcontract sourceをrinkebyなどのネットワークdeployするとcontract instanceとしてオブジェクトとして生成される。
この流れはクラスを自身で作成し、そのインスタンスを生成している流れと似ている。
Solidityで書かれたものがcontract difinition、そこからコンパイルすると、2つのアウトプットが得られ、それが以前触れたbytecodeとABIになる。bytecodeが実際のcontractの内容とABIがインターフェースで機械語であるbytecodeを我々がみて、気づきを得やすくするもの。
Remixで下記を記載。
pragma solidity ^0.4.17;
contract Inbox{
//インスタンスの中身
//このstorage変数はブロックチェーン上に保存される
string public message;
//contract名と同じfunctionはコンストラクターとしてcontract生成時
//自動的に必ず一回呼ばれるもの
function Inbox(string initialMessage)public{
message= initialMessage;
}
function setMessage(string newMessage)public{
message=newMessage;
}
function getMessage()public view returns(string){
//アクセスして値を返しているだけなのでview
return message;
}
}
これはremixでcontract sourceを作り、bytecodeにコンパイルし、deployするとブラウザのfake network(javascript VM)にインスタンスとして生成される。
そしてdeploy後にinitialMessageを入力すると、その後に、インスタンスが生成され、setmessage,getmessageが使えるようになる。
これはcontractのstarageに格納されている変数messageをcontract内の関数で処理していることを意味する。
また、getMessage()をコードベースで削除してもデプロイされたインスタンスの機能には影響しないので再デプロイしてインスタンスを生成し直す必要がある。
デプロイ時にtoが無い場合にのみcontractが生成されることになる。そして、何かブロックチェーン上での変更がある場合は、それはtranactionという形を通して実行されることになる。
string public message;がデプロイされ、messageをブロックチェーン上で見る場合にはcallされ、それはtransactionを実行するものではないため、コストも必要なく、即座に結果が返される。
一方で setMessageはトランザクションであり、ブロックチェーン上の値を変更するため、callではなくなり、コストもかかるtransactionを使うことになる。同時に、transactionコードも取得できる。
gas priceは最小単位であるweiで表され、senderがtransaction処理を依頼するためにかかるコスト。pay per unitで換算されるため、gas priceを10でオファーすることの意味は、3wei使用する足し算を3*10=30weiのコストとして負担するということ。
Gaslimitはこのtransactionで消費するガスの許容できる最大gas数を示す。ループ処理が延々に終わらないなどが起こってしまうと膨大なコストがかかることになるので、それへの対策となる。
例えばgaslimit10に設定し、doMathfunction内で下記を順に実行していくとすると、
Add:cost3
Substract:cost3
Multipply:cost5
足し算と引き算の部分は実行されるが、10を超えるタイミングとなる掛け算は実行されないことになる。
Gaslimit20とすれば通るので、gasprice300でtotalcostを見てみると
300*wei/gas*11gas=3300weiがtotalのgasコストとなる。
ここからremixではなくエディターを使用しての作成を行っていく。
早速vscodeに移すも下記のエラー。このエラーをどうにか解決する方法を見つけなければならないよう。npm installまたはnpm initが問題か。
Source file requires different compiler version (current compiler is 0.8.10+commit.fc410830.Emscripten.clang)
また、Constructorを呼ぶ場合やmemoryを呼ぶ場合についても確認する必要がある。