📔 Solidity 개발환경을 맞추기 위한, 까먹지 않기 위한, 기록용 글 입니다.
가장 편리한 방법은 ropsten 또는 rinkeby 용 eth를 받아서 remix IDE 에서 개발을 하는 것 입니다. Test Ethereum을 받는 방법은 구글에 'ropsten faucet' 을 검색해보시고 어느 사이트를 들어간 뒤에 네트워크를 맞추고 메타마스크의 본인 address 를 넣어주시면 됩니다.
TestRPC → TestNet → MainNet
- TestRPC : 개발 진행 (ganache)
- TestNet : 개발 완료 후 메인넷과 동일환 환경에서 테스트 (ropsten)
- MainNet : 실제 서비스에 사용할 수 있도록 배포 (mainet)
remixd 는 본인의 로컬 저장소의 소스코드와 remix IDE와 connect을 하여서 파일 또는 git 관리를 용이하게 해준다.
$ npm install -g remixd
$ mkdir hello_solidity
$ remixd -s ~/hello_solidity https://remix.ethereum.org
remixd 명령어를 통해 작업할 디렉토리를 지정해준 뒤 서비스 실행을 시켜준 뒤, remixd 와 remix IDE 에서의 자세한 연동방법은 아래 링크 를 통해 확인해보자.
Ganache (가나슈) 는 하나의 테스트 블록체인 네트워크이다.
$ brew install ganache
brew 를 이용하여 간단하게 ganache 설치할 수 있다.
이후 생겨난 ganache 를 실행시켜 'QuickSTART' 또는 'New Workspace' 를 통해서 하나의 테스트 블록체인 네트워크와 100ETH가 들어있는 10개의 가상 address를 얻을 수 있다.
메타마스크를 통해 생성한 가나슈 네트워크를 등록해보자, 체인 ID 가 5777 로 등록이 안된다. 그 이유는 가나슈 역시 Localhost Network 에 등록되어있는 체인 ID를 따르기 때문인것 같다... 아님말고
그 이후로는 가상의 address 의 오른쪽 show key 버튼을 클릭하면 보이는 private key 를 통해서 metamask와 연결을 한다. 자세한 방법은 링크를 통해 확인해보자
이제 test-rpc 환경과 ide 개발 환경이 다 갖추어졌다.
오픈재플린은 안전한 스마트 컨트랙트 개발을 위한 라이브러리 이다.
$ 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