//tips
//crypto
直コンが便利という話を見かけたので調べてみた。
仮想通貨の元になっているブロックチェーンでは、全てのトランザクションがみれるようになっているので、scanサイトのwriteを使用することで、swapサイトを開かなくとも直接ファームから資金を抜くなどの操作ができるもの。この操作を直コン(コントラクトを直接叩く)というよう。
ラグプル(Rugpull)対策や早押し購入に使える技術のよう。
パンケーキスワップでの例が多かったのでそちらを参考にするが、パンケーキswapを使って参加しても、遅くトランザクションが通らず失敗してしまう場合でも、直でルーターコントラクトを介して注文すれば購入の確率がぐんと高まる。
特に、パンケーキだと、スリッページの影響でトランザクションがはじかれることがあるが、直コンは変動幅を無視できるので、どれだけ変動しようと売買できるという利点がある。基本的にコイン争奪戦では直コンが前提で、あとはいくらガス代を積むかのバトルになるとのこと。
botだとさらに早く注文を行えるが、元々は直コンの技術を自動化しているだけなので戦えないことはないよう。
この直コンを行うためにはscan上でプロジェクトのRouter Contractを見つける必要があり、パンケーキの場合は、BSCScan上で、Contract OverviewがPancakeSwap: Routerであるものを探すことになる。
これは検索で見つけられるし、 githubのコードからも見つけることができる。
RouterはSwapの時に使われるものなので、pancake-swap-interface リポジトリでROUTER_ADDRESS などをキーワードに検索することで該当のものを見つけることができるよう。
botの中にはmempoolレベルで介入するものもあり、それは直コンでは対応できないレベルの速さとなる。
このMempoolとは、待機場所で、トランザクションがノードによって検証された後、ビットコインマイナーによってピックアップされてブロックに挿入されるまでMempool内で待機することになる。
Mempoolが最大容量に達すると、ノードは最小のトランザクション料金のしきい値を設定することにより、トランザクションの優先順位付けを開始する。
そのしきい値よりも低い料金のトランザクションはすぐにMempoolから削除され、それ以上の料金の新しいトランザクションのみがMempoolへのアクセスを許可されることになる。
マイナーや第三者がmempoolのトランザクションを監視して、アービトラージなどの利益の発生するトランザクションを先回りすることで利益を横取りでき、そのようなbotも作られているとのこと。
MEV(Miner Extractable Value)と呼ばれる、マイナーがトランザクションを並べ替えたりする機能を通じて得られる利益に関係しており、マイナーは基本的にトランザクションをガス代の高い順に並べるが、このトランザクションの並べ替えへの際に、自身が有利となるようなトランザクションを作成し挿入することもできる。
ボットは自身のトランザクションを有利な条件とするために、mempoolにあるトランザクションのガス代より高い価格でトランザクションを作成することができる(Priority Gas Auction)。
この問題に対して、Flashbotsという組織が対策しているよう。


