차밍이
[Solidity] 기본 문법 (1) - event, super, mapping 예시 본문
반응형
event
솔리디티는 print가 없음
대신 event를 사용해서 확인할 수 있음
contract testContract {
event info(string name, uint256 money);
function sendMoney() public {
// 블록에 작성하면 언제든 꺼내서 확인할 수 있음
emit info("BakChan", 10000);
}
}
indexced
특정 index의 event 만 가져오기 위해서는 index가 필요함
그럴 땐 indexed
를 사용해 주어야 함
contract testContract{
event numberTracker(uint256 num, string str);
event numberTracker2(uint indexced num, string str);
uint256 num=0;
function PushEvent(string memory _str) public {
emit numberTracker(num, _str);
emit numberTracker2(nu,m, _str);
num ++;
}
}
super
super
는 함수를 override 할 때 사용함
contract Father {
event FatherName(string name);
function who() public virtual {
emit FatherName("ChanBak");
emit FatherAge(16);
...
}
}
contract Mother {
event MotherName(string name);
function who() public virtual {
emit MotherName("EryKim")
}
}
contract Son is Father, Mother {
// 다중 상속의 경우 가장 마지막(최신에) 상속한 Mother Cotract 의 who를 상속함
event sonName(string name);
function who() public override {
super.who();
emit sonName("ColdBak")
}
}
mapping
값을 연결해줌
contract testContract {
mapping(uint256=>uint256) private ageList;
// mapping(Key => Value) 접근제한자 맵핑의 이름
function setAgeList(uint256 _index, uint256 _age) public {
ageList[_index] = _age;
}
function getAge(uint _index) public view return (uint256) {
return ageList[_index];
}
}
Array
array는 순환을 할 수 있음
array 순환은 디도스 공격에 취약할 수 있으므로 mapping을 더 선호한다고 함
array는 50자로 제한이 있음
contract testContract {
uint256[] public ageArray;
uint256[10] public ageFixedSizeArray; // Array 크기가 정해짐
string[] pulibc nameArray = ['kal' ,'bob', 'jay'];
function AgeLength() public view return(uint256) {
return ageArray.length;
}
// index 값이 하나 씩 증가하면서 값이 추가되는 형태
function AgePush(uint _age) public {
ageArray.push(_age);
}
function AgeGet(uint256 _index) public view return(uint256) {
return ageArray[_index];
}
function AgePop() public {
ageArray.pop();
}
function AgeDelte(uint256 _index) public {
delete ageArray[_index];
}
function AgeChange(uint256 _index, uint256 _age) public {
ageArray[_index] = _age;
}
}
struct
contract testContract {
struct Character {
uint256 age;
string name;
string job;
}
// mapping 혹은 array를 사용해서 넣을 수 있음
mapping(uint256=>Character) public CharacterMapping;
Character[] public CharacterArray;
function createCharacter(uint256 _age, string memory _name, string memory _job) pure public return (Character memory) {
return Character(_age, _name, _job);
}
mapping(uint256=>Character) public CharacterMapping;
Character[] public CharacterArray;
function createCharacter(uint256 _age,string memory _name,string memory _job) pure public returns(Character memory) {
return Character(_age,_name,_job);
}
function createChracterMapping(uint256 _key, uint256 _age,string memory _name,string memory _job ) public {
CharacterMapping[_key] = Character(_age,_name,_job);
}
function getChracterMapping(uint256 _key) public view returns(Character memory){
return CharacterMapping[_key];
}
function createChracterArray(uint256 _age,string memory _name,string memory _job ) public {
CharacterArray.push(Character(_age,_name,_job));
}
function getChracterArray(uint256 _index) public view returns(Character memory){
return CharacterArray[_index];
}
}
if else
여타 언어와 동일
if () {
...
}
else if () {
...
}
else {
...
}
for
contract testContract {
event CountryIndexName(uint256 indexed _index, string _name);
string[] private countryList = ["Korea", "Japan", "US", "China"];
function forLoopEvents() public {
for(uint256 i=0; i<countryList.length; i++) {
emit CountryIndexName(i, countryList[i]);
}
}
}
while
contract testContract {
event CountryIndexName(uint256 indexed _index, string _name);
string[] private countryList = ["Korea", "Japan", "US", "China"];
function whileLoopEvents() public {
uint256 i = 0;
while(i<countryList.length) {
emit CountryIndexName(i, countryList[i]);
i++;
}
}
}
do while
첫 번째는 먼저 do it!
그리고 그다음부터 while 조건을 보면서 반복을 돎
contract testContract {
event CountryIndexName(uint256 indexed _index, string _name);
string[] private countryList = ["Korea", "Japan", "US", "China"];
function whileLoopEvents() public {
uint256 i = 0;
do {
emit CountryIndexName(i, countryList[i]);
i++;
}
while(i<countryList.length);
}
}
continue, break
파이썬과 유사
linear search
solidity 내에서 string
값을 파이썬처럼 비교할 수 없음(e.g. "aaa" == "aaa"
)
해쉬화해서 비교해줘야 함
contract lec24{
event CountryIndexName(uint256 indexed _index, string _name);
string[] private countryList = ["South Korea","North Korea","USA","China","Japan"];
function linearSearch(string memory _search) public view returns(uint256,string memory){
for(uint256 i=0; i<countryList.length; i++){
/// solidity 내에서 string 비교 불가
/// 해쉬화를 해줘야함
if(keccak256(bytes(countryList[i])) == keccak256(bytes(_search))){
return (i,countryList[i]);
}
}
return(0,"Nothing");
}
}
Reference
인프런 강의 보면서 공부한 내용을 정리함
반응형
'블록체인 > Solidity' 카테고리의 다른 글
[Solidity] 기본 문법 (2) - Error Handler - require, revert, assert, try-catch (0) | 2022.01.25 |
---|
관련된 글 보기
Comments