Solidity 개발 환경

Yona·2022년 1월 22일
2

Solidity

목록 보기
1/2
post-thumbnail
post-custom-banner

📔 Solidity 개발환경을 맞추기 위한, 까먹지 않기 위한, 기록용 글 입니다.

가장 편리한 방법은 ropsten 또는 rinkeby 용 eth를 받아서 remix IDE 에서 개발을 하는 것 입니다. Test Ethereum을 받는 방법은 구글에 'ropsten faucet' 을 검색해보시고 어느 사이트를 들어간 뒤에 네트워크를 맞추고 메타마스크의 본인 address 를 넣어주시면 됩니다.

개발 및 배포 과정

TestRPC → TestNet → MainNet

  • TestRPC : 개발 진행 (ganache)
  • TestNet : 개발 완료 후 메인넷과 동일환 환경에서 테스트 (ropsten)
  • MainNet : 실제 서비스에 사용할 수 있도록 배포 (mainet)

remixd

remixd 는 본인의 로컬 저장소의 소스코드와 remix IDE와 connect을 하여서 파일 또는 git 관리를 용이하게 해준다.

remixd 설치 및 실행

$ npm install -g remixd 
$ mkdir hello_solidity

$ remixd -s ~/hello_solidity https://remix.ethereum.org

remixd 명령어를 통해 작업할 디렉토리를 지정해준 뒤 서비스 실행을 시켜준 뒤, remixd 와 remix IDE 에서의 자세한 연동방법은 아래 링크 를 통해 확인해보자.

Ganache

Ganache (가나슈) 는 하나의 테스트 블록체인 네트워크이다.

ganache 설치 및 진행

$ brew install ganache

brew 를 이용하여 간단하게 ganache 설치할 수 있다.
이후 생겨난 ganache 를 실행시켜 'QuickSTART' 또는 'New Workspace' 를 통해서 하나의 테스트 블록체인 네트워크와 100ETH가 들어있는 10개의 가상 address를 얻을 수 있다.

  • RPC SERVER : HTTP://127.0.0.1:7545
  • NETWORK ID : 5777

**여기서 잠깐!**

메타마스크를 통해 생성한 가나슈 네트워크를 등록해보자, 체인 ID 가 5777 로 등록이 안된다. 그 이유는 가나슈 역시 Localhost Network 에 등록되어있는 체인 ID를 따르기 때문인것 같다... 아님말고


그 이후로는 가상의 address 의 오른쪽 show key 버튼을 클릭하면 보이는 private key 를 통해서 metamask와 연결을 한다. 자세한 방법은 링크를 통해 확인해보자

이제 test-rpc 환경과 ide 개발 환경이 다 갖추어졌다.

openzeppelin

오픈재플린은 안전한 스마트 컨트랙트 개발을 위한 라이브러리 이다.

openzeppelin 설치

$ npm install @openzeppelin/contracts

작업할 디렉토리에서 위 명령어를 통해서 openzeppelin 라이브러리를 설치할 수 있다.

