1. 区块链与凯亚概述
1.1. 什么是区块链?
区块链是一种分布式且不可篡改的数字账本,用于记录网络上发生的全部交易。链中每个区块包含若干加密交易,当新区块生成时,它与前一个区块紧密相连,形成一条连续的链条——未经检测无法进行修改。这种特性确保了高度的透明度和安全性,因为未经网络共识,信息无法轻易被篡改或删除,使区块链成为电子货币和智能合约等应用的基础技术。
1.2. 凯亚共识
共识机制:Kaia采用伊斯坦布尔BFT算法,这是PBFT(实用拜占庭容错)的改进版本,专为区块链网络优化设计。
目标:
- 每秒可处理4,000笔交易的能力。
- 即时完成交易的能力。
- 区块生成时间 1 秒。
- 支持超过50个共识节点参与该流程。
节点类型:
- CN(共识节点):由CCO(核心单元操作员)管理,负责创建区块。
- 代理节点(PN):提供与网络的接口。
- EN(终端节点):为最终用户提供服务。
共识过程:
当交易被发送到区块链网络时(理事会) 来自PNs的, 可验证随机函数(VRF) 该函数用于随机选取1 委员会 由4个CN组成。将持续随机选取1个CN来创建 区块 以及另外3名临床护士的观察结果。当 区块 被创建时,该组中2/3的CNs 理事会 必须签署 区块 达成共识。
1.3. KLVM
KLVM,简称 凯亚虚拟机, 是一个运行在凯亚区块链网络上的去中心化虚拟机环境。 KLVM 支持智能合约的执行,这些程序会根据预先编码的条件自动执行交易或特定操作。智能合约使用Solidity等编程语言编写,随后编译为 字节码 那个 KLVM 能够理解并执行。 KLVM 兼容以太坊的 EVM因此它完全支持当前的开发工具, 操作码以及源代码。
1.4. 什么是智能合约?
A 智能合约 是一种计算机程序,旨在根据预先编程的条件自动执行、控制或确认事件和操作。它们存在并运行于 Kaia确保高度透明性和安全性,因为它们一旦部署就无法修改。 智能合约 帮助实现流程自动化,减少对中介机构的需求,并最大限度降低欺诈或错误的风险。它们用途广泛,可应用于金融、保险、供应链管理及房地产等多个领域。其发展 智能合约 正在开启我们互动和进行数字交易的新时代,为用户带来更高的效率、透明度和自主性。
1.5. 交易及其签署方式
在Kaia网络中,"交易"(transaction)指用户执行的操作,包括将KLAY(Kaia原生代币)或基于Kaia的代币从一个地址转移至另一个地址,或与智能合约进行交互。每笔交易包含以下信息:来源地址、目标地址、转账金额、gas(交易手续费),以及若交易涉及智能合约则包含可选数据。
在Kaia平台进行交易时,使用MetaMask等加密钱包签署交易是确保安全性的关键步骤。具体流程如下:
- 创建交易:用户输入交易所需信息,例如收款地址、金额等。
KLAY或代币进行转移,以及Gas费用。例如在MetaMask中,用户可调整Gas费用水平以加快交易处理速度。 - 交易签名:输入交易信息后,钱包会生成一笔由用户私钥签名的数字交易。对该交易进行签名,既能证明用户有权使用交易发送地址,又无需泄露其私钥。
- 发送交易:签名的交易随后通过钱包(如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. 从其他来源导入文件
导入整个文件
import "文件名"导入全部并分配别名
import * 作为 符号名称 来自 "文件名";名称导入
名称导入 这意味着你将指定从另一个文件导入的对象名称。你应该使用此选项的原因是它能使你的代码更清晰。
import {ContractOne as alias, ContractTwo} from "FileName";2.4. 评论
要发表评论,您可以使用 // 以及 /* */
// 注释一行。
/*
注释用于
多行注释
*/还有 国家规范 评论 /// 或 /** **/
// 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. 事件
活动 是用于记录智能合约活动的功能。 活动 常用于构建基于智能合约的交互式用户界面。
// 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
}