동적 수수료 거래
EIP-1559를 구현하는 네트워크에 상호 작용하는 경우, 거래를 보낼 때 더 나은 수수료 모델을 사용할 수 있습니다. gas_price
를 지정하는 대신 priority_fee
와 선택적인 max_fee
를 지정합니다.
priority_fee
는maxPriorityFeePerGas
를 결정하며, 이것은 채굴자에게 팁을 줍니다. 권장 우선 수수료는chain.priority_fee
에서 읽을 수 있습니다.
max_fee
는 모든 트랜잭션에서 동일하게 소비되는 기본 수수료와 우선순위 수수료를 포함하는maxFeePerGas
를 결정합니다. 현재 기본 수수료는chain.base_fee
에서 읽을 수 있습니다.
브라우니는 우선순위 수수료만 지정하는 경우 base_fee * 2 + priority_fee
를 max_fee
로 사용합니다.
>>> accounts[0].transfer(accounts[1], priority_fee="2 gwei")
Transaction sent: 0x090755e0b75648d12b1ada31fa5957a07aadcbe8a34b8f9af59098f1890d1063
Max fee: 4.0 gwei Priority fee: 2.0 gwei Gas limit: 30000000 Nonce: 0
Transaction confirmed Block: 1 Gas used: 21000 (0.07%) Gas price: 2.875 gwei
동적 수수료 거래는 가스 전략을 지원하지 않으며(어떻게 보면 필요하지도 않습니다). 아래 섹션은 gas_price
를 사용하는 과거 거래에만 적용됩니다.
기본 동적 수수료 설정
모든 거래에 대한 기본 우선 수수료를 설정하기 위해 network.priority_fee
를 사용할 수 있습니다:
>>> from brownie.network import priority_fee
>>> priority_fee("2 gwei")
기본값을 "auto"
로 설정하면 web3.eth.max_priority_fee
를 사용하여 우선순위 수수료를 동적으로 결정합니다. None
으로 설정하면 레거시 스타일 트랜잭션으로 돌아갑니다.
가스 전략
가스 전략은 트랜잭션에 대한 가스 가격을 동적으로 생성하는 객체입니다. 또한 mempool 내에서 대기중인 트랜잭션을 자동으로 대체하는 데에도 사용될 수 있습니다.
가스 전략에는 세 가지 기본 유형이 있습니다.
- 간단한 전략은 한 번에 가스 가격을 제공하지만 대기중인 트랜잭션을 대체하지 않습니다.
- 블록 전략은 초기 가격을 제공하고, 브로드캐스트 된 첫 번째 트랜잭션이 전송된 이후 채굴된 블록 수에 따라 대기중인 트랜잭션을 선택적으로 대체할 수 있습니다.
- 시간 전략은 초기 가격을 제공하고, 브로드캐스트 된 첫 번째 트랜잭션이 전송된 이후 경과된 시간에 따라 대기중인 트랜잭션을 선택적으로 대체할 수 있습니다.
가스 전략 사용하기
가스 전략을 사용하려면 먼저 brownie.network.gas.strategies
에서 해당 전략을 가져와야합니다:
>>> from brownie.network.gas.strategies import GasNowStrategy
>>> gas_strategy = GasNowStrategy("fast")
거래를 수행할 때 gas_price
필드에 객체를 제공할 수 있습니다:
>>> accounts[0].transfer(accounts[1], "1 ether", gas_price=gas_strategy)
전략이 보류 중인 트랜잭션을 대체할 때 반환되는 TransactionReceipt
객체는 확인된 트랜잭션에 대한 것입니다.
비차단 거래 중에 모든 보류 중인 거래는 history
개체 내에서 사용 가능합니다. 하나의 트랜잭션이 확인되면 나머지 보류 중인 트랜잭션은 제거됩니다.
기본 가스 전략 설정
network.gas_price
를 사용하여 모든 거래에 대한 기본 가스 전략을 설정할 수 있습니다:
>>> from brownie.network import gas_price
>>> gas_price(gas_strategy)
가능한 가스 전략
class brownie.network.gas.strategies.LinearScalingStrategy
(initial_gas_price, max_gas_price, increment=1.125, time_duration=30)
선형 가스 가격 상승을 위한 시간 기반 스케일링 전략. • initial_gas_price
: 첫 번째 거래에서 사용할 초기 가스 가격 • max_gas_price
: 사용할 최대 가스 가격 • increment
: 이전 가스 가격에 적용되는 곱셈 기수를 사용하여 새로운 가스 가격을 결정합니다. • time_duration
: 거래 간의 시간(초) 수
>>> from brownie.network.gas.strategies import LinearScalingStrategy
>>> gas_strategy = LinearScalingStrategy("10 gwei", "50 gwei", 1.1)
>>> accounts[0].transfer(accounts[1], "1 ether", gas_price=gas_strategy)
class brownie.network.gas.strategies.ExponentialScalingStrategy
(initial_gas_price, max_gas_price, time_duration=30)
지수 증가하는 가스 가격에 대한 시간 기반 비례 전략. 각 연속 거래의 가스 가격은 이전 가격에 1.1 ** n을 곱한 것으로 계산됩니다. 여기서 n은 브로드캐스트 된 거래 수입니다. 이러한 방식으로 가격 상승은 점차적으로 시작되어 확인될 때까지 증가합니다. • initial_gas_price
: 첫 번째 거래에서 사용할 초기 가스 가격 • max_gas_price
: 사용할 최대 가스 가격 • time_duration
: 거래 간 초 단위의 시간
>>> from brownie.network.gas.strategies import ExponentialScalingStrategy
>>> gas_strategy = ExponentialScalingStrategy("10 gwei", "50 gwei")
>>> accounts[0].transfer(accounts[1], "1 ether", gas_price=gas_strategy)
class brownie.network.gas.strategies.GasNowStrategy
(speed="fast")
GasNow API를 사용하여 가격을 결정하기 위한 간단한 가스 전략.
speed
: API 호출에 기반하여 사용할 가스 가격입니다. 옵션은 빠른, 빠른, 표준 및 느린 것입니다.
>>> from brownie.network.gas.strategies import GasNowStrategy
>>> gas_strategy = GasNowStrategy("fast")
>>> accounts[0].transfer(accounts[1], "1 ether", gas_price=gas_strategy)
class brownie.network.gas.strategies.GasNowScalingStrategy
(initial_speed="standard", max_speed="rapid", increment=1.125, block_duration=2)
GasNow API를 사용한 블록 기반 스케일링 가스 전략.
• initial_speed
: 첫 번째 트랜잭션을 브로드캐스트 할 때 사용할 초기 가스 가격. 옵션은 rapid, fast, standard, slow입니다.
• max_speed
: 트랜잭션을 대체할 때 사용할 최대 가스 가격. 옵션은 rapid, fast, standard, slow입니다.
• increment
: 새로운 가스 가격을 결정하기 위해 가장 최근에 사용된 가스 가격에 적용되는 배율. 증가 된 값이 현재 max_speed
비율 이하이면 새로운 트랜잭션이 브로드캐스트됩니다. initial_speed
의 현재 비율이 증가 된 비율보다 크면 대신 사용됩니다.
• block_duration
: 새로운 트랜잭션 브로드캐스트 간 대기해야 할 블록 수입니다.
>>> from brownie.network.gas.strategies import GasNowScalingStrategy
>>> gas_strategy = GasNowScalingStrategy("fast", increment=1.2)
>>> accounts[0].transfer(accounts[1], "1 ether", gas_price=gas_strategy)
class brownie.network.gas.strategies.GethMempoolStrategy
(position=500, graphql_endpoint=None, block_duration=2)
기본 블록 스케일링 가스 전략은 Geth의 GraphQL 인터페이스를 사용합니다(https://eips.ethereum.org/EIPS/eip-1767). 이 전략을 사용하려면 GraphQL이 활성화된 Geth 노드를 통해 연결해야합니다. 얻는 가스 가격은 가스 가격에 따라 mempool에서 트랜잭션을 정렬하고 position에서 트랜잭션의 가격을 반환하여 결정됩니다. 이는 GasNow API에서 사용하는 기술과 동일합니다. • 200 이하의 위치는 일반적으로 채굴 블록에 트랜잭션을 위치시킵니다. • 위치 500은 일반적으로 2번째 대기 중인 블록에 트랜잭션을 위치시킵니다.
>>> from brownie.network.gas.strategies import GethMempoolStrategy
>>> gas_strategy = GethMempoolStrategy(200)
>>> accounts[0].transfer(accounts[1], "1 ether", gas_price=gas_strategy)
자신만의 가스 전략 구축하기
자신만의 가스 전략을 구현하려면 gas strategy abstract base classes 중 하나를 상속해야합니다.
'블록체인 (Block Chain) > 이더리움' 카테고리의 다른 글
[브라우니 (Brownie)] 13. 트랜잭션 검사 및 디버깅하기 (0) | 2023.06.16 |
---|---|
[브라우니 (Brownie)] 12. 블록체인과 상호작용하기 (0) | 2023.06.16 |
[브라우니 (Brownie)] 10. 컨트랙트로 작업하기 (0) | 2023.06.16 |
[브라우니 (Brownie)] 9. 계정으로 작업하기 (0) | 2023.06.16 |
[브라우니 (Brownie)] 8. 브라우니 GUI (0) | 2023.06.16 |