본문 바로가기
Ethereum/부동산 Dapp

부동산Dapp_(3)부동산 Dapp Contract 소유자 설정

by rooney-l3 2019. 9. 2.

[STEP1]

1. 구조 살펴보기

 (1) Contracts 디렉토리

  - 솔리디티 contract들을 보관하는 곳입니다. 디렉토리 안에 Migration.sol 파일이 생성되어있습니다. 이 파일은 contract를 배포할 때 migrations 폴더 안에 있는 script 파일들을 실행하게합니다. 

  - RealEstate.sol은 우리가 만들 smartContract 입니다. 

 

 (2) migrations 디렉토리 

  - script 파일들이 보관되는 곳입니다. script파일에는 배포하는 과정이 담긴 로직이 들어있습니다. 앞에 접두사를 주목해야하는데 앞서 설명한 Migration.sol이 contract를 배포 할 때 앞에 분여진 숫자를 보면서 순차적으로 script파일들을 실행하게 됩니다. 따라서 새로운 script를 생성할 경우 순차적으로 진행되는 숫자를 붙여줘야합다. 

  - 1_initial_migration.js파일은 Migration.sol을 노드에 배포하는 로직이 담겨있습니다. 

  - 2_deploy_contracts.js파일은 RealEstate.sol을 노드에 배포하는 로직이 담겨있습니다. 

 

 (3) src 디렉토리

  - Dapp의 프론트엔드를 담당하는 구조들에 관한  CSS, JavaSCript, image 파일들이 들어있습니다.

 

 (4) index.html

   - Dapp의 프론트엔드를 담당합니다. 

 

 (5)real-estate.json 

  - 우리가 Dapp에 개시할 부동산에 관한 정보가 JSON형식으로 저장되어있습니다. 

 

 (6)bs-config.json 

  -  Dapp을 돌릴때 라이트 서버를 통해 작동시킬건데 그 때 필요한 파일입니다.

 

(7)package.json

  - npm 설치시 필요한 파일들을 명시한 파일입니다. 

 

(8) truffle.js

  - 환경설정을 담당하는 파일입니다. ganache네트워크에 Dapp을 연결할 때 사용합니다. 

 

 

[STEP2]

솔리디티 contract의 생성자는 다른 언어와는 다르게 배포할 때 단 한번만 실행되고 그 이후로는 호출할 수 없습니다. 그래서 이 성질을 이용하여 contract의 소유자를 설정할 수 있습니다. 즉, 배포할 때 사용된 계정이 contract의 소유자가 되게 설정하는것 입니다. 

 

소유자를 설정하기 위해 RealEstate.sol의 코드를 아래와 같이 입력해줬습니다.

pragma solidity ^0.4.23;

contract RealEstate {
    address public owner;

    constructor() public {
        owner = msg.sender;
    }
}

 

이제 소유자가 정상적으로 설정되었는지 확인해보겠습니다. 먼저 ganache를 실행시켜줍니다.

위 사진과 같이 첫번째 계정의 잔고가 100ETH인것을 확인 할 수 있습니다. 

 

PowerShell을 키고 변경한 smartcontract를 ganache네트워크를 이용하여 배포해보았습니다. 

 

ganache에서 배포는 첫번째 계정에서 하는것으로 정해져있으므로 첫번째 계정의 잔고가 줄어든것을 확인할 수 있습니다. 즉, 배포한 계정이 첫번 째 계정인것을 확인 할 수 있습니다. 그렇다면 우리가 스마트컨트렉트에서 정해준것처럼 배포한계정이 소유자인지 확인해보록하겠습니다. PowerShell을 키고 아래와 같이 커맨드를 입력합니다.

 

owner이 ganache의 첫번째 계정과 동일한 것을 확인 할 수 있습니다. 

 

즉, STEP2에서는 배포할 때 사용된 계정이 contract의 소유자된것을 확인하였습니다.

 

[STEP3]

step3에서는 test script를 작성해 보도록 하겠습니다. 블록체인에 스마트 컨트렉트를 배포하면 수정하는것이 불가능하기 때문에 많은 테스트를 한 후에 배포하도록 하여야 합니다. 

test 디렉토리에 TestRealEstate.js 파일을 새로 만들었습니다. 코드는 아래와 같습니다.


//솔리디피 파일을 가져와 변수로 접근 할 수 있도록 설정
var RealEstate = artifacts.require("./RealEstate.sol");

contract('RealEstate', function(accounts) { //컨트랙트를 test할때 두개의 인자를 받음(테스팅할 컨트랙트의 이름,account를 콜백으로 받는 함수 )
    var realEstateInstance; //realEstate의 Instance를 저장한 전역변수 선언

    it("컨트랙의 소유자 초기화 테스팅", function() { //it을 사용해 무슨 내용의 테스트를 할지 정의
        return RealEstate.deployed().then(function(instance) {//RealEstate.sol의 컨트랙이 배포되었다면 컨트랙트의 instance를 realEstateInstance 변수에 저장
            realEstateInstance = instance;
            return realEstateInstance.owner.call(); //realEstateInstance의 owner를 불러와 return한다.  
        }).then(function(owner) {
            assert.equal(owner.toUpperCase(), accounts[0].toUpperCase(), "owner가 가나슈 첫번째 계정과 동일하지 않습니다.");       
        }); //실재값owner.toUpperCase()과 예상값 accounts[0].toUpperCase()이 같은지 확인 틀리다면 설정한 오류메세지 출력 
    });     //실재값은 소문자로 리턴되고 예상값은 소문자와 대문자가 섞여서 리턴되므로 모두 대문자로 변형
}); 

 

이제 powershell에서 truffle 커맨드를 입력하여 테스트에 통과하는지 확인해보도록 하겠습니다.  ganache가 켜져있고 컨트랙트가 노드에 배포되있는 상태에서 test를 하여야 합니다. 

 

test통과

위와 같이 커맨드를 입력하면 테스트에 통과한것을 확인 할 수 있습니다.  위의 코드를 약간 변형하여 테스트를 진행한경우 아래와 같이 오류 메세지가 뜨는것을 확인 할 수 있습니다. 

test 오류

 

댓글