호스팅된 노드(예: Infura)를 통해 원격 네트워크에 연결할 때, Accounts
컨테이너는 비어 있습니다. 거래를 수행하기 전에 Brownie에 로컬 계정을 추가해야 합니다.
로컬이라는 용어를 사용할 때, 해당 계정이 노드에서 직접 사용 가능한 것이 아니라 시스템 내부에 로컬로 존재한다는 것을 의미합니다. 로컬 계정은 keystores라고 불리는 암호화된 JSON 파일에 저장됩니다. Keystore 파일에 대해 자세히 알고 싶다면, Julien Maffre의 “What is an Ethereum keystore file?”를 읽어볼 수 있습니다.
로컬로 사용 가능한 계정은 명령줄을 통해 관리할 수 있습니다:
$ brownie accounts
새 계정 생성하기
명령 줄을 사용하여 새 계정을 생성하려면:
$ brownie accounts generate <id>
계정의 비밀번호를 선택하라는 메시지가 표시됩니다. 그러면 브라우니가 임의의 개인 키를 생성하고 계정을 <id>
로 사용할 수 있도록 합니다.
개인 키에서 가져오기
개인 키를 사용하여 새 계정을 추가하려면:
$ brownie accounts new <id>
개인 키를 입력하고 비밀번호를 선택하라는 메시지가 표시됩니다. 그러면 계정은 <id>
로 사용할 수 있습니다.
Keystore에서 가져오기
명령줄을 사용하여 기존의 JSON keystore를 Brownie에 가져올 수 있습니다.
$ brownie accounts import <id> <path>
계정을 가져오면 <id>
로 사용할 수 있습니다.
Keystore 내보내기
기존 계정을 JSON Keystore 파일로 내보내려면:
$ brownie accounts export <id> <path>
내보낸 계정은 <path>
에 저장됩니다.
계정 잠금 해제
스크립트나 콘솔에서 로컬 계정에 접근하려면 먼저 잠금을 해제해야 합니다. 이를 위해서는 Accounts.load
메서드를 사용합니다:
>>> accounts
[]
>>> accounts.load(id)
>>> accounts.load('my_account')
Enter the password for this account:
<LocalAccount object '0xa9c2DD830DfFE8934fEb0A93BAbcb6e823e1FF05'>
>>> accounts
[<LocalAccount object '0xa9c2DD830DfFE8934fEb0A93BAbcb6e823e1FF05'>]
계정이 잠금 해제되면 Accounts
컨테이너 내에서 사용할 수 있습니다.
개발 네트워크에서 계정 잠금 해제하기
로컬 또는 포크된 개발 네트워크에서는 해당하는 개인 키가 없어도 잠금을 해제하고 계정을 사용할 수 있습니다. 이를 위해서는 프로젝트의 구성 파일의 unlock
설정에 계정을 추가하면 됩니다:
networks:
development:
cmd_settings:
unlock:
- 0x7E1E3334130355799F833ffec2D731BCa3E68aF6
- 0x0063046686E46Dc6F15918b61AE2B121458534a5
잠금 해제된 계정은 자동으로 Accounts
컨테이너에 추가됩니다. 잠금 해제된 계정에 자금을 수동으로 제공해야 할 수도 있습니다.
서명되지 않은 텍스트 메시지(EIP-191) 서명하기
EIP-191 메시지에 서명하려면, LocalAccount.sign_defunct_message
메서드를 사용하여 eth_account
SignableMessage 객체를 생성하세요:
>>> msg = f"It is my permission to spent 1000 SHIB from {local.address.lower()}"
>>> signed = local.sign_defunct_message(msg)
>>> type(signed)
<class 'eth_account.datastructures.SignedMessage'>
>>> signed.messageHash.hex()
'0x2a180b353c317ae903c063141592ec360b25be9f75c60ae16ca19f5578f70a50'
메시지 서명
EIP712Message를 서명하려면, LocalAccount.sign_message
메서드를 사용하여 eth_account
SignableMessage 객체를 생성합니다:
>>> from eip712.messages import EIP712Message, EIP712Type
>>> local = accounts.add(private_key="0x416b8a7d9290502f5661da81f0cf43893e3d19cb9aea3c426cfb36e8186e9c09")
>>> class TestSubType(EIP712Type):
... inner: "uint256"
...>>> class TestMessage(EIP712Message):
... _name_: "string" = "Brownie Test Message"
... outer: "uint256"
... sub: TestSubType
...>>> msg = TestMessage(outer=1, sub=TestSubType(inner=2))
>>> signed = local.sign_message(msg)
>>> type(signed)
<class 'eth_account.datastructures.SignedMessage'>
>>> signed.messageHash.hex()
'0x2a180b353c317ae903c063141592ec360b25be9f75c60ae16ca19f5578f70a50'
하드웨어 지갑 사용하기
브라우니는 Clef를 통해 하드웨어 지갑 사용을 가능하게 합니다. Clef는 Geth 내부에 포함된 계정 관리 도구입니다.
브라우니에서 하드웨어 지갑을 사용하려면, 먼저 Geth를 설치한 후, 다음 명령어를 입력하고 화면 안내에 따라 Clef를 설정하면 됩니다:
clef init
Clef가 구성되면, 브라우니를 하나의 명령 프롬프트에서 실행하고 Clef를 다른 명령 프롬프트에서 실행하십시오. 브라우니 내에서:
>>> accounts.connect_to_clef()
다시 한번 Clef에서 Brownie의 계정을 잠금 해제하도록 안내에 따르세요. 이제 잠금 해제 된 계정을 다른 계정과 마찬가지로 사용할 수 있습니다. 단, clef에서 ClefAccount를 사용하여 각 거래를 인증해야합니다.
'블록체인 (Block Chain) > 이더리움' 카테고리의 다른 글
[브라우니 (Brownie)] 22. 네트워크 관리 (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 |