-공개키(주소키) : 20자리 가지고 있는 키
-암호키(개인키)
나는 까먹을 거 같아서 12345678 로 하였다ㅡ.
어짜피 나는 이더를 안넣을거니까 공개하도록 하겠다 ㅋㅋㅋㅋㅋ
이거 순서대로 배포하는데 힘들었다.
크롬에서 편하게 쓰려면 확장프로그램엠서 핀설정을 해주면 된다.ㅣ
저번 시간에는 ganache-cli만 사용했는데 이제 윈도우에 설치하겠다. 여기서 DOWNLOAD를 누른다. 시간이 조금 걸릴수도 있다. 설치 파일을 열면 다음과 같은 화면이 나온다.
install을 누른다.
continue를 누른다.
다 설치가 되었다. 여기서 quickStart를 누르면 실행이 된다.
가나시에서 정보를 참고하여 참고한다.
그러면 네트워크 이름 및 이름 RPC URL을 입력한다.
여기서 체인 ID에 5777을 입력해주니까 1337을 입려갛라고 해서 체인 ID에 1377을 입력해주었다.
계정 가져오기를 클릭한다.
그러면 이렇게 비공개키 문자열을 붙여넣으라고 나온다.
그러면 가나슈로 간다.
위와 같이 Accounts를 클릭하고 열쇠모양을 누른다.
PRIVATE KEY의 내용을 복사해서 붙여넣어준다.
그러면 가져오기 버튼이 활성화가 될 것이다. '가져오기'를 눌러준다.
그럼 다음과 같이 100ETH가 들어가있을 것이다.
보내기 버튼을 누른다.
추가한 계정 말고 다른 가나슈 계정을 넣어보자.
넣으면 화면이 다음과 같이 바뀔것이다.
나는 이렇게 넣어서 보내보도록 하겠다.
다음과 같이 거래 정보를 담은 화면이 뜬다.
🤔왜 공개키를 요구하지 않나요?
공개키를 만드는 과정
1.keccak256()으로 개인키를 생성한다.
2.개인키를 가지고 공개키를 생성한다. ->개인키를 가지고 있으면 공개키도 알 수 있지만, 공개키만 알면 개인키는 알 수 없다.
다 되어도 금방 변하지 않는다.
기다리면 화면 오른쪽 아래에 조그만한 창이 뜬다.
그 후에 변한다.
거래가 완료가 되었다.
다음과 같이 원래 계정엔 70ETH로 바뀌고, 보냈던 주소는 30ETH를 받아서 130ETH가 되었다. 그리고 원래 계정에는 스마트 컨트랙트 계정에는 TX COUNT, 즉 거래가 몇번 일어났는지에 대한 정보가 담긴다. 올라간 것을 확인할 수 있다.
Transactions 탭에 가보면 거래 정보를 볼 수 있다.
BLOCKS탭에 가보면 가스가 얼마나 소비되었는지 정보도 알 수 있다.
Dapp을 만들기 위한 프레임워크
원래 어제까지 DApp을 배포하는 과정은 다음과 같았다.
위의 코딩을 간소화하는 프레임워크가 truffle이다.
디렉토리 구조가 있는 개발 환경
디렉토리를 만드는 과정이 필요하다.
터미널에 다음과 같이 입력해준다. (이미 저번 시간에 truffle을 전역으로 깔았기에 가능하다)
npx truffle init
(원래는 truffle init인데 나는 npx를 입력해야지만 작동이 되서😂)
그러면 위와 같이 3개의 폴더가 생긴다.
truffle create contract HelloToken
이라는 명령어를 입력해준다. 이는 contract를 만드는 명령어이다.
pragma solidity >=0.4.22 <0.9.0;
contract HelloToken {
constructor() public {
}
function helo() public view returns(string memory){
return "hello";
}
}
위와 같이 입력해준다.
npx truffle compile
을 해준다. 그러면 src폴더에 simplecontract가 없다고 오류가 뜰 것이다. 이를 수정해주기 위해 먼저 네트워크 설정을 바꿔준다.
npx truffle compile
build
라는 폴더가 생기고, 그 안에 constracts라는 폴더가 생긴다. 그리고 그 안에 json파일이 두개 생김을 알 수 있다. 이는 저번 시간에 컴파일할 때 생기는 abi와 bin의 내용을 담고있는 파일들이다.그리고 migrations폴더에 새로운 파일을 하나 생성한다.
그리고 이름을 다음과 같이 숫자_contract이름.js
로 정해준다. 파일명을 이렇게 짓는 것은 통용되는 규칙이라고 한다.
1_initial_migration.js의 파일을 열어보자.
위와 같이 되어있음을 확인해볼 수 있다. 이 내용을 전부 복사해서 2_helloToken.js에 붙여넣어주자. 그리고 Migrations
이라고 써진 내용만 contract의 이름인 HelloToken
으로 바꿔주자.
그런 다음 터미널에 다음과 같이 입력하자.
npx truffle migrate
배포를 하는 명령어이다.
그러면 이와 같이 뜨는 것을 알 수 있다. 체인이 된다.
작동이 됨을 알 수 있다.
그리고 이로 인해서 트랜잭션이 일어남을 가나슈를 통해 알 수 있다.
그 다음으로 테스트를 한 번 해보자. 터미널에 다음과 같이 입력한다.
npx truffle create test HelloToken
그러면 test 폴더 안에 다음과 같은 HelloToken
파일이 생긴다.
const HelloToken = artifacts.require("HelloToken");
/*
* uncomment accounts to access the test accounts made available by the
* Ethereum client
* See docs: https://www.trufflesuite.com/docs/truffle/testing/writing-tests-in-javascript
*/
contract("HelloToken", function (/* accounts */) {
//console.log('should assert true');
//function async aa(){};
//aa();
it("should assert true", async function () {
await HelloToken.deployed();
return assert.isTrue(true);
});
});
여기서
it("should assert true", async function () {
...
}
의 내용은 원래
console.log('should assert true');
function async aa(){...};
aa();
의 내용과 같다. 먼저 "should assert true"를 콘솔에 찍고나서 콜백함수를 실행시키는 것이다. 저번 시간에 코드가 프로미스 객체를 반환함을 알 수 있었다. 그래서 비동기 함수인 async를 써준다.
다음과 같이 바꾸어준다.
const HelloToken = artifacts.require("HelloToken");
contract("HelloToken", function (/* accounts */) {
it("should assert true", async function () {
let instance = await HelloToken.deployed();
let result = await instance.helo();
console.log(`consolelog:`,result);
return result;
});
});
이 코드를 실행하려면 다음과 같은 명령어를 터미널에 입력한다.
npx truffle test
그러면 다음곽 ㅏㅌ이ㅏ 잘 실행이 되었음을 확인할 수 있다.
그래서 이러한 코드를 여러개 만들어서 실행하면서 하는 것이 test 주도 개발이다.
const HelloToken = artifacts.require("HelloToken");
contract("HelloToken", function (/* accounts */) {
it("should assert true", async function () {
let instance = await HelloToken.deployed();
let result = instance.helo();
console.log(`consolelog:`,result);
// return assert.isTrue(true);
return result;
});
});
contract("HelloToken2", function (/* accounts */) {
it("hello token2", async function () {
let instance = await HelloToken.deployed();
let result = instance.hello();
console.log(`consolelog:`,result);
// return assert.isTrue(true);
return result;
});
});
일부러 하나는 오류가 나게 만들었다.
그러면 다음과 같이 하나는 passing
이 되고 하나는 failing
이 됨을 알 수 있다.
contract 파일 2개도 되나요? 된다
npx truffle create contract hello
// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
contract hello {
constructor() public {
}
function bye() public view returns(string memory){
return "bye";
}
}
과정 정리
1. 솔리디티 파일 생성
truffle create contract [파일명]
2. 솔리디티 파일 컴파일하기
truffle compile
build/contracts [파일명].json 생성되는 것 확인
3. 마이그레이션 코드 작성하기
migrations 폴더 안에서 파일 생성
파일명의 규칙은[숫자]_[파일명].js
truffle migrate
4. 테스트 작업
테스트 파일 생성하기
truffle create test [파일명]
이후 코드 작성하기
truffle test
를 통해 테스트 결과를 확인할 수 있다.
새로운 폴더를 하나 만들어준다.
터미널으로 그 폴더 안에 들어가서 다음과 같은 명령어를 입력한다.
truffle unbox react
Y를 누르고 엔터를 누르면 진행이 된다.
작업이 완료가 되면 터미널엔 다음과 같이 뜬다.
그러면 아까와는 다르게 client
폴더가 생긴 것을 알 수 있다. 한 번 기본 폴더들의 내용을 확인해보도록 하겠다.
cd client
터미널에 위와 같이 써서 client 폴더 안으로 이동을 한다.
이 상태에서 다음과 같은 명령어를 입력하여 React를 실행을 해보겠다.
npm run start
그러면 다음과 같이 오류가 난다. 왜냐하면 컴파일도 안했고, 배포도 안했기때문에 그런것이다.
아까와 같이 바꿔준다.
npx truffle compile
React와 연관이 없을 때에는 build폴더 안에 생성이 되었지만 이제는 컴파일한 결과물이 src/contracts 폴더 안에 생겨난다.
여기서 SimpleStorage.json파일이 생성이 되었음을 확인할 수 있다.
npx truffle migrate
가스가 소모되었음을 알 수 있다.
npm run start
를 입력하자. 그리고 크롬에 들어가서 localhost:3000을 주소창에 검색하면 다음과 같이 메타마스크가 작동을 한다.
다음을 누른다.
연결을 누른다.
그러면 다음과 같이 거래가 된다.
이 창이 뜨면 거래가 완료되었다는 것이다. 22confirmed이 아닌 다른 수가 뜰 것이다.
거래가 성사되어서 5가 뜸을 알 수 있다.
unbox next하면 next도 된다.