-
Notifications
You must be signed in to change notification settings - Fork 1
Solidity Tutorial
kimhunjin edited this page Apr 21, 2018
·
3 revisions
- 계약 계정 외부에서 이더를 송금 받을 수 있게 함.
- 즉, 계약이 A에게 송금을 받으려면 A가 호출하는 함수에 payable 키워드가 있어야함.
function send() payable public {
~~
}
- msg 프로퍼티를 활용해 계약을 호출한 사람이 보낸 메시지 확인
- msg 정보
| 정보 | 타입 | 설명 |
|---|---|---|
| data | byte | 호출데이터 |
| sender | address | 계약을 호출한 이더리움 주소 |
| value | uint | 계약 주소로 보낸 Ether량 |
| gas | uint | gas limit에서 함수를 호출하고 남은 가스 |
- 계약이 다른사람에게 이더를 전송.
- <받는 사람의 주소>.transfer(<송금할 금액>);
function buy() public {
seller.transfer(10);
}
- 함수를 실행할 때 수수료가 듬.
- 수수료를 아끼끼 위해 view나 pure같은 키워드 사용.
string message = "hello solidity";
function setMessage() public {
uint count = 10; // 128614 gas 소모
// uint count = 100; // 1093133 gas 소모
for(uint i=0; i<count; i++) {
message = "hello transaction";
}
}
- Smart Contract로 생성되는 장부 및 기록
- 트랜잭션에 담긴 정보
| 정보 | 설명 |
|---|---|
| transactionHash | 트랜잭션 해시값 |
| transactionIndex | 트랜잭션 인덱스 값 |
| blockHash | 트랜잭션이 추가된 블록 해시값 |
| blockNumber | 트랜잭션이 추가된 블록의 번호 |
| gasUsed | 트랜잭션 호출에 사용된 가스량 |
| cumulativeGasUsed | 누적으로 사용된 가스량 |
| contractAddress | 계약 주소 |
| logs | event로 로깅된 정보 |
- 솔리디티 버전을 나타내는 코드
| 접근 제어자 | 설명 | 특징 |
|---|---|---|
| public | 외부에서 호출 가능. | 접근 제어자를 명시하지 않은 함수는 public으로 선언됨 public으로 상태 변수 선언 시 자동으로 getter 함수 생성 |
| internal | 상속 받은 계약에서만 호출 가능 | 접근 제어자를 명시하지 않은 상태 변수는 internal로 선언됨 |
| private | 해당 계약에서만 호출 가능 | 상속 받은 계약도 호출 불가 |
| external | 인터페이스의 함수 | external로 선언한 상태 변수/함수의 경우 내부이세 호출 불가. |
- 수수료(gas)가 들지 않음.
- 상태를 변경하지 않음. (데이터를 읽을 순 있되 수정 불가 == readOnly)
uint year = 2018;
function test() public view returns (uint) {
return year/100;
}
- 수수료(gas)가 들지 않음.
- 블록체인 네트워크에 기록된 데이터에 일절 접근하지 않음.
- 파라미터로 주어지지 않은 상태 변수는 읽거나 쓸 수 없음.
function test(uint year) public pure returns (uint) {
return year/100;
}
- 다양한 자료형을 묶어서 관리 (C언어의 구조체와 동일)
struct Person {
string name;
uint age;
address wallet;
}
Person p = Person("mos",25,0xfe3...);
p.age += 1;
- <Key, Value> 형태의 자료구조
mapping (address => uint) public balances; // key : address , value : uint
function open(uint _balance) public {
balances[msg.sender] = _balance;
}
- 계약이 수행된 정보는 트랜잭션으로 남음. 이 트랜잭션에 기록하고 싶은 사항이 있다면 이벤트를 사용.
// indexed 키워드가 붙은 데이터는 log 검색 시 사용할 수 있음.
event BuySomethings(
address indexed _buyer,
uint256 _value
);
function buy() payable public {
seller.transfer(msg.value);
BuySomethings(msg.sender, msg.value);
}
require(bool 조건) : 조건을 만족하지 않으면 오류 발생
function half(uint x) {
require(x%2==0); // 짝수일 때만 허용
}
- 커스텀 할 수 있는 제어자
- modifier키워드로부터 안전
modifier onlyOwner(address owner) {
require(msg.sender == owner);
_; // 모든 실행 조건을 만족할 경우
}
function admin(address person) public onlyOwner(person) {
~~
}