1. 블록체인과 카이아 개요
1.1. 블록체인이란 무엇인가?
블록체인은 네트워크상에서 발생하는 모든 거래를 기록하는 분산형이며 변경 불가능한 디지털 원장입니다. 체인의 각 블록은 암호화된 거래 내역을 포함하고 있으며, 새로운 블록이 생성되면 이전 블록과 긴밀하게 연결되어 감지되지 않고는 변경할 수 없는 연속적인 체인을 형성합니다. 이는 네트워크의 합의 없이는 정보를 쉽게 변경하거나 삭제할 수 없으므로 높은 투명성과 보안을 보장하며, 이로 인해 블록체인은 전자화폐 및 스마트 계약과 같은 응용 분야의 기반 기술이 되었습니다.
1.2. 카이아 합의
합의 메커니즘: Kaia는 블록체인 네트워크에 최적화된 PBFT(실용적 비잔틴 결함 허용)의 개선 버전인 이스탄불 BFT 알고리즘을 사용합니다.
대상:
- 초당 4,000건의 거래를 처리할 수 있는 능력.
- 거래를 즉시 완료할 수 있는 기능.
- 블록 생성 시간 1초.
- 이 프로세스에는 50개 이상의 합의 노드가 참여할 수 있습니다.
노드 유형:
- CN(컨센서스 노드): CCO(코어 셀 운영자)가 관리하며, 블록 생성을 담당합니다.
- PN(프록시 노드): 네트워크에 대한 인터페이스를 제공합니다.
- EN (엔드포인트 노드): 최종 사용자에게 서비스를 제공합니다.
합의 도출 과정:
트랜잭션이 CN으로 전송되면 (이사회) PN에서, VRF (검증 가능한 난수 함수) 이 함수는 1을 무작위로 선택하는 데 사용됩니다 위원회 4개의 CN으로 구성됩니다. 1개의 CN은 계속해서 무작위로 선택되어 블록 다른 3명의 CN의 관찰 결과와 함께. 어떤 블록 생성되면, 해당 이사회 ~에 서명해야 할 것입니다 블록 합의를 도출하기 위해.
1.3. KLVM
KLVM의 약자 카이아 가상 머신는 카이아(Kaia) 블록체인 네트워크에서 실행되는 분산형 가상 머신 환경입니다. KLVM 사전 정의된 조건에 따라 거래나 특정 작업을 자동으로 실행하는 프로그램인 스마트 계약의 실행을 가능하게 합니다. 스마트 계약은 솔리디티(Solidity)와 같은 프로그래밍 언어로 작성된 후, 바이트코드 그 KLVM 이해하고 실행할 수 있다. KLVM 이더리움의 EVM따라서 현재의 개발 도구를 완벽하게 지원하며, 오퍼코드, 그리고 소스 코드.
1.4. 스마트 계약이란 무엇인가?
A 스마트 계약 이는 미리 프로그래밍된 조건에 따라 이벤트와 동작을 자동으로 실행, 제어 또는 확인하도록 설계된 컴퓨터 프로그램의 한 종류입니다. 이들은 다음과 같은 환경에서 존재하고 작동합니다. 카이아, 배포 후에는 수정할 수 없기 때문에 높은 투명성과 보안을 보장합니다. 스마트 계약 업무 프로세스를 자동화하고, 중개자의 필요성을 줄이며, 사기나 오류 발생 위험을 최소화하는 데 도움을 줍니다. 이 기술은 활용도가 높아 금융 및 보험부터 공급망 관리, 부동산에 이르기까지 다양한 분야에서 활용될 수 있습니다. 이 기술의 발전은 스마트 계약 이는 우리가 소통하고 디지털 거래를 수행하는 방식에 새로운 시대를 열어, 사용자에게 더 큰 효율성, 투명성 및 자율성을 제공하고 있습니다.
1.5. 트랜잭션 및 트랜잭션 서명 방법
카이아(Kaia) 네트워크에서 “트랜잭션”이란 사용자가 KLAY(카이아 네이티브 토큰) 또는 카이아 기반 토큰을 한 주소에서 다른 주소로 전송하거나, 스마트 계약과 상호작용하기 위해 수행하는 작업을 의미합니다. 각 트랜잭션에는 발신 주소, 수신 주소, 전송 금액, 가스(거래 수수료) 등의 정보가 포함되며, 스마트 계약과 상호작용하는 경우 선택적 데이터도 포함됩니다.
Kaia에서 거래를 진행할 때, MetaMask와 같은 암호화폐 지갑을 사용하여 거래에 서명하는 것은 안전과 보안을 보장하기 위한 중요한 단계입니다. 구체적으로 이 과정은 다음과 같이 진행됩니다:
- 거래 생성: 사용자는 수신 주소, 금액 등 거래에 필요한 정보를 입력합니다.
KLAY또는 전송할 토큰과 가스 비용입니다. 예를 들어, MetaMask에서는 사용자가 가스 비용을 조절하여 거래가 더 빠르게 처리되도록 할 수 있습니다. - 거래 서명: 거래 정보가 입력되면 지갑은 사용자의 개인 키로 서명된 디지털 거래를 생성합니다. 이 거래에 서명함으로써 사용자는 개인 키를 노출하지 않으면서도 해당 거래가 전송된 주소를 사용할 권한이 있음을 증명하게 됩니다.
- 거래 전송: 서명된 거래는 Kaikas나 MetaMask와 같은 지갑을 통해 Kaia 네트워크로 전송됩니다. 네트워크는 해당 거래를 확인하고 처리하여, 요청에 따라 자금을 이체하거나 스마트 계약과 상호작용합니다.
- 거래 확인: 마지막으로, 거래는 네트워크에 의해 확인되며 관련 정보가 블록체인에 기록됩니다. 사용자는 Etherscan과 같은 온라인 도구를 통해 거래 상태를 확인할 수 있습니다.
이 과정은 거래가 안전하게 이루어지도록 보장할 뿐만 아니라, 블록체인의 투명성과 불변성 덕분에 거래의 조작이나 무단 변경을 방지하는 데에도 도움이 됩니다.
2. Solidity 파일 구조
2.1. SPDX 라이선스 식별자
모든 솔리디티 계약서는 첫 줄에 라이선스 선언을 포함해야 합니다.
// 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 "파일명"모두 가져오고 별칭 지정
가져오기 * 다음과 같이 symbolName from "파일명";이름 가져오기
이름 가져오기 이는 다른 파일에서 가져올 객체의 이름을 직접 지정한다는 뜻입니다. 이 옵션을 사용해야 하는 이유는 코드를 더 명확하게 만들 수 있기 때문입니다.
import {ContractOne as alias, ContractTwo} from "FileName";2.4. 의견
댓글을 남기려면 다음을 사용할 수 있습니다 // 그리고 /* */
// 한 줄 주석.
/*
여러 줄 주석.
여러 줄
*/또한 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
}