본문 바로가기
D.evelop/BlockChian \ NFT

[NFT] 2주차(2) Smart Contract / Solidity - 블록체인 마켓 앱 만들기 with 그라운드X

by Danne 2022. 9. 29.

스마트 컨트랙트의 코드 업그레이드는 매우 어렵다.

거의 불가능하다고 보면 된다.

 

그러므로 최신 코드 보다 검증된 소스를 사용하는게 좋다. (현재 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비트 단위로 존재한다.

unit는 unit256의 별칭이다.

 

배포 결과

 

 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데이터를 조회할 수 있다.

 

 

 

 

반응형

댓글