1. ブロックチェーンとKaiaの概要
1.1. ブロックチェーンとは何か?
ブロックチェーンとは、ネットワーク上で発生するすべての取引を記録する、分散型かつ改ざん不可能なデジタル台帳です。チェーンを構成する各ブロックには、一定数の取引が暗号化されて格納されており、新しいブロックが作成されると、それは前のブロックと密接に連結され、改ざんすれば必ず検出される連続したチェーンを形成します。これにより、ネットワーク上の合意なしに情報を容易に改変・削除することができないため、高い透明性とセキュリティが確保され、ブロックチェーンは電子マネーやスマートコントラクトなどのアプリケーションを支える基盤技術となっています。
1.2. カイア・コンセンサス
コンセンサスメカニズム:Kaiaは、ブロックチェーンネットワーク向けに最適化されたPBFT(Practical Byzantine Fault Tolerance)の改良版であるIstanbul BFTアルゴリズムを採用しています。
対象:
- 1秒あたり4,000件のトランザクションを処理できる。
- 取引を即座に完了できる機能。
- ブロックの生成時間:1秒。
- このプロセスには50以上のコンセンサスノードが参加可能です。
ノードの種類:
- CN(コンセンサスノード):CCO(コアセルオペレーター)によって管理され、ブロックの生成を担当する。
- PN(プロキシノード):ネットワークへのインターフェースを提供します。
- EN(エンドポイントノード):エンドユーザーにサービスを提供する。
合意形成プロセス:
トランザクションがCNに送信されると(評議会) PNsから、その VRF(検証可能乱数関数) この関数は、1つをランダムに選択するために使用されます 委員会 4つのCNで構成されています。そのうち1つのCNが引き続きランダムに選択され、 ブロック 他の3人のCNによる観察結果とともに。ある ブロック が作成されると、その中のCNの3分の2が 評議会 ~に署名しなければならない ブロック 合意に達するために。
1.3. KLVM
KLVM、の略語 Kaia仮想マシンは、Kaiaブロックチェーンネットワーク上で動作する分散型仮想マシン環境です。 KLVM これにより、あらかじめ定義された条件に基づいて取引や特定のアクションを自動的に実行するプログラムであるスマートコントラクトの実行が可能になります。スマートコントラクトはSolidityなどのプログラミング言語で記述され、その後コンパイルされて バイトコード それ KLVM 理解し、実行できる。 KLVM はイーサリアムの EVMそのため、現在の開発ツールを完全にサポートしており、 オペコード、およびソースコード。
1.4. スマートコントラクトとは何か?
A スマートコントラクト これは、あらかじめプログラムされた条件に従って、イベントやアクションを自動的に実行、制御、または確認するように設計されたコンピュータプログラムの一種です。これらは以下の環境で動作します カイア, 一度デプロイされると変更できないため、高い透明性とセキュリティが確保されます。 スマートコントラクト プロセスの自動化を支援し、仲介者の必要性を減らし、不正やミスのリスクを最小限に抑えます。汎用性が高く、金融や保険からサプライチェーン管理、不動産に至るまで、さまざまな分野で活用できます。その開発は スマートコントラクト 私たちの交流やデジタル取引のあり方に新たな時代を切り拓き、ユーザーにより高い効率性、透明性、そして自律性をもたらしています。
1.5. トランザクションとトランザクションの署名方法
Kaiaネットワークにおいて、「トランザクション」とは、ユーザーがKLAY(Kaiaのネイティブトークン)やKaiaベースのトークンをあるアドレスから別のアドレスへ転送したり、スマートコントラクトとやり取りしたりするために行う操作のことです。各トランザクションには、送信元アドレス、宛先アドレス、転送金額、ガス(取引手数料)、およびトランザクションがスマートコントラクトとやり取りする場合のオプションデータなどの情報が含まれます。
Kaiaで取引を行う際、MetaMaskなどの暗号資産ウォレットを使用して取引に署名することは、安全性とセキュリティを確保するための重要な手順です。具体的には、このプロセスは以下の通り行われます:
- 取引の作成:ユーザーは、受取アドレスや金額など、取引に必要な情報を入力します。
KLAYまたは送金するトークン、そしてガス代です。例えばMetaMaskでは、ユーザーはガス代を調整することで、取引の処理を速くすることができます。 - 取引の署名:取引情報が入力されると、ウォレットはユーザーの秘密鍵で署名されたデジタル取引を生成します。この取引に署名することで、秘密鍵を明かすことなく、ユーザーが取引の送信元アドレスを使用する権限を持っていることが証明されます。
- トランザクションの送信:署名済みのトランザクションは、KaikasやMetaMaskなどのウォレットを介してKaiaネットワークに送信されます。ネットワークはトランザクションを確認して実行し、要求に応じて資金の送金やスマートコントラクトとのやり取りを行います。
- 取引の確認:最後に、取引はネットワークによって確認され、その情報がブロックチェーンに記録されます。ユーザーは、Etherscanなどのオンラインツールを通じて取引の状況を追跡することができます。
このプロセスは、取引が安全に実行されることを保証するだけでなく、ブロックチェーンの透明性と不変性により、取引の改ざんや不正な変更を防ぐのにも役立ちます。
2. Solidityのファイル構成
2.1. SPDX ライセンス識別子
すべてのSolidity契約では、最初の行にライセンス宣言を記述する必要があります。
// SPDX-License-Identifier: MITSPDXリポジトリのライセンス一覧:https://spdx.org/licenses/
2.2. プラグマ
pragma Solidityのコンパイラバージョンを宣言するために使用されるキーワードです。 pragma これは現在のローカルファイルにのみ適用されるため、必ず以下を追加する必要があります pragma プロジェクトディレクトリ内のすべてのファイルに対して。
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;以下の ^ 記号または比較演算子 <, <=, >, >= コンパイラ宣言と併せて。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20; // コンパイラバージョン 0.8.20 以降を使用// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0; // use compiler version bigger or equal to 0.4.22 and less than 0.9.02.3. 他のソースからのファイルのインポート
ファイル全体をインポートする
インポート "ファイル名"すべてインポートしてエイリアスを割り当てる
インポート * として シンボル名 from "ファイル名";名前のインポート
名前のインポート これは、別のファイルからインポートするオブジェクトの名前を指定することを意味します。このオプションを使うべき理由は、コードがより分かりやすくなるからです。
import {ContractOne as alias, ContractTwo} from "FileName";2.4. コメント
コメントするには、以下をご利用いただけます // そして /* */
// 1行分のコメント。
/*
複数行のコメント。
複数行の
*/また、 NatSpec コメントを投稿 /// または /** **/
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.16 <0.9.0;
/// @author The Project Team
/// @title A simple storage example
contract SimpleStorage {
uint storedData;
/// Store `x`.
/// @param x the new value to store
/// @dev stores the number in the state variable `storedData`
function set(uint x) public {
storedData = x;
}
/// Return the stored value.
/// @dev retrieves the value of the state variable `storedData`
/// @return the stored value
function get() public view returns (uint) {
return storedData;
}
}3. 契約の構成
3.1. 状態変数
状態変数 は、契約の冒頭で、 ローカル変数 で宣言された 関数.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract SimpleStorage {
uint storedData; // State variable
// ...
}3.2. 関数
機能 計算を行ったり、変数の値を変更したりするために宣言された関数です。例として 関数 は以下の通りです。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.1 <0.9.0;
contract SimpleAuction {
function bid() public payable { // Function
// ...
}
}
// Helper function defined outside of a contract
function helper(uint x) pure returns (uint) {
return x * 2;
}3.3. 関数修飾子
関数修飾子 は~の宣言です 関数 その活動を展開するための条件を整えるために 関数.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.22 <0.9.0;
contract Purchase {
address public seller;
modifier onlySeller() { // Modifier
require(
msg.sender == seller,
"Only seller can call this."
);
_;
}
function abort() public view onlySeller { // Modifier usage
// ...
}
}3.4. イベント
イベント スマートコントラクトのアクティビティを記録するための機能です。 イベント スマートコントラクトを用いたインタラクティブなUIの構築によく使用されます。
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.22;
event HighestBidIncreased(address bidder, uint amount); // Event
contract SimpleAuction {
function bid() public payable {
// ...
emit HighestBidIncreased(msg.sender, msg.value); // Triggering event
}
}3.5. エラー
エラー は、操作が失敗した理由をユーザーに伝えるために使用され、 エラー より低い ガス 返送するよりも費用がかかる 文字列.
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.4;
/// Not enough funds for transfer. Requested `requested`,
/// but only `available` available.
error NotEnoughFunds(uint requested, uint available);
contract Token {
mapping(address => uint) balances;
function transfer(address to, uint amount) public {
uint balance = balances[msg.sender];
if (balance < amount)
revert NotEnoughFunds(amount, balance);
balances[msg.sender] -= amount;
balances[to] += amount;
// ...
}
}3.6. 構造体型
構造体 は、~を宣言するために使用されます タイプ の オブジェクト.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract Ballot {
struct Voter { // Struct
uint weight;
bool voted;
address delegate;
uint vote;
}
}3.7. 列挙型
列挙型 は、~を宣言するために使用されます タイプ その価値観は 定数.
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.4.0 <0.9.0;
contract Purchase {
enum State { Created, Locked, Inactive } // Enum
}