メインコンテンツまでスキップ

· 約4分

イーサリアムは 2015 年から稼働してから既に 7 年間以上稼働しています。 全体的な完成度は、vitalik は 2022年9月15日実施された The Merge の後、ようやく 55% になっていると発言しています。 改めて、イーサリアム 2.0 のロードマップを確認してみたいです。

· 約3分

The Merge が実施され、イーサリアムは順調に 2.0 に進んでいます。 コンセンサスアルゴリズムが PoS に切り替え、シャーディングも実装されるため、1.0 よりアーキテクチャが複雑になってきたので、整理してみました。

2022 年 12 月では、シャーディングまだ実装できていません

· 約4分

ブロックチェーンを利用する際にプライベートキーを使いますが、プライベートキーのセキュアな管理方法については、ずっと研究されています。その中の1つは、Threshold Signature Scheme(TSS)という方法があります。

· 約3分

イーサリアム 2.0 の The Merge 実施できて PoS に切り替えたので、テストネット Ropsten / Rinkeby / Kiln がシャットダウンして、今後は、テストネットは Goerli と Sepolia が稼働するためこちらを使いましょうと発表されました。

https://blog.ethereum.org/2022/06/21/testnet-deprecation

本記事では、Goerli テストネットの ETH 入手方法を紹介します。

· 約4分

web3.0 アプリケーションを開発するとブロックチェーンの RPC サーバーが必要になりますが、自分で用意せずに他のサービスを使う場面も多々あります。

infura.io は老舗ですが、後続のサービスとして、alchemy も有力な選択肢になってきています。また、基本のブロックチェーン RPC サーバー以外、他の便利な API が提供されていて、かつ SDK も提供されているので、詳細内容を紹介します。

image0.png

· 約5分

スマートコントラクトで実装する web3.0 アプリケーションは、公開・透明を実現する為ほとんどオープンソースしているので、資産を持っている上に全ての処理を公開していて、非常時攻撃されやすい状況になっています。 よって、web3.0 アプリケーションにとっては、スマートコントラクトのセキュリティは一番重要なことと言っても過言ではありません。

本記事では、初心者向けに、Re-Entrancy 攻撃と対応方法を紹介します。

· 約4分

OpenZepplin の ERC721 スマートコントラクトのソースに、知らなかったキーワード unchecked があったので調べてみました。

https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol#L286-L308

function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");

_beforeTokenTransfer(address(0), to, tokenId, 1);

// Check that tokenId was not minted by `_beforeTokenTransfer` hook
require(!_exists(tokenId), "ERC721: token already minted");

unchecked {
// Will not overflow unless all 2**256 token ids are minted to the same owner.
// Given that tokens are minted one by one, it is impossible in practice that
// this ever happens. Might change if we allow batch minting.
// The ERC fails to describe this case.
_balances[to] += 1;
}

_owners[tokenId] = to;

emit Transfer(address(0), to, tokenId);

_afterTokenTransfer(address(0), to, tokenId, 1);
}