エンティティ構文の概要
SPDX License Identifier
// SPDX-License-Identifier: MIT
pragmaキーワード
特定のコンパイラのバージョンをマークします.
pragmaキーワードはすべてのソースファイルにある必要があります.
他のファイルをインポートしてもpragmaは自動的にロードされないため、単独で作成する必要があります.
バージョンルールはnpm構文と同じです.
特定バージョン以上のpragmaを使用する場合、^が追加されます.
pragma solidity 0.8.7;
pragma solidity ^0.8.7; // 0.8.7 버전 이상
import
import 'file' as 'good' from 'file';
import {func1, func2} from 'file'
見積の作成
contract name {
...
}
変数データ型
デフォルトのデータ型にはbool、int、uint、固定バイト配列、addressオブジェクトが含まれます.
記号(+/-)がある場合はuintを使用してintを表し、記号を持たない0以上の値はuintを使用します.
intとuintの後にuint 8のような数値を8の倍数として追加し、変数のサイズをビット単位で指定できます.
🍇 int 16は、−32768〜32767の間の整数を表すことができる.
🍇 uint 16は、0〜65535の間の整数を表すことができる.
使用するビットが小さいほど、ガス代が低くなります.
固定バイト配列は、バイト1〜32を使用し、固定サイズの配列を宣言することができる.
bytes2 isOn = 'on';
isOn[0]; // 'o'
isOn[1]; // 'n'
アドレスオブジェクトはOxで始まり、最大40ビットの16進数からなる文字列を値とします.
アドレスオブジェクトのサイズは20バイトです.
アドレスは、主に勘定科目残高を返す関数balance()関数と、イーサを転送するtransfere()関数で使用されます.
solidity 0.8版以上でaddressは送金できないアドレス値です.
🥩 スマート契約では、特定のアドレス値に送金するために支払う必要があります.
uint160 num = '임의의 값';
address addr = address(num);
address payable send_address = payable(addr); // 송금 가능 주소
contract A {
// 이더를 받을 수 있는 컨트랙트
constructor () payable { }
}
address payable addr = address(A);
// address(A)는 adress payable 형식의 주소값을 반환한다
contract B {
// 이더를 받지 않는 컨트랙트
constructor () { }
}
address addr = address(B);
// address(B)는 adress 형식의 주소값을 반환한다
address payable addr_payable = payable(addr);
// payable()을 사용해 address payable 형식의 주소값을 만들 수 있다.
機能的には売掛金を貼ることもできます.
エンティティ・データの領域は2つあります.
ex.関数内部の状態変数
🍔 storageはブロックチェーンに記録され、その値は永続的に保持されます.
ex.契約グローバル変数
uint memory count = 100;
uint storage age = 32;
配列、文字列、構造体、マッピングなどの参照型データ型.
動的配列と静的配列宣言
uint[10] arrayName1; // 정적
uint[] arrayName2; // 동적
エンティティの動的配列では、pushでデータを追加できます.
マッピングとは異なり、配列は長さ(length)を求めることもできます.
popを使用して最後の要素を削除するか、deleteを使用して必要なインデックスの値を0またはnullに設定できます.
🍦 厳密にはdeleteは削除されないのでlengthのサイズは変わりません.
arrayName2.push("new data 1");
arrayName2.push("new data 2");
uint len = arrayName2.length;
arrayName2.pop();
delete arrayName2[0];
uint[] public userAge;
string name = 'Hi man';
struct Person {
address account;
string name;
uint8 age;
}
// 사용하기
Person kim = Person("0x주소", "kim", 35);
// 키 데이터 타입 => 값 데이터 타입
mapping(uint => address) public userAddress;
userAddress[키] = 값;
ex. blockhash, coinbase, gaslimit, number, timestamp
🍙 msgは、交渉を開始するトランザクションコールまたはメッセージコールに関する情報を有する.
ex. gasleft(), data, sender, gas, value
🍙 txにはトランザクションデータがあります.
ex. gasprice, origin
🍙 これは現在の見積書を参照できます.
(暗黙的に現在の見積アドレスに変換されます)
じょうたいへんすう
contract C {
uint storedData;
uint storedData = 1;
}
ステータス変数アクセスレベル
internal:変数であり、その差分と継承された差分しか使用できません.
public:コンパイラはpublic状態変数にgetter関数を作成します.getter関数を使用して、外部プロファイルまたはクライアントコードから共通変数にアクセスできます.
(もちろん、契約に共通のステータス変数を直接使用することもできます)
private:同じContractメンバーにのみアクセスできます.
ステータス変数は定数で宣言できます。
uint constant age = 5;
関数宣言
function func1 (int _a, uint8 _b, string _name){
~~~
}
// 반환이 있을 때
function func1 (int _a) returns (uint c){
~~~
uint c = 100;
}
function func1 (int _a) returns (uint){
~~~
uint c = 100;
return c;
}
関数のアクセスレベル
public:内部、外部、クライアントコードから呼び出すポーリング値です.
external:外部コーディネータまたはクライアントコードから呼び出すことができ、コーディネータ内部で呼び出すことはできません.
internal:Contractメンバーと継承されたContractからのみ呼び出すことができます.
private:コーディネータのみを呼び出すことができます.
🍉 private関数の名前は最初から慣例です.
function _getName () private view returns (string){
return name;
}
viewで表される関数は状態を変えない読み取り専用関数です。
pureが表す関数は,格納中に変数を読み出したり書き込みしたりしない関数である.
未払金が表示されている関数は利息を受け入れることができます。
関数シェイプの概要
function (<parameter types>) {internal | external | public | private} [pure | constant | view | payable] [(modifiers)] [returns (<return types>)]
コンストラクション関数でリトラクトを作成すると、リトラクトの状態を初期化できます。
contract C {
address public account;
constructor(address _account) init {
account = _account
}
}
self-destruct(contract作成者アドレス);ロケットを消すことができる。
関数変更者、修飾子
🍡 変更者は、関数が実行される前に、要件が満たされているかどうかを確認できます.
// 변경자는 _;로 작성한다.
uint public count;
modifier counting {
count++; // 함수가 실행되기 전 실행된다.
_; // 함수 실행
count--; // 함수가 실행된 후 실행된다
}
function func1() public counting {
if(count < 10){
~~~
}
}
isで契約を引き継ぐことができます。
contract Child is Parent1, Parent2, Parent3 {
~~~
}
revertとrequire、assertを使用してerrhendlingを行うことができます。
revert("에러 발생")
requireとassertは設定した条件が真であることを確認した後、条件が偽である場合、エラーを返します.
requireはif revertのようにゲートウェイデーモンとして機能します.
🍚 ゲートウェイデーモンとは、条件が満たされた場合にのみ実行されるロールです.
assertはrequireと同じ使い方ですが、assertは未使用のガスを呼び出し元に戻し、供給されたガスをすべて消費して状態を元の状態に戻しません.
require(count <= 10, "10회 초과 에러 발생");
// 조건이 참이면 진행, 거짓이면 에러를 리턴한다.
enum
// 다음과 같이 선언할 수 있다.
enum feeling {
good, bad, soso
}
// 변수로 할당
feeling now = feeling.soso;
event
イベントは、結果が発生すると、その会議からdAppクライアントまたは別の会議に送信されます.
イベントキーを使用してイベントを設定し、場合によってはemitキーを使用してイベントを実行します.
イベントが発生すると、トランザクションに記録されます.
contract C {
event Transfer(address from, address to, unit256 value);
function act(address to, address amount){
emit Transfer(msg.sender, to, amount);
}
}
Keccak256
solidityは、Keccak 256を有するハッシュ関数を内蔵している.
入力stringをランダム256ビット16進数にマッピングします.
また、Keccak 256により整数を生成することもできる.
keccak256("hi");
uint rand = uint(keccak256("hi")); // uint로 형변환
せいけいかん
uint coke = 500;
uint16 cake = 6000;
uint16 totalPrice1 = coke + cake; // 에러가 발생
uint16 totalPrice2 = uint16(coke) + cake; // 에러가 발생하지 않는다
エンティティで、インタフェースは使用する関数の形式を宣言します。実際の関数の内容はContractで使用されます。
リファレンスソース:コードステータス
Reference
この問題について(エンティティ構文の概要), 我々は、より多くの情報をここで見つけました https://velog.io/@citron03/솔리디티-문법-요약テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol