Mac
- brew update
- brew tap ethereum/ethereum
- brew install solidity
solc를 사용하여 솔리디티 코드를 Bytecode로 컴파일할 수 있습니다. EVM은 Bytecode를 실행합니다.
ABI는 스마트 컨트랙트 코드에 대한 설명이 담긴 JSON 형식의 인터페이스입니다. 각 노드는 이 ABI를 사용하여 상호작용합니다.
Remix는 솔리디티 개발을 위한 웹 기반 IDE입니다. Remix는 솔리디티 개발을 위한 컴파일, 배포, 테스트, 디버깅 기능을 내장하고 있습니다.
Remix: remix.ethereum.org
Remix에서 MetaMask 계정을 연결하여 Ropsten 테스트넷와 연결할 수 있습니다. MetaMask 계정을 통해 테스트넷에 작성한 스마트 컨트랙트를 배포할 수 있습니다.
사용자가 직접 컨트랙트 코드를 확인하여 어떤 컨트랙트인지 확인하고 컨트랙트를 수행할 수 있게 하기 위해, 이더스캔에서 컨트랙트의 솔리디티 코드를 등록할 수 있습니다.
이더스캔에 특정 컨트랙트에 대한 솔리디티 코드를 제출하면, 이더스캔은 해당 코드가 실제로 등록된 컨트랙트의 바이트코드 및 ABI와 일치하는지 검증합니다. 일치하는 경우, 이더스캔에 솔리디티 코드가 등록됩니다.
Geth Console에서 이더리움 네트워크에 접속하여, Web3를 사용해 컨트랙트를 배포할 수 있습니다.
스마트 컨트랙트 코드에 대한 라이센스를 코드 최상단에 주석 형식으로 표기합니다.
// SPDX-License-Identifier: MIT
특정 컴파일러의 버전을 표기합니다.
pragma solidity ^0.8.7;
상태 변수는 컨트랙트 스토리지에 영구적으로 저장되는 변수입니다.
{데이터 타입} {변수명} = {초기화할 값}; // 선언 및 초기화
function 함수이름(파라미터형식1 파라미터1, 파라미터형식2 파라미터2, ...) { ... }
특정 함수를 실행하기 전, 요구 조건을 만족하는 지 확인하는 유사 함수이다.
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function destroy() public onlyOwner {
selfdestruct(owner);
}
contract 객체를 상속할 수 있다. 상속을 통해 컨트랙트에 기능을 추가하거나 확장할 수 있다.
contract ChildContract is ParentContract {
// ...
}
function buy(uint amount) public payable {
require(
amount <= msg.value / 2 ether, // 주어진 조건이 참이면 넘어가고, 거짓이면 에러 리턴
"Not enough Ether provided." // 에러 메시지를 지정할 수 있습니다
);
// 송금 진행
}
열거(enum)은 특정 값들로 집합을 지정하고, 집합에 있는 데이터만을 값으로 가집니다.
enum EvalLevel { Bad, Soso, Great }
EvalLevel kimcoding = EvalLevel.Bad // enum형 변수 선언 및 초기화
int16 kimcodingValue = int16(kimcoding); // kimcoding 열거형 값 0을 정수형으로 변환
이벤트는 어떤 결과가 발생했을 때 해당 컨트랙트에서 dApp 클라이언트, 또는 다른 컨트랙트에게 전달합니다.
컨트랙트는 event 키워드를 사용해 이벤트를 설정하고, 경우에 따라 emit 키워드를 사용해 이벤트를 실행합니다. 이벤트가 실행된 경우, 트랜잭션에 기록됩니다.
contract coinTransfer {
// event 이벤트명(파라미터유형1 파라미터1, 파라미터유형2 파라미터2, ...);
event Transfer(address from, address to, uint256 value);
function transfer(address to, address amount) {
//...
// emit 이벤트명(인자1, 인자2 ...)
emit Transfer(msg.sender, to, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
contract helloWorld {
// 함수가 실행되는 동안 greeting 변수를 사용할 수 있습니다.
// 함수가 끝까지 실행되면 greeting 변수의 값을 반환합니다.
function renderHelloWorld () public pure returns (string memory greeting){
greeting = "Hello World!";
}
}