[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를 하여야 합니다.
위와 같이 커맨드를 입력하면 테스트에 통과한것을 확인 할 수 있습니다. 위의 코드를 약간 변형하여 테스트를 진행한경우 아래와 같이 오류 메세지가 뜨는것을 확인 할 수 있습니다.
'Ethereum > 부동산 Dapp' 카테고리의 다른 글
부동산Dapp_(5)event (0) | 2019.09.24 |
---|---|
부동산Dapp_(4)매물 구입함수 정의 (0) | 2019.09.24 |
부동산Dapp_(2)트러플 & 컨트랙 배포 (0) | 2019.08.30 |
부동산Dapp_(1)Genesis Block 생성 및 Node 초기화 (1) | 2019.08.22 |
부동산Dapp _Epilogue (0) | 2019.08.22 |
댓글