FC2ブログ

Solidityの仕様のまとめ(データ型、単位換算、グローバル変数)

どうも、ぺろりんです。


今日も今日とて、ちょっとずつですが「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」を読み進めていきます。

今回はCHAPTER3-4で、Solidityのざっくりとした仕様説明みたいな章なので、ここでの知識をメモとしてまとめておきます。


Solidityで使えるデータ型

Solidityでは以下のデータ型が使えます。
小数点を扱えるデータ型、日付型もないというのは注意しないといけないですね。

カッコの中には「値型」か「参照型」[注1]の分類を記載しています。


ブーリアン(bool:値型)

・true(真)かfalse(偽)の値をとる。
・使える演算子は「!(not)」、「&&(and)」、「||(or)」、「==(equal)」、「!=(not equal)」。
・andとorは短絡評価[注2]


整数(int、uint:値型)

・符号付の「int」、符号なしの「uint」がある。
・8~256の、ビット数が8の倍数長の型がある(例:int8、uint256)。数字を省略すると256になる。
・使える演算子は比較演算子(<=、<、==、!=、>=、>)、ビット演算子(&:and、|:or、^:xor、~:not)、算術演算子(+、-、*、/、剰余:%、累乗:**、左シフト:<<、右シフト:>>)。


アドレス(address:値型)

・20倍とのアドレスを格納する。
・初期値は0x000…00(16進数で20倍となので、0が40個)。
・使える演算子は比較演算子(<=、<、==、!=、>=、>)。
・使えるメソッドは所有ETHの確認:<アドレス値>.balance、ETHの送金(失敗時はなかったことになる):<address>.transfer(uint256 <送金量>)、ETHの送金(失敗時はfalseを返す):<address>.send(uint256 <送金量>)returns(bool)、gas指定で送金(失敗時はfalseを返す):<address>.call.value(uint256 <送金量>).gas(uint256 <ガスの値>)returns(bool)。


配列(Arrays:参照型)

・固定長:<配列名>[<長さ>]、可変長:<配列名>[] がある。
・配列の要素は0番目からスタート。
・使えるメソッドは配列の長さ確認:<配列名>.length、配列の最後に要素を追加:<配列名>.push(<追加する要素の値>)。


文字列(string:参照型)

・文字列の比較はできない。keccak256()という関数でハッシュ値に変換することで比較できる。
・最大長は256bit?

(参考)
Solidity言語メモ(Qitta)
【Solidity基礎】型の種類(ブロックチェーンエンジニアとして生きる)
Ethereum Solidityの型(block-chain.jp)


構造体(Structs:参照型)

・構造体[注3]は以下の書式で宣言。

struct <構造体名>{
<データ型> <変数名>;
<データ型> <変数名>;

}

・直接構造体自体の値は返せないので、<対象構造体の配列名>[<要素番号>].<構造体中の変数名>の形で値を取得する。


マッピング(mapping:参照型)

・連想配列。値を呼び出すキーとなる名前を付ける。
・mapping(<キーのデータ型>=><呼び出したい値のデータ型>)の形式で宣言する。


単位換算

仮想通貨Etherの単位

Ethereumの単位はwei、szabo、finny、etherとある。
・以下の書式で単位換算できる。

<換算後の量> = <換算したい元の量> / 1 <単位>



時間の単位

・使える単位は、seconds(秒)、minutes(分)、hours(時)、days(日)、weeks(週)、years(年:= 365days)
・以下の書式で単位換算できる。

<換算後の量> = <換算したい元の量> / 1 <単位>



グローバル変数

ここはまだイマイチ使い方がわからないので写経します。

・block.blockhash(unit blockNumber):指定ブロックのハッシュを返す。
・block.coinbase:カレントブロックのマイナーのアドレスを返す。
・block.number:カレントブロックの番号を返す。
・block.timestamp:カレントブロックのタイムスタンプを返す。
・msg.sender:送信者のアドレスを返す。
・msg.value:送金額を返す。
・now:block.timestampのエイリアス。


