일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 이더리움
- Klaytn API Service
- 접근제어자
- 웹
- 클레이튼
- SCN
- ethereum
- 앵커링
- Klaytn
- 제어자
- Solidity
- vue.js
- geth구현
- frontend
- kas
- 프론트엔드
- Web
- blockchain
- API
- nodejs
- Geth
- 블록체인 구조와 이론
- javascript
- 블록체인
- 서비스체인
- 프레임워크
- vue
- web3.js
- web3
- 솔리디티
Archives
- Today
- Total
BloCCat
solidity 기초 (3) 본문
1. 매핑
기본적으로 키-값(key-value) 저장소로 데이터를 저장하고 검색하는 데 이용
// 금융 앱용으로, 유저의 계좌 잔액을 보유하는 uint를 저장한다:
mapping (address => uint) public accountBalance;
// 혹은 userID로 유저 이름을 저장/검색하는 데 매핑을 쓸 수도 있다
mapping (uint => string) userIdToName;
2. msg.sender
: 함수를 호출한 eoa(계정주소) 혹은 ca(컨트랙트 주소)
mapping (address => uint) favoriteNumber;
function setMyNumber(uint _myNumber) public {
// `msg.sender`에 대해 `_myNumber`가 저장되도록 `favoriteNumber` 매핑을 업데이트한다 `
favoriteNumber[msg.sender] = _myNumber;
// ^ 데이터를 저장하는 구문은 배열로 데이터를 저장할 떄와 동일하다
}
function whatIsMyNumber() public view returns (uint) {
// sender의 주소에 저장된 값을 불러온다
// sender가 `setMyNumber`을 아직 호출하지 않았다면 반환값은 `0`이 될 것이다
return favoriteNumber[msg.sender];
}
3. require
require(조건) 형식으로 사용하고 '조건'이 참이 아니라면 함수는 에러메시지를 발생하고
실행을 멈춤
function sayHiToVitalik(string _name) public returns (string) {
// _name이 "Vitalik"인지 비교한다. 참이 아닐 경우 에러 메시지를 발생하고 함수를 벗어난다
// (참고: 솔리디티는 고유의 스트링 비교 기능을 가지고 있지 않기 때문에
// 스트링의 keccak256 해시값을 비교하여 스트링 값이 같은지 판단한다)
require(keccak256(_name) == keccak256("Vitalik"));
// 참이면 함수 실행을 진행한다:
return "Hi!";
}
4. 상속
contract Doge {
function catchphrase() public returns (string) {
return "So Wow CryptoDoge";
}
}
contract BabyDoge is Doge {
function anotherCatchphrase() public returns (string) {
return "Such Moon BabyDoge";
}
}
//다른 파일로 생성하여 상속
import "./zombiefactory.sol";
contract ZombieFeeding is ZombieFactory {
}
BabyDoge 컨트랙트는 Doge 컨트랙트의 함수를 사용할 수 있다.
5. storage, memory
- storarge : 블록체인 상에 영구적으로 저장되는 변수
- memory : 블록체인 상에 임시적으로 저장되는 변수
보통 함수 외부에 선언된 변수(상태 변수)는 storage로, 함수 내부에 선언된 변수는 memory로 선언
contract SandwichFactory {
struct Sandwich {
string name;
string status;
}
Sandwich[] sandwiches;
function eatSandwich(uint _index) public {
// Sandwich mySandwich = sandwiches[_index];
// ^ 꽤 간단해 보이나, 솔리디티는 여기서
// `storage`나 `memory`를 명시적으로 선언해야 한다는 경고 메시지를 발생한다.
// 그러므로 `storage` 키워드를 활용하여 다음과 같이 선언해야 한다:
Sandwich storage mySandwich = sandwiches[_index];
// ...이 경우, `mySandwich`는 저장된 `sandwiches[_index]`를 가리키는 포인터이다.
// 그리고
mySandwich.status = "Eaten!";
// ...이 코드는 블록체인 상에서 `sandwiches[_index]`을 영구적으로 변경한다.
// 단순히 복사를 하고자 한다면 `memory`를 이용하면 된다:
Sandwich memory anotherSandwich = sandwiches[_index + 1];
// ...이 경우, `anotherSandwich`는 단순히 메모리에 데이터를 복사하는 것이 된다.
// 그리고
anotherSandwich.status = "Eaten!";
// ...이 코드는 임시 변수인 `anotherSandwich`를 변경하는 것으로
// `sandwiches[_index + 1]`에는 아무런 영향을 끼치지 않는다. 그러나 다음과 같이 코드를 작성할 수 있다:
sandwiches[_index + 1] = anotherSandwich;
// ...이는 임시 변경한 내용을 블록체인 저장소에 저장하고자 하는 경우이다.
}
}
6. Internal & External
- Internal : 함수가 정의된 컨트랙트를 상속하는 컨트랙트에서 접근이 가능
- external : 함수가 바깥에서만 호출될 수 있고 컨트랙트 내의 다른 함수에 의해 호출될 수 없음
contract Sandwich {
uint private sandwichesEaten = 0;
function eat() internal {
sandwichesEaten++;
}
}
contract BLT is Sandwich {
uint private baconSandwichesEaten = 0;
function eatWithBacon() public returns (string) {
baconSandwichesEaten++;
// eat 함수가 internal로 선언되었기 때문에 여기서 호출이 가능하다
eat();
}
}
7. 인터페이스
- 컨트랙트와 상호작용하고자 하는 함수만을 선언. (다른 함수나 상태 변수를 언급하지 않음)
컴파일러도 인터페이스는 컨트랙트 뼈대처럼 인터페이스를 인식함
contract NumberInterface {
function getNum(address _myAddress) public view returns (uint);
}
contract MyContract {
address NumberInterfaceAddress = 0xab38...
// ^ 이더리움상의 FavoriteNumber 컨트랙트 주소이다
NumberInterface numberContract = NumberInterface(NumberInterfaceAddress)
// 이제 `numberContract`는 다른 컨트랙트를 가리키고 있다.
function someFunction() public {
// 이제 `numberContract`가 가리키고 있는 컨트랙트에서 `getNum` 함수를 호출할 수 있다:
uint num = numberContract.getNum(msg.sender);
// ...그리고 여기서 `num`으로 무언가를 할 수 있다
}
}
8. 다수 반환값 처리
solidity는 다른 언어와 다르게 return값을 여러개 반환 가능
function multipleReturns() internal returns(uint a, uint b, uint c) {
return (1, 2, 3);
}
function processMultipleReturns() external {
uint a;
uint b;
uint c;
// 다음과 같이 다수 값을 할당한다:
(a, b, c) = multipleReturns();
}
// 혹은 단 하나의 값에만 관심이 있을 경우:
function getLastReturnValue() external {
uint c;
// 다른 필드는 빈칸으로 놓기만 하면 된다:
(,,c) = multipleReturns();
}
'Study > Solidity' 카테고리의 다른 글
효율적인 Contract 작성법 (1) (0) | 2021.08.29 |
---|---|
Ownable.sol (0) | 2021.08.29 |
solidity 기초(2) (0) | 2021.08.29 |
solidity 기초 (1) (0) | 2021.08.29 |
Soilidity란? (0) | 2021.08.29 |