.
├── node_modules
│   └── @openzeppelin
│       └── contracts
│           ├── README.md
│           ├── access
│           │   ├── AccessControl.sol
│           │   ├── AccessControlEnumerable.sol
│           │   ├── IAccessControl.sol
│           │   ├── IAccessControlEnumerable.sol
│           │   └── Ownable.sol
│           ├── build
│           │   └── contracts
│           │       ├── AccessControl.json
│           │       ├── AccessControlEnumerable.json
│           │       ├── Address.json
│           │       ├── Arrays.json
│           │       ├── BeaconProxy.json
│           │       ├── BitMaps.json
│           │       ├── Clones.json
│           │       ├── ConditionalEscrow.json
│           │       ├── Context.json
│           │       ├── Counters.json
│           │       ├── Create2.json
│           │       ├── ECDSA.json
│           │       ├── EIP712.json
│           │       ├── ERC1155.json
│           │       ├── ERC1155Burnable.json
│           │       ├── ERC1155Holder.json
│           │       ├── ERC1155Pausable.json
│           │       ├── ERC1155PresetMinterPauser.json
│           │       ├── ERC1155Receiver.json
│           │       ├── ERC1155Supply.json
│           │       ├── ERC165.json
│           │       ├── ERC165Checker.json
│           │       ├── ERC165Storage.json
│           │       ├── ERC1820Implementer.json
│           │       ├── ERC1967Proxy.json
│           │       ├── ERC1967Upgrade.json
│           │       ├── ERC20.json
│           │       ├── ERC20Burnable.json
│           │       ├── ERC20Capped.json
│           │       ├── ERC20FlashMint.json
│           │       ├── ERC20Pausable.json
│           │       ├── ERC20Permit.json
│           │       ├── ERC20PresetFixedSupply.json
│           │       ├── ERC20PresetMinterPauser.json
│           │       ├── ERC20Snapshot.json
│           │       ├── ERC20Votes.json
│           │       ├── ERC20VotesComp.json
│           │       ├── ERC20Wrapper.json
│           │       ├── ERC2771Context.json
│           │       ├── ERC721.json
│           │       ├── ERC721Burnable.json
│           │       ├── ERC721Enumerable.json
│           │       ├── ERC721Holder.json
│           │       ├── ERC721Pausable.json
│           │       ├── ERC721PresetMinterPauserAutoId.json
│           │       ├── ERC721URIStorage.json
│           │       ├── ERC777.json
│           │       ├── ERC777PresetFixedSupply.json
│           │       ├── EnumerableMap.json
│           │       ├── EnumerableSet.json
│           │       ├── Escrow.json
│           │       ├── Governor.json
│           │       ├── GovernorCompatibilityBravo.json
│           │       ├── GovernorCountingSimple.json
│           │       ├── GovernorProposalThreshold.json
│           │       ├── GovernorSettings.json
│           │       ├── GovernorTimelockCompound.json
│           │       ├── GovernorTimelockControl.json
│           │       ├── GovernorVotes.json
│           │       ├── GovernorVotesComp.json
│           │       ├── GovernorVotesQuorumFraction.json
│           │       ├── IAccessControl.json
│           │       ├── IAccessControlEnumerable.json
│           │       ├── IBeacon.json
│           │       ├── ICompoundTimelock.json
│           │       ├── IERC1155.json
│           │       ├── IERC1155MetadataURI.json
│           │       ├── IERC1155Receiver.json
│           │       ├── IERC1271.json
│           │       ├── IERC1363.json
│           │       ├── IERC1363Receiver.json
│           │       ├── IERC1363Spender.json
│           │       ├── IERC165.json
│           │       ├── IERC1820Implementer.json
│           │       ├── IERC1820Registry.json
│           │       ├── IERC20.json
│           │       ├── IERC20Metadata.json
│           │       ├── IERC20Permit.json
│           │       ├── IERC2612.json
│           │       ├── IERC2981.json
│           │       ├── IERC3156FlashBorrower.json
│           │       ├── IERC3156FlashLender.json
│           │       ├── IERC721.json
│           │       ├── IERC721Enumerable.json
│           │       ├── IERC721Metadata.json
│           │       ├── IERC721Receiver.json
│           │       ├── IERC777.json
│           │       ├── IERC777Recipient.json
│           │       ├── IERC777Sender.json
│           │       ├── IGovernor.json
│           │       ├── IGovernorCompatibilityBravo.json
│           │       ├── IGovernorTimelock.json
│           │       ├── Initializable.json
│           │       ├── Math.json
│           │       ├── MerkleProof.json
│           │       ├── MinimalForwarder.json
│           │       ├── Multicall.json
│           │       ├── Ownable.json
│           │       ├── Pausable.json
│           │       ├── PaymentSplitter.json
│           │       ├── Proxy.json
│           │       ├── ProxyAdmin.json
│           │       ├── PullPayment.json
│           │       ├── ReentrancyGuard.json
│           │       ├── RefundEscrow.json
│           │       ├── SafeCast.json
│           │       ├── SafeERC20.json
│           │       ├── SafeMath.json
│           │       ├── SignatureChecker.json
│           │       ├── SignedSafeMath.json
│           │       ├── StorageSlot.json
│           │       ├── Strings.json
│           │       ├── TimelockController.json
│           │       ├── Timers.json
│           │       ├── TokenTimelock.json
│           │       ├── TransparentUpgradeableProxy.json
│           │       ├── UUPSUpgradeable.json
│           │       ├── UpgradeableBeacon.json
│           │       └── VestingWallet.json
│           ├── finance
│           │   ├── PaymentSplitter.sol
│           │   └── VestingWallet.sol
│           ├── governance
│           │   ├── Governor.sol
│           │   ├── IGovernor.sol
│           │   ├── TimelockController.sol
│           │   ├── compatibility
│           │   │   ├── GovernorCompatibilityBravo.sol
│           │   │   └── IGovernorCompatibilityBravo.sol
│           │   └── extensions
│           │       ├── GovernorCountingSimple.sol
│           │       ├── GovernorProposalThreshold.sol
│           │       ├── GovernorSettings.sol
│           │       ├── GovernorTimelockCompound.sol
│           │       ├── GovernorTimelockControl.sol
│           │       ├── GovernorVotes.sol
│           │       ├── GovernorVotesComp.sol
│           │       ├── GovernorVotesQuorumFraction.sol
│           │       └── IGovernorTimelock.sol
│           ├── interfaces
│           │   ├── IERC1155.sol
│           │   ├── IERC1155MetadataURI.sol
│           │   ├── IERC1155Receiver.sol
│           │   ├── IERC1271.sol
│           │   ├── IERC1363.sol
│           │   ├── IERC1363Receiver.sol
│           │   ├── IERC1363Spender.sol
│           │   ├── IERC165.sol
│           │   ├── IERC1820Implementer.sol
│           │   ├── IERC1820Registry.sol
│           │   ├── IERC20.sol
│           │   ├── IERC20Metadata.sol
│           │   ├── IERC2981.sol
│           │   ├── IERC3156.sol
│           │   ├── IERC3156FlashBorrower.sol
│           │   ├── IERC3156FlashLender.sol
│           │   ├── IERC721.sol
│           │   ├── IERC721Enumerable.sol
│           │   ├── IERC721Metadata.sol
│           │   ├── IERC721Receiver.sol
│           │   ├── IERC777.sol
│           │   ├── IERC777Recipient.sol
│           │   ├── IERC777Sender.sol
│           │   └── draft-IERC2612.sol
│           ├── metatx
│           │   ├── ERC2771Context.sol
│           │   └── MinimalForwarder.sol
│           ├── package.json
│           ├── proxy
│           │   ├── Clones.sol
│           │   ├── ERC1967
│           │   │   ├── ERC1967Proxy.sol
│           │   │   └── ERC1967Upgrade.sol
│           │   ├── Proxy.sol
│           │   ├── beacon
│           │   │   ├── BeaconProxy.sol
│           │   │   ├── IBeacon.sol
│           │   │   └── UpgradeableBeacon.sol
│           │   ├── transparent
│           │   │   ├── ProxyAdmin.sol
│           │   │   └── TransparentUpgradeableProxy.sol
│           │   └── utils
│           │       ├── Initializable.sol
│           │       └── UUPSUpgradeable.sol
│           ├── security
│           │   ├── Pausable.sol
│           │   ├── PullPayment.sol
│           │   └── ReentrancyGuard.sol
│           ├── token
│           │   ├── ERC1155
│           │   │   ├── ERC1155.sol
│           │   │   ├── IERC1155.sol
│           │   │   ├── IERC1155Receiver.sol
│           │   │   ├── extensions
│           │   │   │   ├── ERC1155Burnable.sol
│           │   │   │   ├── ERC1155Pausable.sol
│           │   │   │   ├── ERC1155Supply.sol
│           │   │   │   └── IERC1155MetadataURI.sol
│           │   │   ├── presets
│           │   │   │   └── ERC1155PresetMinterPauser.sol
│           │   │   └── utils
│           │   │       ├── ERC1155Holder.sol
│           │   │       └── ERC1155Receiver.sol
│           │   ├── ERC20
│           │   │   ├── ERC20.sol
│           │   │   ├── IERC20.sol
│           │   │   ├── extensions
│           │   │   │   ├── ERC20Burnable.sol
│           │   │   │   ├── ERC20Capped.sol
│           │   │   │   ├── ERC20FlashMint.sol
│           │   │   │   ├── ERC20Pausable.sol
│           │   │   │   ├── ERC20Snapshot.sol
│           │   │   │   ├── ERC20Votes.sol
│           │   │   │   ├── ERC20VotesComp.sol
│           │   │   │   ├── ERC20Wrapper.sol
│           │   │   │   ├── IERC20Metadata.sol
│           │   │   │   ├── draft-ERC20Permit.sol
│           │   │   │   └── draft-IERC20Permit.sol
│           │   │   ├── presets
│           │   │   │   ├── ERC20PresetFixedSupply.sol
│           │   │   │   └── ERC20PresetMinterPauser.sol
│           │   │   └── utils
│           │   │       ├── SafeERC20.sol
│           │   │       └── TokenTimelock.sol
│           │   ├── ERC721
│           │   │   ├── ERC721.sol
│           │   │   ├── IERC721.sol
│           │   │   ├── IERC721Receiver.sol
│           │   │   ├── extensions
│           │   │   │   ├── ERC721Burnable.sol
│           │   │   │   ├── ERC721Enumerable.sol
│           │   │   │   ├── ERC721Pausable.sol
│           │   │   │   ├── ERC721URIStorage.sol
│           │   │   │   ├── IERC721Enumerable.sol
│           │   │   │   └── IERC721Metadata.sol
│           │   │   ├── presets
│           │   │   │   └── ERC721PresetMinterPauserAutoId.sol
│           │   │   └── utils
│           │   │       └── ERC721Holder.sol
│           │   └── ERC777
│           │       ├── ERC777.sol
│           │       ├── IERC777.sol
│           │       ├── IERC777Recipient.sol
│           │       ├── IERC777Sender.sol
│           │       └── presets
│           │           └── ERC777PresetFixedSupply.sol
│           └── utils
│               ├── Address.sol
│               ├── Arrays.sol
│               ├── Context.sol
│               ├── Counters.sol
│               ├── Create2.sol
│               ├── Multicall.sol
│               ├── StorageSlot.sol
│               ├── Strings.sol
│               ├── Timers.sol
│               ├── cryptography
│               │   ├── ECDSA.sol
│               │   ├── MerkleProof.sol
│               │   ├── SignatureChecker.sol
│               │   └── draft-EIP712.sol
│               ├── escrow
│               │   ├── ConditionalEscrow.sol
│               │   ├── Escrow.sol
│               │   └── RefundEscrow.sol
│               ├── introspection
│               │   ├── ERC165.sol
│               │   ├── ERC165Checker.sol
│               │   ├── ERC165Storage.sol
│               │   ├── ERC1820Implementer.sol
│               │   ├── IERC165.sol
│               │   ├── IERC1820Implementer.sol
│               │   └── IERC1820Registry.sol
│               ├── math
│               │   ├── Math.sol
│               │   ├── SafeCast.sol
│               │   ├── SafeMath.sol
│               │   └── SignedSafeMath.sol
│               └── structs
│                   ├── BitMaps.sol
│                   ├── EnumerableMap.sol
│                   └── EnumerableSet.sol
├── package-lock.json
└── package.json

오픈재플린에서 제공하고있는 라이브러리는 이렇게 많이 있으며,
import 를 통해서 사용하고싶은대로 사용하여 개발하면 된다.


1) remixd https://remix-ide.readthedocs.io/en/latest/remixd.html
2) metamask https://trufflesuite.com/tutorial/index.html#installing-and-configuring-metamask
3) openzeppelin https://docs.openzeppelin.com/contracts/4.x/#install

post-custom-banner

0개의 댓글