まとめ

今回はSolidityの仕様に関しての知識が書いているパートだったので、動きを見るよりも、勉強ノート的な感じでメモとしてまとめておきました。
こうやってデータで残しておくと、あとで検索できて便利かなと。。


[注1] 値型、参照型…値型は値そのものが入るが、参照型は値のアドレスが入る。
[注2] 短絡評価…「A || B」の真理値がAのみで決まるときにBは考慮されない、というような評価。たとえば、A=trueの場合、Bがtrueでもfalseでも(A || B)はtrueなので、Bは評価されない。
[注3] 構造体…複数の型のデータから構成されるデータ構造。

テーマ : プログラミング
ジャンル : コンピュータ

Keyword : ブロックチェーン Browser-Solidity Solidity Ethereum イーサリアム

Browser-Solidity(Remix)でEthereumを送金してみる

どうも、ぺろりんです。

今回は、オンライン上で使用するBrowser-Solidity(Remix)でEthereumを送金してみます。

やり方は、いつも通り「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」を参照しながらやってみます。

ただしすこし教科書と環境が違うので、そのへんは探り探りです。
環境に関してはこちらこちらの記事をご覧ください。


Browser-Solidity(Remix)でのEthereum送金

送金確認コントラクトのデプロイ

まずは教科書にあるコードをそのまま使わせてもらい、コンパイルしてみます。


「function ()」の後ろに「public」がないと警告が出るので、ここで使っている教科書をお使いの方はご注意ください。
これは「Solidity環境の準備で手こずっている話」の内容を参照のこと。

ただ、実はこれでも以下の警告が出ます。。
Static Analysis raised 1 warning(s) that requires your attention. Click here to show the warning(s).


この警告のリンクを見に行くと以下の内容が表示されるのですが、このままやっても動きそうなので、ひとまずここでは無視して進むことにします。
Fallback function of contract RecvEther requires too much gas (40541). If the fallback function requires more than 2300 gas, the contract cannot receive Ether.


コンパイルしたのでデプロイしたいのですが、その前にアカウントのアドレスを確認してみましょう。
Run>Accountの横にあるアイコンをクリックしてアドレスをコピーします。
内容をメモ帳に出したのが次の画像です。


さて、デプロイしてみます。



先ほどコピーしたアカウントのアドレスとデプロイ後の情報を比べてみると、fromのところに先ほどのアドレスがあります。


Account部分に戻ってみると、先ほどは「100 ether」だった部分の値が「100」から減っていることがわかります。


まだ送金するETHの指定はしていなかったので、デプロイ時にgasを支払っている分が引かれてるってことかな……?


ためしに 1[wei] を送金してみる

次はRun>Valueに「1 wei」を指定して、右下の「RecvEther」を開いて「(fallback)」を押してみます。




この時点で「recvEther」と「sender」を押すとこんな内容になります。
「recvEther」の値の1ってのを見ると、「recvEther」にETHが送られた感があります。




また、Run>Accountのところの値もさっきより減っています。



別アカウントから 1[wei] を送金してみる

今度はRun>Accountでアカウントを変更して、別のアカウントから 1[wei] 送金してみましょう。




ちゃんとアカウントからもETHが減っています。


……ただし計算が合ってるのかがわからないw
たぶん送金で指定した 1[wei] と、「transaction cost」とか「execution cost」あたりが消費されてそうな気がするんですが、gas priceがわからなくて計算できない。。(「gas price」についてはこちらを参照)

右下の「recvEther」も見てみましょう。今度は「2」になっています。
教科書にも書いている通り、ここは[wei]単位で出るようです。




「recvEther」のところの「0:」は、下の「sender」にある「address」と紐づいているのかな……??

一応確認してみると、初めに選んでいたアカウントのETHは特に減っていませんでした。


こんな感じで、とりあえず送金はうまくできました。


まとめ

