mapping, address라는 2개의 자료형 등장.
이더리움 계정은 주소를 가지고 있다.
주소는 특정유저가 소유한다. (고유 id임)
mapping
구조화된 데이터를 저장하는 또다른 방법.
정의
key-value 저장소이다.
mapping(address => uint) public accountBalance;
이때 key는 address, 값은 uint이다.
msg.sender
함수를 호출한 사람의 주소를 가리킴.
이를 이용하고 mapping 업데이트하기
mapping( address => uint) favoriteNumber; //key값 address, value값 uint 인 것 mapping function setMyNumber(uint _ myNumber) //_mynumber를 인수로 갖는 함수 설정 favoriteNumber[msg.sender] = _myNumber; // 자신의 주소를 인수로받아 u int값을 출력하는 favoritenumber를 호출하고, 이를 _myNumber에 저장. function whatIsMyNumber() public view returns(uint){ return favoriteNumber[msg.sender];} //what is my number은 자신의 주소에 대한 값을 반환한다. \
갑자기 자기 주소가 왜필요한거야?
Require
특정조건이 참이 아닐 때 실행을 멈춤
function sayHi(string_name) public returns(string){ require(keccak256(_name)==keccak256('Vita')); return "hi"; } // Vita가 아닌 다른 것으로 인수를 주면 에러메시지와 함께 함수 실행이 안될거임
마치 if 문과 비슷한 느낌
상속
코드가 길어질때 잘 정리해서 나누기
방법
contract A is B{} 사용 // A 컨트랙트는 B 컨트랙트에 있는 함수에 모두 접근이 가능해진다.
import
다른 파일에 있는 것을 불러올 때 import 사용
import './someothercontract.sol';
변수 저장 공간으로 memory, storage가 있음.
앞선 궁금증 해결!
storage : 변수가 영구적으로 저장됨
memory : 변수가 임시적으로 저장됨
struct와 array를 처리할 때 쓰인다.
영구적으로 변경할 때 : storage
단순히 데이터를 복사할 때: memory
이부분은 전체적으로 잘 이해가 되지 않는다.
Internal 과 External
Internal : 함수가 정의된 컨트랙트를 상속하는 컨트랙트에서도 접근이 가능하지만, 다른 사용자들은 사용 불가.
external : 컨트랙트 밖에서만 호출, 다른함수에 의해 호출될 수 없다.
contract Sandwich{ uint private sandwichesEaten =0; function eat() internal{ sandwichesEaten++; } }
다른 컨트랙트와 상호작용하기.
컨트랙트의 인터페이스를 먼저 정의해야 한다.
전체적으로 이해 잘 안됨..
인터페이스 활용하기
인터페이스를 정의한 이후에,
컨트랙트에서 인터페이스를 이용해 함수를 호출 할 수도 있다.
다수의 반환값 처리하기.
if문
자바스크립트와 동일
function eat(string sandwich)public { if (keccak256(sandwich)== keccak256("blt")){ eat(); } }