//smart contract
build/contractsに作成されたjsonファイルを調べてみると、abiとbytecodeというフィールドがあり、
Abi:アプリケーションバイナリインターフェース(ABI)
コントラクトの関数とイベントの構造を記述するもので、コントラクトとのやりとりに使われるクライアント側の抽象化のベースとなる。これではよくわからないのでさらに探していくと、命令体系が似たCPUを搭載する異なるコンピューターにおいて、機械語レベル(バイナリーレベル)で互換性を保証するインターフェースのこと。
ここで機械語に変換するときにお助けシステムの類かとなんとなかくアタリをつけることができた。
もっと噛み砕いた説明として、Cなどの高級言語向けのデータ配置ルールや関数引数と返値のレジスタ渡しルールを定めたものとのこと。これが異なると、オブジェクトリンク時に適切に処理ができないよう。
さらにいうとABIに併せてバイナリデータを流し込んでくるようなインタフェースを設計した場合に、動的リンクするライブラリのABIも揃っていないと、実行時にうまく行かなくなるとのこと。
CPUも種類が増えているため、バイナリレベルでの下位互換を保ってはいても、拡張機能を使うライブラリとリンクするときなどは注意が必要なよう。
Bytecode:
コントラクトをコンパイルした結果を含むもので、コントラクトがクライアントから呼び出された時にイーサリアムネットワークが実行するコード。
実際のコントラクト実行に直接関わってくるのは16進数の値の羅列であるBytecodeであることがわかった。
コントラクトをデプロイする時にはイーサリアムネットワークにトランザクションを送信する。デプロイとはイーサリアムのコントラクトをメインネットに公開し、ユーザーが誰でも使用できる状態にすること。
イーサリアムネットワーク上にデプロイされたコントラクトは、使用者がガスコストを支払うことで使用することができる。
通常のトランザクションでは送信者アドレスと受信者アドレスの両方が含まれているが、デプロイのトランザクションは創造主であるため受信者アドレスを0x0に設定する。
このデプロイのトランザクションにはbytecodeも含んでいる必要があり、トランザクションデータとして送信される。
トランザクションとして送信されるコントラクトはマイニングされてからでなくてはやりとりができず、マイニング後コードが実行され、コントラクトが初期状態に設定される。要するに、他のトランザクションと同様nodeからの検証を受け、マイナーにブロック格納してconfirmしてもらう必要があるということ。
デプロイはコストが高いので事前に、ローカルネットワークおよびテストネットワークで試してから実行するのが基本。
ここからUIのセットアップに入る。
Githubの参考ページからフォルダをクローンする。hoscdevというフォルダがgreeterフォルダと別にできることになる。
git clone https://github.com/RedSquirrelTech/hoscdev.git
その後に下記を行うことでgreeterフォルダにclientをコピー。UI関連コードを全てコピーした。
cp -r hoscdev/chapter-5/greeter/client greeter/client
このUIコードはコンタクトのコンパイル時に生成されたビルドファイルに依存しているので、それらのファイルにアクセスできるように設定する必要がある。依存しているとは、コントラクトの内容をUIに反映するためには、それらの情報を取得できるように設計する必要があるということ。
それらの情報にアクセスできるようにするためにtruffleを用いて成果物を配置する場所を変更する。その設定はtruffle-config.jsファイルでできるので、module.exports={}の中に下記を追加。
contracts_build_directory:"./client/src/contracts",
これでgreeterフォルダで再度コンパイルを実行。
truffle compile
無事に完了。
clientの中身はreactを使って記述されているため、依存関係にあるjsライブラリのうちまだインストールしていないぶんをclient内でインストールする。
cd client
npm install
さらに下記を使ってwebサーバに接続する。
npm run start
ただ、現時点ではコントラクトがネットワークにデプロイされていないため、「このサイトにアクセスできません」の表示が出る。
基本的にこれを実行すると、webの新規ブラウザを開き、メタマスク経由でイーサリアムアカウントへの接続を試みることになる。
早速ローカルのテストブロックチェーンであるGanacheを使用してデプロイしていく。
ganacheを開き、new workspaceをクリック。
greeter-homeとし、greeterフォルダのTruffle-config.jsを加える。これによりワークスペースがセットアップされ、全てのアカウントとサーバ情報を含んだメイン画面が表示される。
これを後でメタマスクにインポートする。
ganacheのportとTruffle-config.jsのものを合わせておくのも忘れない。
development: {
host: "127.0.0.1", // Localhost (default: none)
port: 7545, // Standard Ethereum port (default: none)//8545
network_id: "*", // Any network (default: none)
},
Truffle init でcontactsフォルダにmigrations.solというコンストラクトが自動的に生成されたが、これはmigrationフォルダのどのmigrationを実行しているかの管理を行うもの。複数回行われるtruffle migrationの過程で既に実行しているものをスキップできる。
最初のデプロイの場合はmigrationsフォルダの全てのデプロイスクリプトを実行する。一つ目のスクリプトはmigration.solをデプロイするもので、二つ目以降がGreeterなどの実際に作成したコントラクトとなる。
早速デプロイ。
truffle migrate --network development
デプロイは成功したのでUIを表示させてみる。
npm run start
#FailureMessage Object: 0x7ffeefbfc900npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! client@0.1.0 start: `react-scripts start`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the client@0.1.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
上記のエラーが出てしまった。
https://qiita.com/wafuwafu13/items/2fe43414aa6e1899f494
https://ja.stackoverflow.com/questions/54637/npm-start%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
https://stackoverflow.com/questions/42308879/how-to-solve-npm-error-npm-err-code-elifecycle
調べてみるとこれもバージョン絡みの問題のよう。
Updateのため
npm install -g npm
を実行してみると下記のエラーとなる。
npm WARN npm npm does not support Node.js v12.0.0
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm You can find the latest version at https://nodejs.org/
npm ERR! code EBADENGINE
npm ERR! engine Unsupported engine
npm ERR! engine Not compatible with your version of node/npm: npm@8.1.3
npm ERR! notsup Not compatible with your version of node/npm: npm@8.1.3
npm ERR! notsup Required: {"node":"^12.13.0 || ^14.15.0 || >=16"}
npm ERR! notsup Actual: {"npm":"8.1.3","node":"v12.0.0"}
ただ、ganacheを使わずにデプロイする方法もあるので今回はinfuraを使用してのデプロイ方法を見ていく。
Infuraは以前オリジナル通貨PIPOを作成した時にも使ったwebサイトでマネージドイーサリアムノードのサービスプロバイダと言われるもの。これを使うことでローカルクライアントの同期にかかる時間が不要になる。
//基本情報理解
H.264/MPEG-4 AVCは動画の圧縮符号化方式。ISO/IECのビデオとオーディオの符号化に関するワーキンググループMPEG(moving picture experts group)が、MPEG-4を拡張・改良し圧縮効率を高めたもの。ITU-Tという別団体ではH.264などのビデオコーデックを策定していたがISO/IECと共同提案したためこのような名称となった。
E-R(entity-relationship)モデルは、データ主導型モデルの一つで、モデル化の対象を実体と実体との関係に注目した図で表し、データベースの構造を表現するのに利用される。
SQLにて、親データの削除と一緒に子データの同じ値をもつ方カラムのデータ削除をする場合にはCASCADEを使用する。