今回は、送金確認用のコントラクトをデプロイして、(たぶんそのコントラクトに向けて?)ETHを送金してみました。
アカウントを変更して送金することもやってみて、ちゃんと選んだアカウントから送金着にETHが減っているところも確認できました。

徐々にではありますが、一応なりともBrowser-Solidity(Remix)の基本的な動きが見れてきた気がします。

ではまた次回へ。

テーマ : プログラミング
ジャンル : コンピュータ

Keyword : ブロックチェーン Ethereum イーサリアム Solidity Browser-Solidity

Browser-Solidity(Remi)で既存コントラクトにアクセスしてみる

どうも、ぺろりんです。

前回は、かなり手こずりながらもオンライン版のBrowser-Solidity(Remix)をなんとか動かすことができました。

この環境の使い方を知るために、もう少しいじってみようかと思います。

ひとまず、教科書として使っている「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」でやっている「既存コントラクトへのアクセス」をやるのが今回の目標です。

つまづきながらも一応は目標を達成したので、その紆余曲折をおたのしみくださいw


既存コントラクトへのアクセス

既存コントラクトの作成と警告の対処

既存コントラクトにアクセスするための事前準備として、まずは前回と同じ要領で、アクセス先のコントラクトとして1つコントラクトを作ってみましょう。

……というわけでブラウザのキャッシュを消して前回と同じことをやってみたら、また別の警告が!


