//⭐ 스마트 계약의 라이센스를 지정하는 주석, MIT 라이센스를 사용하고 있음.
// SPDX-License-Identifier: MIT
//⭐ 컴파일러 버전을 지정, ^ 기호는 지정된 버정 이상의 컴파일러를 사용할 수 있음을 뜻함.
pragma solidity ^0.8.13;
//⭐ 외부 파일의 코드를 가져올 수 있음, export 하지않아도 된다.
import "./Counter.sol";
//⭐ contract : 스마트 컨트렉트를 정의하는 부분
contract Counter2 {
uint256 value;
//⭐ Counter 컨트랙트의 구조를 가지고있는 counter 상태변수
Counter counter;
constructor() {
// Counter 인스턴스를 하나 생성
counter = new Counter();
}
function setValue(uint256 _value) public {
value = _value;
counter.setValue(_value);
}
function getValue() public view returns(uint256){
return value;
}
function getValue2() public view returns(uint256){
return counter.getValue();
}
}
contract Counter {
// 기본 true
// [타입] [변수명]
// 참과 거짓의 값을 저장하는 변수
bool _bool;
// uint 부호가 없는 정수형 -가 안붙는 정수, 음수가 될 수 없다.❌
// 정수형 타입 uint는 uint 자료형 뒤에 숫자를 붙이면 메모리 영역의 크기를 지정할 수 있다.
uint256 _uint;
// 부호가 있는 정수형, -가 붙을수 있다, 음수가 될 수 있다.
// 정수형 타입 int는 int자료형 뒤에 숫자를 붙이면 메모리 영역 크기 지정.
int256 _int;
// enum 타입 -> 개발자가 가독성을 높이기 위해서 사용하는 자료형
// 상수를 사용하면서 가독성을 높이기 위해서 사용
enum Status {
Pending, // 0
Accepted, // 1
Rejected, // 2
}
// ⭐ status 를 선언하는데 Status 타입으로 선언한다는 뜻.
Status public status;
// status.Pending === 0
// status.Accepted === 1
// status.Rejected === 2
//⭐ require(status == Status.Pending) => require(status == Status(0)) 이렇게 쓸 수 있음.
// enum의 상태를 조회
function get() public view returns (Status){
return status
}
// enum의 상태를 변경
function set(Status _status) public {
status = _status;
}
//string 문자열 자료형
string Str = "hello sol";
// address 주소형
// 우리가 지갑을 만들때 봤던 주소
// 주소의 크기는 20바이트 크기의 자료형 컨트랙트 주소를 저장할 때 사용하는 변수 / 0x 의 뒤 숫자가 40자리
// 16진수 4bit * 40자리 = 160bit = 20btye
address sender = 0x0000000000000000000000000000000000000000;
// sender.balance : 해당 주소의 이더 잔액을 조회할 수 있다.
// sender.transfer(10 ether); -> 전송 실패시 예외를 발생시켜 오류 처리가 필요
// sender.send(5 ether); - > 성공, 실패에 대한 bool 값을 반환
// 배열의 타입
// 배열의 크기가 실행중에 변경 가능
string[] strArr = ["1","2","3"];
// 배열의 크기 지정
// 배열의 크기가 선언시 지정이 된다.
string[2] strArr2 = ["1","2"];
// 구조체 struct
struct Struct {
string name;
uint number;
}
// 구조를 정의
// 매핑 key-value 키와 값을 저장할 때 사용하는 데이터 타입
mapping (address => uint256) tokens;
tokens {
address : 10000
}
// address가 key
// uint256가 value
mapping(string =>mapping(address => uint256)) token2;
// string이 key
// mapping mapping(address =>uint256)이 value
// address가 key
// uint256 value
tokens2 {
string :{
address : 10000
address2 : 10000
}
string2 :{
address : 10000
address2 : 10000
}
}
// 글로벌 변수
// address payable 선언식(타입)
// 매개변수 이름 : _to
function a(address payable _to) public payable {
// payable : 이더리움을 보낼건지, 결제를 할건지 결제 처리를 한다는 처리문(이더 상호작용 가능)
// 이더리움 블록체인 정보
// block
block.coinbase; // 현재 블록을 채굴한 account의 주소
block.difficulty; // 블록의 난이도
block.gaslimit; // 현재 블록이 사용 가능한 최대 gas 값
block.number; // 블록의 높이
block.timestamp ; // 블록 생성 시간
// msg 컨트렉트에서 message call 했을 때 컨트렉트에 전달된 메시지 정보를 가지고 있는 객체
msg.sender; // 컨트랙트를 호출한 account의 주소
msg.value; // 메시지로 전달받은 이더리움의 단위가 wei단위로 담겨있음
msg.data; // 컨트랙트 call로 실행할 때 보낸 데이터의 내용
msg.sig; // 전달받은 데이터의 첫 4바이트 === 어떤 메서드를 실행시켰는지 확인
// address
_to.balance;
uint amount = 10**18;
_to.transfer(amount);
_to.send(amount);
}
// 함수의 구조
// name : 함수명
// uint a : 타입과 매개변수 이름
// public : 함수의 접근자
// 접근자의 타입
// 1. public : 외부에서 호출이 가능 외부 컨트렉트나 계정에서 호출 가능 EOA나 CA에서 호출이 가능하다는 얘기
// 2. private : 현재 컨트렉트에서만 호출이 가능.
// 3. Internal : 내부 함수는 컨트렉트에서 접근을 할 수 있고, 외부 x 다른 컨트렉트에서 상속 받아서는 호출이 가능하다.
// 4. External : public 같은 타입
// 접근 지정자
// view부분 : 상태변수 변경 선언 솔리디티 언어의 특징
// view : 상태변수 읽기전용 , 변경은 불가능하다.
// pure : 상태변수 읽기도 안되고, 변경도 안된다. -> 말그대로 순수하게 전달받은 매개변수로만 함수의 동작을 하고 싶은 경우에만 사용.
// payable : 결제를 처리할 수 있다는 선언, 이더를 전송하는데 선언을 하지 않으면 거부된다(reject)
function name(uint a) public view returns (uint){
}
// 조건문 작성
// require : 주어진 조건을 검사해서 만족이 되면 구문 통과, 안되면 reject 발생 이전상태로 되돌림
// gas 반환 o
// if 문 같이 조건처리를 할 때 사용
require(조건문);
조건문이 잘 통과되면 동작해야할 구문
⭐
// 컨트랙트 배포자가
// 계약 파기 하고 싶을 때 : selfdestruct()
// sender 배포자의 주소를 받을 변수 이더를 전송 받을 수 있다. payable가 있기 때문에
address payable sender;
require(msg.sender == sender);
selfdesturct(sender);
// selfdestruct(지갑 주소): 현재 계약을 파기하고, 전달받은 매개변수 주소로 CA의 잔액을 전송한다.
// selfdestruct(CA 주소) : 계약을 파기하고 전달된 CA에 잔액을 전송할 수 있다.
⭐
}