찰리의 이야기

솔리디티(Solidity) with Klaytn IDE #1 본문

찰리: 블록체인

솔리디티(Solidity) with Klaytn IDE #1

쨜리 2021. 7. 10. 13:45
반응형

솔리디티(Solidity) with Klaytn IDE

 

솔리디티(Solidity) 란 스마트 컨트랙트(smart contract)작성과 구현에 사용되는

계약 지향 프로그래밍 언어다.

이더리움에서 스마트 계약에 사용될 수 있도록 개발되었는데

현재는 다른 여러 블록체인 플랫폼에서 동작하고 있다.

 

솔리디티 언어 자체는 C++, Phython, Javascript 의 영향을 받은 고수준 언어다.

상속, 라이브러리, 유저 정의 타입을 지원하고 반복문과 제어문도 사용할 수 있다.

 

Klaytn IDE에서 몇가지 예시를 사용해보면서 맛보려고 한다.

http://ide.klaytn.com/

 

pragma solidity >=0.4.24 <=0.5.6;

contract Practice {
	
}

이 모습이 가장 기본적인 스마트 컨트랙트의 모습이다.

스마트 컨트랙트는 이렇게 contract 라고 시작한다.

이렇게 배포하면 Practice라는 스마트 컨트랙트가 배포되는 것이다.

이제 하나씩 꾸며보자.

 

pragma solidity >=0.4.24 <=0.5.6;

contract Practice {
	uint256 private totalSupply = 10;
	string public name = "KlayLion";
}

totalSupply라는 정수 타입의 변수와

name이라는 문자열 타입의 변수를 선언해주면서 값을 입력했다.

변수 타입 옆의 private과 public은 스마트 컨트랙트에서 값을 볼 수 있는지 없는지 나타낸다.

public이면 확인할 수 있고, private는 숨겨지게 된다.

이렇게 배포하면 우리는 스마트 컨트랙트에서 숫자와 문자열을 저장해둔 것이다.

 

이제 함수도 담아보자.

 

pragma solidity >=0.4.24 <=0.5.6;

contract Practice {
	uint256 private totalSupply = 10;
	string public name = "KlayLion";
    
    function getTotalSupply() public view return (uint256) {
    	return totalSupply + 1000000;
    }
    
}

함수도 public으로 보여질 수 있게 할 수 있고,

view는 해당 함수가 값을 보기만 하는 것을 의미한다.

return (uint256) 은 정수를 리턴한다는 것을 의미한다.

10이 입력된 totalSupply에다가 100000을 더한 값을 내보내도록 하는 함수다.

 

Klaytn IDE 상에서 이렇게 나타난다.

 

이제 보기만 하는 함수가 아니라 값을 바꾸는 함수를 만들어보자.

 

pragma solidity >=0.4.24 <=0.5.6;

contract Practice {
	uint256 private totalSupply = 10;
	string public name = "KlayLion";
    
    function getTotalSupply() public view return (uint256) {
    	return totalSupply + 1000000;
    }
    
    function setTotalSupply(uint256 newSupply) public {
    	totalSupply = newSupply;
    }
    
}

setTotalSupply 함수를 추가했다.

이 함수는 정수를 입력받을 것이기 때문에 파라미터에 타입과 변수명을 입력해줬다.

또 보여야하기 때문에 public 이라고 해줬지만 값을 수정하기 때문에 view가 없고,

또 값을 변경하기 때문에 return도 설정해줄 필요가 없다.

 

99라는 값을 입력해서 totalSupply의 값을 바꿨다.

 

이때 중요한 것은 단순히 값을 불러오고 읽어오는 경우는 수수료가 들지 않지만,

값을 바꾸거나 새로 덮어쓰는 경우는 트랜잭션을 만들게 되면서 수수료가 든다!

 

 

이제 주소라는 개념을 넣어보자

 

pragma solidity >=0.4.24 <=0.5.6;

contract Practice {
	uint256 private totalSupply = 10;
	string public name = "KlayLion";
    
    address public owner; // contract deployer
    
    constructor() public {
    	owner = msg.sender;
    }
    
    function getTotalSupply() public view return (uint256) {
    	return totalSupply + 1000000;
    }
    
    function setTotalSupply(uint256 newSupply) public {
    	totalSupply = newSupply;
    }
    
}

블록체인은 주소(address)를 가진다.

스마트 컨트랙트에도 생성자(constructor)가 있어서,

생성되자마자 어떤 작동을 만들 수 있다.

여기서 msg.sender 란 해당 트랜잭션을 만든 사람, 보낸 사람을 지칭하는 것이다.

그것을 address인 owner에 할당한 것이다.

 



위 그림처럼 주소가 입력된 것을 알 수 있다.

 

이제 조건을 활용한 스마트 컨트랙트를 확인해보자.

 

pragma solidity >=0.4.24 <=0.5.6;

contract Practice {
	uint256 private totalSupply = 10;
	string public name = "KlayLion";
    
    address public owner; // contract deployer
    
    constructor() public {
    	owner = msg.sender;
    }
    
    function getTotalSupply() public view return (uint256) {
    	return totalSupply + 1000000;
    }
    
    function setTotalSupply(uint256 newSupply) public {
    	require(owner == msg.sender, "Not owner");
        totalSupply = newSupply;
    }
    
}

setTotalSupply 함수에 조건이 추가되었다.

require의 조건에 해당하는 경우에만

다음줄이 동작하도록 조건을 추가한 것이다.

 

만약 다른 Account에서 해당 함수를 실행했을 때는 동작하지 않고

수수료만 까먹게 될 것이다.

 

 

이제 매핑 개념을 사용해보자.

javascript 에서 객체의 key와 value를 가지고 참조하는 방식이다.숫자를 가지고 글자를 가져올 수 있게 함수를 만들어보려고 한다.

 

pragma solidity >=0.4.24 <=0.5.6;

contract Practice {
	uint256 private totalSupply = 10;
	string public name = "KlayLion";
    
    address public owner; // contract deployer
    
    constructor() public {
    	owner = msg.sender;
    }
    
    function getTotalSupply() public view return (uint256) {
    	return totalSupply + 1000000;
    }
    
    function setTotalSupply(uint256 newSupply) public {
    	require(owner == msg.sender, "Not owner");
        totalSupply = newSupply;
    }
    
    function setTokenUri(uint256 id, string memory uri) public {
    	tokenURIs[id] = uri;
    }
    
}

setTokenUri 라는 함수를 만들었다.

이번엔 인자를 2개 입력할텐데 정수타입의 id 변수와 문자열 타입의 uri 변수를 입력받는다.

여기서 memory는 복잡한 문자열을 처리할 때 사용한다고 이해하면 된다.

여기서 tokenURIs 가 어떤 변수 선언 없이 생겨난 것 같다는 혼란이 있었는데,

일단 함수를 선언하면서 값을 입력하는 과정에서 변수로 선언되는 것 같다.(아닐 수도..)

위 이미지에서 setTokenUri로 숫자 10과 문자열 "HelloKlay"를 입력한 다음,

tokenURIs에 10으로 호출하니 HelloKlay가 불러와졌다.

 

이상으로 기본적인 솔리디티(Solidity) 문법을 Klaytn IDE 상에서 사용해보았다.


저도 공부하고 있는 입장이라 오류가 있을 수 있으니 틀린 내용이 있다면 편하게 댓글 주세요. :) 

 

솔리디티(Solidity) with Klaytn IDE

반응형
Comments