스마트 컨트랙트의 코드 업그레이드는 매우 어렵다.
거의 불가능하다고 보면 된다.
그러므로 최신 코드 보다 검증된 소스를 사용하는게 좋다. (현재 klaytn contact의 경우 0.5정도)
solidity를 사용해 smart contract 실습
✅ smart contract 에 값 생성
pragma solidity >=0.4.24 <=0.5.6;
// 스마트 컨트랙트에 값을 보관
contract Practice {
uint256 private totalSupply = 10;
string public name = 'KlayLion';
function getTotalSupply() public view returns (uint256){
return totalSupply + 1000000; // totalSupply에 1000000을 더한 값을 리턴
}
}
uint256
unit는 C언어에서 부호없는 정수값을 의미한다.
256은 비트 사이즈를 의미하며, uint는 uint8 에서 uint256 까지 8비트 단위로 존재한다.
✅ smart contract 로 값 변경
pragma solidity >=0.4.24 <=0.5.6;
// 스마트 컨트랙트에 값을 보관
contract Practice {
uint256 private totalSupply = 10;
string public name = 'KlayLion';
function getTotalSupply() public view returns (uint256){
return totalSupply + 1000000;
}
//값 변경
// uint256 newSupply에 값을 입력받고 totalSupply에 저장
function setTotalSupply(uint256 newSupply) public {
totalSupply = newSupply;
}
}
getTotalSupply클릭 시, block이 안나오고 call로 호출된다.
setTotalSupply클릭 시, block이 생긴다.
즉,
- 값을 읽기만 하는 것을 수수료가 들지 않는다. 새로 트랜잭션을 만들지 않기 때문.
- 값을 수정하거나 생성하는 것은 수수료가 든다. 새로운 트랜잭션을 만들어야하기 때문
지갑을 조회하거나 transaction 또는 uri정보를 읽기 (read)하는 것엔 비용이 발생하기 않고,
생성, 소각, 전송하는 것에는 비용이 발생한다.
✅ contract deployer(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;
// 트랜젝션 실행한 애 (setTotalSupply > getTotalSupply의 결과)를
// owner라는 변수에 넣어줘
}
function getTotalSupply() public view returns (uint256){
return totalSupply + 1000000;
}
//값 변경
function setTotalSupply(uint256 newSupply) public {
totalSupply = newSupply;
}
}
msg.sender
msg.sender (address): 메세지 발신자 (현재 호출)
✅ contract deployer(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 returns (uint256){
return totalSupply + 1000000;
}
//값 변경
function setTotalSupply(uint256 newSupply) public {
//컨트랙트를 만든 사람만 변경하게
require(owner == msg.sender, 'Not owner'); // 만족해야만 다음 코드 진행, 만족 못하면 함수 실행 취소
totalSupply = newSupply;
}
}
새 계좌 생성 (owner가 아닌)
// 2nd Add
// Address
0x00f3d9685ed63a8403c48ac51187a867a9affc61
// private key
0x2e............
// Wallet key
0x2e.........
owner가 아닌 계정으로 값 변경을 시도할 시 Error가 뜬다.
✅ Map 함수 를 사용해 토큰에 key와 value를 저장
mapping에는 key와 value값이 존재한다.
mapping(_KeyType => _ValueType) 권한 변수이름
pragma solidity >=0.4.24 <=0.5.6;
// 스마트 컨트랙트에 값을 보관
contract Practice {
uint256 private totalSupply = 10;
string public name = 'KlayLion';
address public owner; //contract deployer
// tokenURIs 매핑
mapping (uint256 => string) public tokenURIs;
constructor () public {
owner = msg.sender;
}
function getTotalSupply() public view returns (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;
}
}
10, "HelloKlay"를 각각 key와 value로 매핑.
해당 컨트랙트를 조회하면 URI데이터를 조회할 수 있다.
반응형
'D.evelop > BlockChian+NFT' 카테고리의 다른 글
[NFT] 2주차(4) Smart Contract↔Wallet / Solidity - 블록체인 마켓 앱 만들기 with 그라운드X (1) | 2022.09.30 |
---|---|
[NFT] 2주차(3) 토큰 전송 safeTransferFrom - 블록체인 마켓 앱 만들기 with 그라운드X (1) | 2022.09.30 |
[NFT] 테스트 이미지 - 블록체인 마켓 앱 만들기 with 그라운드X (2) | 2022.09.19 |
[NFT] 2주차(1) Solidity - 블록체인 마켓 앱 만들기 with 그라운드X (0) | 2022.08.03 |
[NFT] 1주차 - 블록체인 마켓 앱 만들기 with 그라운드X (0) | 2022.07.20 |
댓글