Solidity란 이더리움 스마트 컨트랙트를 구현하기 위해서 만들어진 이더리움 전용 언어.
- 
EVMEthereum Virtual Machine에서 구동. 
- 
코인이 전달되는 코드이기 때문에 베스트 프랙티스를 참고해서 작성하길 권유. 
- 
지원 개발 환경(IDE) - 
Remix 
- 
… 
 
- 
Hello World
// SPDX-License-Identifier: MIT // (1)
pragma solidity ^0.8.12; // (2)
contract HelloWorld { // (3)
    function helloWorld() external pure returns (string memory) { (4)
        return "Hello, World!";
    }
}- 
저작권 
- 
컴파일러 버전 설정 
- 
컨트랙트명을 HelloWorld로 지정
- 
`function <함수명>() ` 
자료형
value types
- 
uint: 부호 없는 정수형. 기본적으로 256비트 자료형(uint256).uint32,uint64선언 가능.
- 
int: 정수형
- 
bool: 논리 자료형
- 
string: UTF-8 인코딩 문자열
- 
bytes: 바이트
- 
address: 20 바이트 이더리움 주소 값
reference types
- 
storage
- 
memory
- 
구조체 struct Zombie { string name; uint dna; }
- 
배열 uint[4] fixedArray; (1) uint[] dynamicArray; (2) new uint[](5); (3) uint[5] public publicArray; (4)- 
크기 고정 
- 
계속 커질 수 있는 배열 
- 
new키워드 활용한 선언
- 
public키워드 선언을 통해 다른 컨트랙트에서 조회 가능 (just 조회)
 
- 
맵핑
mapping(_KeyType => _ValueType) public <name>;- 
_KeyType: 매핑, 동적 크기 배열, 컨트랙트, 열거형, 구조체를 제외한 모든 유형
- 
_ValueType: 매핑 타입을 포함한 모든 유형
enum
함수
contract ZombieFactory {
    function createZombie(string _name, uint _dna) { (1)
    }
    function processDna(uint _dna) private { (2)
    }
    function convertDna(uint _dna) public returns (string) { (3)
        return "converted";
    }
    function rollbackDna(uint _dna) private pure returns (string) { (4)
        require(_dna > 0, "message"); (5)
    }
}- 
function키워드를 통해 선언 가능.
- 
public,private접근자를 통해 외부 컨트랙트의 호출 제한 설정 가능. (default:public)
- 
returns (<type>)키워드를 통해 반환 타입 지정 가능
- 
함수 제어자 설정 가능 - 
view: 컨트랙트의 변수를 읽기만 할 때.
- 
pure: 컨트렉트의 변수를 읽지도, 쓰지도 않을 때 (순수 함수를 의미하는 것 같음)
 
- 
- 
require(<conditional>, <message>)를 통해 사전 검증 가능
function multiReturn() public pure returns (
    uint a;
    uint b;
    uint c;
) {
    return (10, 20, 30); (1)
}
uint number;
(, , number) = multipleReturn(); (2)- 
한번에 여러 값 반환 가능 
- 
세번째 값만 사용하고자 할 경우 
난수 생성
- 
keccak256해시 함수 제공- 
SHA-3 사용 
- 
충돌이 희박함 
 
- 
keccak256("aaa")