브라우니는 개발 및 라이브 환경에서 모두 사용할 수 있습니다.
- 개발 환경은 테스트 및 디버깅에 사용되는 로컬 임시 네트워크입니다. 브라우니는 개발 환경에서 Ganache를 사용합니다.
- 라이브 환경은 비로컬적이고 지속적인 블록체인을 의미합니다. 이 용어는 Ethereum 메인넷과 테스트넷 모두를 가리킵니다.
네트워크 설정
네트워크 설정은 커맨드 라인을 통해 처리됩니다:
$ brownie networks
기존 네트워크 보기
네트워크는 "개발" (로컬, 일시적인 환경)와 "라이브" (비로컬, 지속적인 환경)로 크게 분류됩니다. 라이브 네트워크는 또한 체인 (이더리움, ETC 등)별로 분류됩니다.
기존 네트워크 목록을 보려면 brownie networks list
를 입력하세요:
$ brownie networks list
Brownie - Python development framework for Ethereum
The following networks are declared:
Ethereum
├─Mainnet (Infura): mainnet
├─Ropsten (Infura): ropsten
├─Rinkeby (Infura): rinkeby
├─Goerli (Infura): goerli
└─Kovan (Infura): kovan
Ethereum Classic
├─Mainnet: etc
└─Kotti: kotti
Development
├─Ganache-CLI: development
└─Ganache-CLI (Mainnet Fork): mainnet-fork
새로운 네트워크 추가하기
새로운 네트워크를 추가하려면:
$ brownie networks add [environment] [id] host=[host] [KEY=VALUE, ...]
새 네트워크를 선언할 때는 항상 다음 필드를 포함해야합니다
environment
: 네트워크가 배치되어야 할 카테고리, 예를 들어 "Ethereum", "Ethereum Classic" 또는 "Development"
id
: 네트워크에 대한 고유 식별자, 예를 들어 "mainnet"
host
: 연결할 노드의 주소, 예를 들어https://mainnet.infura.io/v3/1234567890abcdef
다음 필드는 선택 사항입니다 :
name
네트워크에 사용할 긴 이름. 지정되지 않은 경우id
가 사용됩니다.
timeout
: RPC 호출 시 응답을 기다리는 시간(초)입니다. 기본값은 30입니다.
네트워크 유형에 따라 추가 필수 및 선택적 필드가 있습니다.
라이브 네트워크
라이브 네트워크는 반드시 다음 필드를 포함해야 합니다:
chainid
: 네트워크의 체인 ID입니다. 같은 체인 ID를 가진 라이브 네트워크는 계약 배포에 대한 로컬 데이터를 공유합니다. 체인 ID 목록은 chainid.network에서 확인할 수 있습니다.
다음 필드는 라이브 네트워크에서 선택적으로 사용할 수 있습니다:
explorer
:Contract.from_explorer
에서 소스 코드를 가져 오는 데 사용하는 API URL입니다. 이 필드를 제공하지 않으면 이 네트워크를 사용할 때 소스 코드를 가져올 수 없습니다.
개발 네트워크
개발 네트워크는 반드시 다음 필드를 포함해야 합니다:
cmd
: 로컬 RPC 클라이언트를 시작하는 데 사용되는 명령어, 예를 들어ganache-cli
입니다.
다음 선택적 필드는 개발 네트워크에 대해 명령행 인수로 Ganache에 전달될 수 있습니다:
port
: 연결할 포트. 고유 필드로 주어지지 않으면 호스트 경로 안에 포함되어야 함.
gas_limit
: 블록 가스 한도. 기본값은 6721925.
accounts
: 자금이 투입된 잠금 해제된 계정 수. 기본값은 10.
mnemonic
: 로컬 계정 생성 시 사용할 니모닉.
chain_id
:eth_chainId
및CHAINID
오프코드에서 사용되는 체인 ID. 값이 주어지지 않으면 포크된 네트워크의 체인 ID로 기본값이 설정되며, 포크가 지정되지 않은 경우 각각 1337 및 1로 기본값이 설정됨.
network_id
: ganache가 자신을 식별하는 데 사용되는 네트워크 ID. 기본값은 현재 타임스탬프 또는 포크된 체인의 네트워크 ID.
evm_version
: 사용할 EVM 룰셋. 기본값은 가장 최근 버전.
fork
: 로컬 클라이언트가 현재 실행 중인 이더리움 클라이언트로부터 포크할 경우 사용. 값은 다른 클라이언트의 HTTP 위치 및 포트(예:http://localhost:8545
) 또는 프로덕션 네트워크(ID)로 지정될 수 있음(예:mainnet
). 자세한 내용은 Using a Forked Development Network 참조.
disable_cache
: 모든 포킹 요청 캐싱 비활성화 여부. true로 설정하면 캐싱이 비활성화됨.
block_time
: 블록 채굴 간의 대기 시간. 기본값은 즉시 채굴.
default_balance
: 잠금 해제된 모든 계정의 시작 잔액. "1000 ether" 또는 "50 gwei"와 같은 단위 문자열 또는 이더로 된 숫자로 지정할 수 있음. 기본값은 100 ether.
time
: 첫 번째 블록이 시작되는 날짜(ISO 8601). 이 기능은Chain.sleep
와 함께 사용하여 시간에 따라 변하는 코드를 테스트할 수 있음. 기본값은 현재 시간.
unlock
: 잠금 해제할 단일 주소 또는 주소 목록. 이러한 계정은Accounts
컨테이너에 추가되어 개인 키를 알고 있는 것처럼 사용할 수 있음.fork
와 결합하여 모든 계정에서 트랜잭션을 보낼 수 있음.
unlimited_contract_size
: 배포된 계약이 24675바이트의 최대 제한을 초과할 수 있도록 함. 값은 true 또는 false이어야 함.
brownie-config.yaml
파일에서 프로젝트 수준에서 지정할 수도 있습니다. 구성 파일을 참조하십시오.brownie networks list true
는 모든 구성 필드를 포함하여 기존 네트워크의 상세보기를 표시합니다. 이는 새 네트워크의 필드를 정의하는 데 유용할 수 있습니다.기본 네트워크 설정
기본 네트워크를 수정하려면 프로젝트 구성 파일에 networks.default
필드를 추가하십시오:
networks:
default: ropsten
구성 파일이 없으면 직접 만들어야 합니다. 자세한 내용은 구성 파일 문서를 참조하십시오.
시작과 연결
CLI 사용
기본적으로, 브라우니는 로드될 때마다 ganache-cli
에 연결하여 시작됩니다. 다른 네트워크에 연결하려면 --network
플래그와 연결하려는 네트워크의 ID를 사용하십시오.
$ brownie --network ropsten
brownie.network 사용하기
brownie.network
모듈에는 이미 정의된 네트워크에 연결하거나 연결을 해제하는 방법을 제공하는 메서드가 포함되어 있습니다.
네트워크에 연결하려면:
>>> network.connect('ropsten')
>>> network.is_connected()
True
>>> network.show_active()
'ropsten'
연결 해제:
>>> network.disconnect()
>>> network.is_connected()
False
라이브 네트워크
ganache-cli를 로컬 개발 환경으로 사용하는 것 외에도, Brownie는 JSON RPC를 지원하는 어떤 테스트넷/메인넷 노드에서든 사용할 수 있습니다.
- 메인넷과 상호 작용할 때, 서명 또는 전송하기 전에 모든 거래의 세부 정보를 확인해야 합니다. 브라우니는 주소를 잘못 입력하거나 너무 많은 이더리움을 보낼 경우와 같은 문제를 방지할 수 없습니다.
- 항상 개인 키를 보호하십시오. 암호화되지 않은 채로 방치하지 마십시오!
개인 노드 대 호스팅 노드
라이브 네트워크와 상호 작용하려면 노드에 연결해야 합니다. 자체 노드를 실행하거나 호스팅 노드에 연결할 수 있습니다.
자체 노드 실행
Geth 또는 Parity와 같은 클라이언트를 사용하여 자체 Ethereum 노드를 실행하고, 이를 통해 Brownie를 연결할 수 있습니다. 노드를 소유하면 가능한 RPC 엔드 포인트를 완전히 제어하고 네트워크에 대한 개인 및 전용 연결이 보장됩니다. 그러나 노드 운영 및 동기화를 유지하는 것은 어려운 작업일 수 있습니다.
노드 실행에 대해 자세히 알아보려면 ethereum.org에서 리소스 목록을 제공합니다.
호스팅된 노드 / 공급 업체 사용하기
Alchemy와 Infura와 같은 서비스는 Ethereum 노드에 대한 공개 액세스를 제공합니다. 이는 직접 노드를 실행하는 것보다 훨씬 간단한 옵션입니다. 그러나 다음과 같은 제한 사항이 있습니다.
- 일부 RPC 엔드 포인트를 사용할 수 없습니다. 특히, Infura는 debug_traceTransaction 방법에 대한 액세스를 제공하지 않습니다. 이러한 이유로 Brownie의 디버깅 도구는 Infura를 통해 연결된 경우 작동하지 않습니다.
- 호스팅된 노드는 계정에 액세스할 수 없습니다. 이는 주요 보안 위협이 될 것입니다! 거래를 수행하기 전에 수동으로 자신의 로컬 계정을 잠금 해제해야 합니다.
Brownie는 네트워크에서 provider 필드를 설정하고 연결된 공급 업체를 설정하여 사용하는 공급 업체를 대량으로 수정할 수 있도록 합니다.
$ brownie networks list_providers
Brownie v1.17.2 - Python development framework for Ethereum
The following providers are declared:
├─dict_keys(['infura', 'alchemy']):
또는
$ brownie networks list_providers True
Brownie v1.17.2 - Python development framework for Ethereum
The following providers are declared:
├─provider: infura:
├─ host: {'host': 'https://{}.infura.io/v3/$WEB3_INFURA_PROJECT_ID'}:
├─provider: alchemy:
├─ host: {'host': 'https://eth-{}.alchemyapi.io/v2/$WEB3_ALCHEMY_PROJECT_ID'}:
제공자가 설정된 모든 네트워크는 다른 제공자 형식으로 교체할 수 있습니다. 예를 들어, 모든 제공자 기반 네트워크를 Alchemy로 교체하려면 다음 명령을 실행하십시오:
$ brownie networks set_provider alchemy
그리고 유효한 모든 네트워크를 Alchemy 형식으로 교체할 수 있습니다. 만약 설정된 공급자가 없다면, 다음과 같이 설정할 수 있습니다:
$ brownie networks modify mainnet provider=alchemy
공급자 추가
공급자를 추가하거나 업데이트하려면 다음을 실행합니다:
$ brownie networks update_provider alchemy https://eth-{}.alchemyapi.io/v2/$WEB3_ALCHEMY_PROJECT_ID
이 URL은 브라우니가 무슨 네트워크에 있든 {}를 대체할 수 있도록 하며, Alchemy 키로 환경 변수인 WEB3_ALCHEMY_PROJECT_ID를 설정해야 합니다.
Infura 사용하기
Infura를 사용하려면, 먼저 계정 등록을 해야 합니다. 가입 후, 로그인하여 새 프로젝트를 생성하세요. 프로젝트 ID와 네트워크에 액세스할 수 있는 API URL이 제공됩니다.
브라우니를 사용하여 Infura에 연결하려면, 프로젝트 ID를 WEB3_INFURA_PROJECT_ID라는 환경 변수에 저장하세요. 다음 명령어를 사용하면 됩니다:
$ export WEB3_INFURA_PROJECT_ID=YourProjectID
Alchemy 사용하기
Alchemy를 사용하기 위해서는 계정에 가입해야 합니다. 계정을 만든 후 로그인하고 새 프로젝트를 만듭니다. 네트워크에 액세스할 수 있는 URL이 제공됩니다.
"view key" 버튼을 클릭하면 URL이 제공됩니다. 마지막 슬래시 다음 부분만 WEB3_ALCHEMY_PROJECT_ID로 사용할 수 있습니다. 예를 들어, 전체 키가 https://eth-mainnet.alchemyapi.io/v2/1234인 경우, WEB3_ALCHEMY_PROJECT_ID는 1234입니다. 주의할 점은 현재 ETH 네트워크에서만 잘 작동하지만 언제든지 공급자 목록을 수정할 수 있습니다.
다음 명령을 사용하여 WEB3_ALCHEMY_PROJECT_ID를 설정할 수 있습니다.
$ export WEB3_ALCHEMY_PROJECT_ID=YourProjectID
또는 .env에 export WEB3_ALCHEMY_PROJECT_ID=YourProjectID 를 추가하고 brownie-config.yaml에 dotenv: .env 를 추가할 수 있습니다.
alchemy를 통해 다른 이더리움이 아닌 네트워크에 연결하려면 일반적인 네트워크 추가 과정을 따라야합니다.
포크된 개발 네트워크 사용
Ganache를 사용하여 라이브 네트워크에서 포크를 만들어 개발 네트워크를 만들 수 있습니다. 이는 프로젝트와 메인 넷에 배포된 다른 프로젝트 간 상호 작용을 테스트하는 데 유용합니다.
Brownie의 mainnet-fork
네트워크는 Infura를 사용하여 메인 넷에서 포크된 개발 네트워크를 만듭니다. 콘솔에 연결하려면:
$ brownie console --network mainnet-fork
이 모드에서는, Contract.from_explorer
을 사용하여 포크한 네트워크에서 소스를 검색하고 계약과 상호 작용할 수 있습니다.
네이티브 EVM 호환 체인 통합
Brownie는 다음과 같은 EVM 호환 체인 컬렉션을 기본적으로 지원합니다:
- 이더리움 클래식
- 바이낸스 스마트 체인
- 팬텀 오페라
- 폴리곤 네트워크
- XDai 네트워크
EVM 호환 체인에 대한 원활한 지원을 위해서는 두 가지 요건이 필요합니다. 체인은 공개적으로 접근 가능한 JSON-RPC 엔드포인트를 가져야 합니다(비용은 무료이며 가입이 필요할 수 있음), 그리고 컨트랙트 소스 및 ABI를 가져오기 위한 API 지원이 있는 블록 익스플로러를 가져야 합니다.
'블록체인 (Block Chain) > 이더리움' 카테고리의 다른 글
[브라우니 (Brownie)] 23. 계정 관리 (0) | 2023.06.18 |
---|---|
[브라우니 (Brownie)] 21. 배포 기본 사항 (2) | 2023.06.18 |
[브라우니 (Brownie)] 20. MythX를 사용한 보안 분석 (0) | 2023.06.18 |
[브라우니 (Brownie)] 19. 커버리지 평가 (0) | 2023.06.18 |
[브라우니 (Brownie)] 18. 상태 기반 테스트 (1) | 2023.06.18 |