警告内容は以下のようなものです。
browser/sample.sol:6:2: Warning: Defining constructors as functions with the same name as the contract is deprecated. Use "constructor(...) { ... }" instead.
function HelloWorld(string _greeting) public {
^ (Relevant source part starts here and spans across multiple lines).


ググってみると、どうも上の画像にある記法は非推奨だとか。
参考サイトによれば、コントラクトと同じ名前の関数名でコントラクタを定義するのはだめで、constructorと書きなさいってことみたいです。

まだコンストラクタなどがよくわかってないですが、やってみるとうまくいきました。


ためしにデプロイしてsetGreetingに文字を入れ、greetingとかsayとかをポチポチ押してみます。


とりあえずうまくいったっぽい……。

これでアクセス先のコントラクトは用意できました。

(参考)
Ethereum: Solidity v0.4.23〜 の新しいコンストラクタの書き方(Qiitta)


既存コントラクトにアクセスしてみる

さて、教科書と微妙に違う環境で教科書通りに進もうとしてるので探り探りですが、次は既存コントラクトにアクセスしてみます。

既存コントラクトにアクセスするためには、アクセス先の既存コントラクトのアドレスを知る必要があります。

まずコントラクトアドレスってどれだってことで、半分勘に頼りながら探ってみます。。
同じHelloWorldさんをもう一つデプロイして、別の文字「へろー」をsetGreetingに入れたものを作ってみました。


先ほどの図の右下の赤枠で、いかにもこの2つ目(setGreetingに「へろー」と入れた方)のアドレスをコピーできそうなところがあります。
で、プロンプト的な画面のなかで、こいつをデプロイした行がどれかと探るわけですが、「creation of HelloWorld pending...」というデプロイ中っぽい行の後に、「HelloWorld」の文字が。
三角マークを押して開いてみて、「contractAddress」にある値と、先ほど右下の赤枠でコピーした内容(上の画像のメモ帳参照)を比べてみると一致します。

なのでまぁ、、さっきの右下の赤枠でコピーできるのが、その時デプロイしたコントラクトのアドレスっぽいかな、という予想のもとすすんでみます。

先ほどは2つ目のコントラクトアドレスを見ていましたが、今度は3つ目のHelloWorldをデプロイして1つ目のコントラクト(HelloWorld)にアクセスすることを目指してみます。

例によって、1つ目のHelloWorld(setGreetingに「Helloはろー」と入れた方)で、コントラクトアドレスをコピーします。


ここでコピーした内容を、Deployボタンの下にあるボックスにペーストして、「At Address」ボタンを押してみます。


「At Address」を押して出てきた(デプロイされた)3つ目のHelloWorldで、setGreetingに“何も入力せず”にgreetingとsayを押してみます。
すると、1つ目のHelloWorldでsetGreetingにあった「Helloはろー」というのが出てきました。


これで、既存コントラクトへのアクセスができた……気がしますw


まとめ

今回は、Browser-Solidity(Remix)をオンライン上で使い、あらかじめデプロイしたコントラクトに(紆余曲折のすえ)アクセスする(既存コントラクトへのアクセス)ということをやってみました。

既存コントラクトの準備中「Defining constructors as functions with the same name as the contract is deprecated.」という警告に出くわしたので、その対処もしました。

一応なりとも目標だった「既存コントラクトへのアクセス」はできましたが、だいぶのんびり進んでいますねw
まぁまったりとやっていきます。では今回はこのへんで。
また次回~。

テーマ : プログラミング
ジャンル : コンピュータ

Keyword : ブロックチェーン Browser-Solidity Solidity Ethereum イーサリアム

Solidity環境の準備で手こずっている話

どうも、ぺろりんです。

前回のつづきとして、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」3章に入ってスマートコントラクトの開発環境として「Solidity」という言語の環境を整えようとしているんですが、案の定(笑)なかなか上手くいかず詰まりました。

さしあたっての妥協案として「Browser-Solidityをオンラインで使う」という方法が一応は上手くいきそうになってきたので、またすぐ詰まりそうだという不安は置いておいて、環境としてはしばらくこの方向で進んで行きたいかと思います。
ダメそうだったらまた考えますw

というわけで今回は、まずどんな感じで詰まっていたかという話と、「Browser-Solidityをオンラインで使う」やり方をここにまとめておきます。
Solidityの使い方に関しては、たぶんよくご存知の方からするとそれじゃダメだろってとこがあるのではと思っているので、そういう感想の方はぜひともメールフォームからご連絡いただけると非常に助かります。。


上手くいかないところ

理解が浅すぎてだいぶ色々問題が起こっていますw
棚卸ししてみるとだいたいこんな感じです。

コンパイルできない話

まず初めにやったのが、前回まで使っていたVM(仮想マシン)の環境で、いつもの教科書通りにSolidityのコンパイラをインストールしました。

で、本にある「Gethにsolcのパスをセット」するところまでは上手くいきました。

しかし、この次のコンパイルするところが上手くいかない。。
> sourceCompiled = eth.compile.solidity(source)


メモり損ねて記憶があいまいですが、たしか参考に挙げたリンク先にある以下のエラーが出てた気がします。
Error: The method eth_getCompilers does not exist/is not available
at web3.js:3104:20
at web3.js:6191:15
at web3.js:5004:36
at :1:1


教科書の注意書きで、Gethのバージョンが1.6以降はコンパイルが上手くいかないと書いているのですが、この本ではGethをインストールするときにv1.5.5にバージョンを切り替えていて、この通りにやっているのでコンパイルも上手くいくかと思っていたのですが、ちょっとよくわからない。

これだと上手くいきそうにないのと、教科書の先を見るとBrowser-Solidityを使っていたので、Browser-Solidityが出てくるあたりまでスキップしてこの環境を整えることにしました。

(参考)
go-ethereum(geth)でSolidityのコンパイルが出来ない場合(Qiita)


Browser-Solidityをローカルで上手く使えない話

さて、ここでも教科書べったりでやってみたのですが、まずはVM環境ではなく、VM Playerを載せているWindows 10でBrowser-Solidityをインストールしてみました。

が、「Environment」で「Web3 Provider」を選ぶところで無事死亡w



理解が浅いまま進んでいるのが原因ですが、「Web3 Provider Endpoint」がよくわからん。
どのIPアドレスを設定すべきかよくわからず、とりあえずlocalhostにしてみるも上手くいかず。


このあと「172.0.0.1」を試してみるも、やっぱりダメ。

参考に挙げたリンク先に「go-ethereum/gethがOS上にインストール済みであることを前提にしています。」と書いてあるのを見かけて、gethをインストールしたVM Player上のLinux(Ubuntu)ではなく、その外の(gethをインストールしていない)Windows 10でやっていたので「デスヨネー」となりました。

というわけで、VM Player上のLinux(Ubuntu)で再度同じことをやってみることにしました。

(参考)
Etherum Browser-Solidityを利用したコントラクト開発・デプロイ・実行(Qiita)


VMを作り直したらgethをビルドできない話

VM Player上のLinux(Ubuntu)でやろうとしたら、Browser-Solidityをデフォルトで入っているFirefoxで開くと固まる……w
Firefoxだと重いのかなーと、Chromeを入れて試してみることに。

すると、Chromeさんがインストールできない!
色々試した結果、最新バージョン(今回はv18.04で、以前のは過去記事を見るとv16.04)のUbuntuで仮想マシンを作り直してみたら、Chromeのインストールはできました。
ついでに言うとVM Ware Toolsも上手く入らない……(こっちはVM Playerのバージョンの問題……?)

仮想マシンを作り直してしまったので再度Geth環境を整えて、その上でBrowser-Solidityをインストールする必要があります。

なのでGethをまたインストールしました。
ところが!今度は「make geth」でビルドできないw
(VM Ware Toolsが上手くいってないせいでゲストOSとの間でコピペができないっぽいため画像で)


Go言語のバージョンが低いと怒られている感じがするんですが、実際バージョン確認するとこんな感じ。


これだけ見ると1.10みたいにも見えるんですが、「.」の後ろは「じゅう」ではなくて「いちぜろ」なのかな……?

というわけでGo言語のバージョンを変えたいんですが、この辺の扱いが不慣れすぎてまったく上手くできず(;´Д`)
これは参考リンクあたりを見ながら上手くいかないかなぁ。

ひとまず、仕方ないので代替案として、オンライン上でBrowser-Solidityを動かしてみることにしました。

(参考)
PINE64(Ethereumのマイニング、geth導入成功)(ねこめも)


Browser-Solidityをオンラインで使う

これはようやく上手くいきました(少なくとも、目的のコードが動いた)。
そんなわけで、途中のトラブルシューティングをはさみつつ、上手くいったところまでの手順を書いておきます。

まず、Browser-Solidity (Remix) のページに行きます。


とりあえずデフォルトで入っているballot.solはいらないのでファイル名横の「×」ボタンで消して、「+」ボタンからSample.solという名前のファイルを作ってみます。




ためしに教科書に載っていたテストコードを入れてコンパイルしてみます。


このままコンパイルすると、警告が4つ出てきます。


内容としては次の2種類です。
Static Analysis raised 3 warning(s) that requires your attention.

browser/Sample.sol:<何行目か>:<何文字目か>: Warning: No visibility specified. Defaulting to "public".
function <関数名>(<引数>){
^
Spanning multiple lines.


警告は出ていてもデプロイはできるようですが、気持ち悪いので対応したいところ。
調べてみると、「Warning: No visibility specified.」の方はどうも「visibility」という設定がないと警告が出るようです。(エラー内容そのままですが)

よくわからないままですが、調べた先の情報を参考に「visibility」として「public」(入れる位置は画像の位置が正しそう)というのを入れて再度コンパイル。
3つあった「Warning: No visibility specified.」という警告は消えましたが、残り1つが消えない。。


内容的に、「Warning: No visibility specified.」が消えたら消えるのかと思ったのですが。
これもよくわからないのでいったん放置。


「Run」タブの「Environment」で「JavaScript VM」を選びます。
これを選ぶことで、オンライン上で仮想環境を作ってデプロイできるようです。


「Deploy」を押してみます。



この状態でデプロイ成功みたいです。


下のプロンプトを見てみると(エディタ部分との境目くらいに広げるための矢印が出てくる)、contractAddress とかが割り当てられていることがわかります。(左の三角を押すと詳細が見られます)





文字入力部分に「"Hello, World!"」(「"」は必須のようです)を入れて「setGreeting」を押すと、プロンプトのところがさらに進みます。



「greeting」と「say」も押してやると、プロンプトにもこいつらに関する処理結果が返されて、「greeting」と「say」のところにも「Hello, World!」が出てきます。



ここまでで、場当たり的(というか力ずく?)にではありますが、一応は教科書にあるコードをBrowser-Solidity上で動かせました。

(参考)
手軽に“Solidity”言語でスマートコントラクト開発、開発環境「Remix」ってどう使う?(@IT)
Ethereum のスマートコントラクト実行環境を整える(Qiita)
【堅牢なスマートコントラクト開発のためのブロックチェーン】エラー改善メモ”No visibility specified. Defaulting to “public”.”(ICG -I can't graduate-)
Remixとbrowser-solidityの使い方(たったひとりのIT事業部。)


まとめ

紆余曲折のすえ、さしあたりローカルのオフライン環境でSolidityを使うことはあきらめ、オンライン上でBrowser-Solidityを使って勉強を続けることにしました。
オンライン上でVM環境を動かすには、Browser-Solidityの「Run」タブにある「Environment」で「JavaScript VM」を選べばいけそうです。

この環境でできそうなところを、前回のつづきとして、「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」に沿ってすすんでみたいと思います。
またすぐ詰まりそうな気がしますが……w

Solidityの公式ドキュメントも読みつつちゃんとできるといいな。。

次回は「既存コントラクトへのアクセス」をBrowser-Solidity(Remix)からやってみます。

テーマ : プログラミング
ジャンル : コンピュータ

Keyword : ブロックチェーン イーサリアム Ethereum Solidity Browser-Solidity

Ethereumテストネットワークで送金してみる(続き)

どうも、ぺろりんです。

「はじめてのブロックチェーン・アプリケーション Ethereumによるスマートコントラクト開発入門」のつづきです。

前回はアカウント0からアカウント1へEthereumを送金してみました。
今回は、coinbase(=アカウント0)ではないアカウントから送金することで、手数料が発生する動きを見てみます。


Ethereumの送金手数料

送金にはGasという手数料がかかるのでした。

前回の送金ではcoinbaseであるアカウント0から送金したため実質的に見えなかったのですが、実際にはトランザクションの実行にはGasという手数料がかかっています。

たとえばcoinbaseではないアカウント1からアカウント2へ5[ETH]を送金してから2つのアカウントで残高確認してみると、こんな結果になりました。
> web3.fromWei(eth.getBalance(eth.accounts[1]),"ether")

4.99958
> web3.fromWei(eth.getBalance(eth.accounts[2]),"ether")

5

これを見ると、送り先のアカウント2には5[ETH]が確かに届いていますが、送り主のアカウント1に残っているのは5(=10-5)[ETH]よりも少ないです。

アカウント0の残高を見てると、この減った0.00042[ETH]はcoinbase(=アカウント0)に報酬として支払われていることが分かります。
> web3.fromWei(eth.getBalance(eth.accounts[0]),"ether")
1065.00042


「eth.getTransaction」と「eth.getBlock」というコマンドを使ってみると、手数料がどうなったか見えてきます。
というわけで、これらのコマンドを見てみましょう。

いちおう復習しておくと、前回と同じくアカウントをアンロックして「eth.sendTransaction」を実行して出てくるトランザクションIDを引数にして、まず「eth.getTransaction」を見るとこんな感じ。
> eth.getTransaction("0xdb06571f2f55e5adf9fd9949d81bef7385ddfdf73258b7e90de9312e5b3bb17c")
{
blockHash: "0xd401634e5373f73507f93658798a2204180b7018145ccc40c1951a15c8e29d7d",
blockNumber: 210,
from: "0x3a8e6c0304c761b88feeefb5cdefe27ced28d620",
gas: 90000,
gasPrice: 20000000000,
hash: "0xdb06571f2f55e5adf9fd9949d81bef7385ddfdf73258b7e90de9312e5b3bb17c",
input: "0x",
nonce: 0,
r: "0xf18b45285396c04ead1f4e7ed318df6e398f626fb5b0150e8d4f56e80c6ad735",
s: "0x61e82c4d16863c8186884ed09ecdd1974a8f7d8a5ecefd9758991aedd6bab86a",
to: "0xecac305a22ac002107cdac420e24042d430bcb26",
transactionIndex: 0,
v: "0x1b",
value: 5000000000000000000
}


さらに、ここで出てきたblockNumberの210を引数にしてブロックを見るとこんな内容になっています。
> eth.getBlock(210)
{
difficulty: 141844,
extraData: "0xd783010505846765746887676f312e362e32856c696e7578",
gasLimit: 109320930,
gasUsed: 21000,
hash: "0xd401634e5373f73507f93658798a2204180b7018145ccc40c1951a15c8e29d7d",
logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
miner: "0x8ade49123c81461e676fd2f8f2eb31885cdb07e0",
mixHash: "0x77f99c1901f72d3eaad2f5aea85dce821471f8d23a1f1f7e92853cc04d116417",
nonce: "0x3671259b945c8662",
number: 210,
parentHash: "0x0cd16490e3ceba375792cffd22f9ed4b4eecd6712485820f47ed04456de0fc66",
receiptsRoot: "0x895e49c7c281cdf956cd75f726596d7d3e7b68a9f08b462dfb1469ede1d2f812",
sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
size: 651,
stateRoot: "0x369a09f8fbb36aa7a7010f16bb8643cfda6dad78d861696cc5647939f38088a7",
timestamp: 1528018266,
totalDifficulty: 28692719,
transactions: ["0xdb06571f2f55e5adf9fd9949d81bef7385ddfdf73258b7e90de9312e5b3bb17c"],
transactionsRoot: "0x64f4d635547183f729941c809ba518280f8d426e8fdf509d392eb7f5d87f7f7f",
uncles: []
}


ここで注目するのは以下の2つです。
・「eth.getTransaction」の「gasPrice」
・「eth.getBlock」の「gasUsed」

以前お勉強したように、gasPriceというのが1Gasあたりの値段[wei]でした。
上述したコマンドの結果から、今はこれが20000000000[wei]とわかります。
で、使用されたGasが何[Gas]かというのは「gasUsed」で分かり、今は21000[Gas]と読み取れます。
(「eth.getTransaction」の「gas」は支払い可能な最大Gasを表す)

なので結局、手数料として
 gasPrice×gasUsed=20000000000[wei/Gas]×21000[Gas]
 =420000000000000[wei]=0.00042[ETH]
が支払われることになって、先ほどアカウントの残高を確認したときにアカウント1からcoinbase(=アカウント0)に移った0.00042[ETH]と一致します。

アカウント0から他のアカウントに送金したときには支払元のアカウント0は(今の場合)coinbaseなので、「手数料は支払元から引かれる」ことと、「手数料はcoinbaseに支払われる」ことから、自分から引いた手数料を自分が報酬としてもらうことになって、結果として差引0になります。
…というのが前回やったアカウント0からの送金でした。


まとめ

今回は、アカウント間の送金で、Gasと名付けられた手数料が送金元の残高から引かれ、coinbaseアカウントに報酬として支払われる動きを見ました。

送金元がcoinbaseの場合には、自分で払って自分がもらうため、実質手数料がかかってないようになっているのが前回の状況でした。

今回見たのはこんな感じです。

プロフィール

ぺろりん

Author:ぺろりん
まだ始まってもいない暗号資産(仮想通貨)、今後が楽しみです。
基本的な技術をちゃんと知りたいなぁと思いつつ、まったりお勉強していこうかと思います。

twitter:ぺろりん@ぶろっくちぇーん

カテゴリ
最新記事
最新コメント
月別アーカイブ
カレンダー
12 | 2019/01 | 02
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
メールフォーム

名前:
メール:
件名:
本文: