저희가 개발하고 있는 SW는 이더리움 플랫폼 위에서 마켓 시스템을 구현한 탈중앙화 분산 애플리케이션인 DApp입니다.
블록체인 기술 중 하나인 스마트 컨트랙을 이용하며 스마트 컨트랙의 장점을 극대화할 수 있도록 마켓 시스템에 도입하고자 합니다.
저희가 개발하는 DApp의 장점은 탈중앙화이며 이를 스마트 컨트랙의 기술로 활용하기 때문에 중개인 비용이 절감되고 거래 수수료가 현저히 감소하는 효과를 기대할 수 있습니다.
또한 투명한 거래 내역이 공개되므로 위변조가 어렵다는 점에서 보안 유지 효과를 기대할 수 있습니다.
그리고 저희의 최종 결과물은 개발한 DApp을 배포하는 운영환경을 이더리움 테스트 네트워크(Ganache)에서 AWS 이더리움 프라이빗 블록체인 네트워크를 구축한 후 마이그레이션하는 것이 목표입니다.
- 20175257 스마트IoT학과 조우형
오픈소스 자료 활용 / Dapp 개발 및 테스트 / AWS Ethereum Blockchain 네트워크 구축 및 이관
- 20175240 스마트IoT학과 이선재
Github 관리 / Dapp 개발 및 테스트 / AWS Ethereum Blockchain 네트워크 구축 및 이관
- 개발 환경설정
- Smart Contract 생성 / 배포 / 테스트
- 인터페이스 개발 및 DApp 구동
- AWS Ethereum BlockChain Network Template 구축
- AWS Ethereum 네트워크에 DApp 이관 및 구동
- VM : ubuntu-20.04.3-desktop-amd64.iso
- NPM : v8.1.4
- Truffle : v4.1.13 (core: 4.1.13)
- Solidity : v0.4.24 (solc-js)
- Web3 : v1.5.3
- Node : v17.2.0
- Ganache : 1.1.0
- Metamask : latest version
$ mkdir Market_DApp
$ cd Market_DApp
$ truffle unbox pet-shop
Box에는 Truffle에서 제공해주는 Framework는 DApp을 개발하는데 다양한 모듈이 담겨있다.
명령어 입력
$ rm box-img-lg.png
$ rm box-img-sm.png
$ rm -rf src/images/*.jpeg
$ rm src/pets.json
$ nano contracts/LeaseProperty.sol
$ truffle compile
$ nano migrations/2_deploy_contracts.js
Setting -> SERVER 속 PORT Number를 8545로 지정해주고 RESTART 클릭
$ truffle migrate
연결 후 Ganache CURRENT BLOCK 개수 변동 (0 -> 4)
트렌잭션 수수료로 인하여 첫 번째 블럭의 BALANCE 감소
$ nano test/TestLeaseProperty.sol
$ truffle test
$ nano src/js/app.js
$ nano src/index.html
$ nano src/properties.json
AWS Bucket을 사용하여 로컬환경 DApp에서 이미지 확인 가능
- MetaMask 설치
- Network : Localhost 8545
- MNEMONIC 연결 (ganache <-> MetaMask)
마이그레이션을 통한 블록체인 상태가 변한 가나슈와 MetaMask를 연결
연결완료 시, MetaMask 지갑에서 속 값이 Ganache의 블록체인 값과 같음을 볼 수 있다
$ npm run dev
DApp이 구동되고 MetaMask 연결되면 거래 가능 이력을 보면 트랜잭션을 정상 승인되었음을 알 수 있다.
- AWS계정 로그인
- IAM User 생성
- Key Pair 생성
EthereumVPC [VPC] : Virtual Private Cloud
Private Network를 구축할 수 있도록 해주는 AWS 도구
EthereumPubSub1, EthereumPubSub2
[Public Subnet] : 자신의 고유 IP외에 탄력적 IP를 별도록 가지고 있고, 이 IP를 통해 인터넷과 연결 가능하다.
EthereumPvtSub
[Private Subnet] : 자신의 고유 IP만을 가지고 있고, 외부 인터넷과 연결은 불가능하며 Subnet끼리만 트래픽 전송 가능하다.
보안 그룹은 방화벽 역활을 하면서 리소스에 대한 인바운드 및 아웃바운드 트래픽을 제어한다.
✔︎ EthereumEC2_SG
[EC2 인스턴스용 보안 그룹] : EC2 인스턴스에 대한 트래픽 제어
✔︎ EthereumALB_SG
[Application Load Balancer용 보안 그룹] : Application Load Balancer, EC2 인스턴스 및 접속 호스트 간의 트래픽을 제어한다.
Amazon ECS에 대한 IAM 역활과 EC2 인스턴스 프로파일을 지정하여 연결된 권한 정책을 사용하면 AWS리소스 및 인스턴스가 다른 AWS 리소스와 상호 작용할 수 있다.
Ethereum 네트워크에서 웹 인터페이스 및 인스턴스에 연결하는 데 사용하는 EC2 인스턴스이며 일종의 보안을 위해 침입 차단 소프트웨어가 설치가 되어 내부와 외부 네트워크 사이에서 일종의 게이트 역활을 수행하는 호스트이다.
https://aws.amazon.com/ko/blockchain/templates/getting-started/
위 링크에서 최신 Ethereum용 AWS 블록체인 템플릿을 AWS CloudFormation 콘솔에 연결한다.
✔︎ 이를 통해 Ethereum 네트워크 생성을 완료한 것을 확인할 수 있다.
$ ssh -i /ex-key-pair.pem ec2-user@bastion-host-dns -D 9001
위의 명령어로 SSH를 사용하여 SSH 포트포워딩과 함께 Bastion Host에 접속 가능하다.
Ethereum 네트워크 URL에 SSH 터널을 사용하도록 FoxyProxy를 구성
아래의 Stack Output 탭의 링크를 통해 Etheruem URL에 연결
✔︎ EthStats
✔︎ EthExplorer
$ npm install truffle-hdwallet-provider-privkey
const HDWalletProvider = require("truffle-hdwallet-provider-privkey");
const privateKeys = ["afd2168f63635b5235cc8b4d69730faa4ffbea5cfcfab7b7d7625f91656e7d9f"]; //운영환경 Account의 Private Key
module.exports = {
// See <http://truffleframework.com/docs/advanced/configuration>
// for more about customizing your Truffle configuration!
networks: {
development: {
host: "127.0.0.1",
port: 8545,
network_id: "*" // Match any network id
},
awsNetwork: {
provider: () => {
return new HDWalletProvider(privateKeys, "http://internal-TestN-LoadB-1OB27N8UWZK7E-955331309.us-west-2.elb.amazonaws.com:8545") //운영용 RPC URL
},
network_id: 1500,
gas: 300000
},
develop: {
port: 8545
}
}
};
$ truffle migrate --network awsNetwork