Ana içeriğe geç

Staking

Bu kılavuz, validator'leri oluşturma, validator bilgilerini düzenleme ve delegasyon işlemlerini gerçekleştirme gibi staking'in temel operasyonlarına genel bir bakış sağlar. Staking'in genel tanıtımı için lütfen Staking Mekanizması kısmına bakın.

Sözleşme

BSC staking, validator yönetimi ve delegasyon yönetimi için esas olarak StakeHub akıllı sözleşmesini kullanır.

  • StakeHub: Validator oluşturma, kullanıcı delegasyonlarını yönetme ve validator cezaları için yaptırımlar uygular.
    (Adres: 0x0000000000000000000000000000000000002002)

Validator Oluşturma

Bir validator oluşturmak için, aşağıdaki parametrelerle createValidator fonksiyonunu kullanın:

  function createValidator(
address consensusAddress,
bytes calldata voteAddress,
bytes calldata blsProof,
Commission calldata commission,
Description calldata description
) external payable
  • consensusAddress: Validator'un konsensüs adresi.
  • voteAddress: Validator'un oy adresi.
  • blsProof: Oy adresinin kanıtı olarak BLS imzası.
  • commission: Komisyon yapısı, oran, maksimum oran ve maksimum değişim oranı dahil.
  • description: Validator'un açıklaması, moniker, kimlik, web sitesi ve detaylar dahil.
not

Not: Bir validator oluşturmak, 1 BNB kilitlemeyi gerektirir ve işlem, bu kilitleme miktarını ve herhangi bir self-delegasyonu karşılamak için yeterli BNB miktarı ile gönderilmelidir; toplam 2001 BNB.


Validator Bilgilerini Düzenleme

Konsensüs Adresini Düzenleme

Bir validator'un konsensüs adresini değiştirmek için, aşağıdaki parametrelerle editConsensusAddress fonksiyonunu kullanın:

function editConsensusAddress(address newConsensusAddress) external
  • newConsensusAddress: Validator'un yeni konsensüs adresi.

Komisyon Oranını Düzenleme

Bir validator'un komisyon oranını güncellemek için, aşağıdaki parametrelerle editCommissionRate fonksiyonunu kullanın:

function editCommissionRate(uint64 newCommissionRate) external
  • newCommissionRate: Yeni komisyon yapısı, oran, maksimum oran ve maksimum değişim oranı dahil.

Açıklamayı Düzenleme

Bir validator'un açıklamasını güncellemek için, aşağıdaki parametrelerle editDescription fonksiyonunu kullanın:

function editDescription(Description memory newDescription) external
  • newDescription: Validator'un yeni açıklaması, moniker, kimlik, web sitesi ve detaylar dahil.

Oy Adresini Düzenleme

Bir validator'un oy adresini değiştirmek için, aşağıdaki parametrelerle editVoteAddress fonksiyonunu kullanın:

function editVoteAddress(bytes calldata newVoteAddress, bytes calldata blsProof) external
  • newVoteAddress: Validator'un yeni oy adresi.
  • blsProof: Oy adresinin kanıtı olarak BLS imzası.

Delegasyon İşlemleri

Delegasyon

Bir validator'a BNB delegasyonu yapmak için, aşağıdaki parametrelerle delegate fonksiyonunu çağırın:

function delegate(address operatorAddress, bool delegateVotePower) external payable
  • operatorAddress: Validator'un operatör adresi.
  • delegateVotePower: Delegatörün kendi oy gücünü yönetim için validator'a devretmek isteyip istemediğini belirtmek için kullanılacak bayrak.

Delegasyonu İptal Etme

Bir validator'dan BNB delegasyonunu iptal etmek için, aşağıdaki parametrelerle undelegate fonksiyonunu kullanın:

function undelegate(address operatorAddress, uint256 shares) external
  • operatorAddress: Validator'un operatör adresi.
  • shares: Validator'dan iptal edilecek hisse miktarı.

Yeniden Delegasyon

Bir validator'dan diğerine BNB'yi yeniden delegasyon yapmak için, aşağıdaki parametrelerle redelegate fonksiyonunu kullanın:

function redelegate(address srcValidator, address dstValidator, uint256 shares, bool delegateVotePower) external
  • srcValidator: Yeniden delegasyon yapılacak kaynak validator'un operatör adresi.
  • dstValidator: Yeniden delegasyon yapılacak hedef validator'un operatör adresi.
  • delegateVotePower: Delegatörün kendi oy gücünü hedef validator'a devretmek isteyip istemediğini belirtmek için kullanılacak bayrak.

Talep

Unbonding süresinin ardından geri alınmamış BNB'yi talep etmek için, tek istek için claim fonksiyonunu veya birden fazla istek için claimBatch fonksiyonunu kullanın:

function claim(address operatorAddress, uint256 requestNumber) external
  • operatorAddress: Validator'un operatör adresi.
  • requestNumber: Talep edilecek unbonding isteği sayısı. 0, tüm unbonding isteklerinden talep etmek anlamına gelir.
function claimBatch(address[] calldata operatorAddresses, uint256[] calldata requestNumbers) external
  • operatorAddress: Validator'ların operatör adresleri.
  • requestNumber: Validator'lardan talep edilmesi gereken unbonding isteklerinin sayıları.

SSS

Her bir validator'ün kredi sözleşmesinin işlevleri/arayüzleri nelerdir?

Her bir validator için, oluşturulduğunda otomatik olarak dağıtılan bir kredi sözleşmesi vardır. Ayrıca, sözleşme herhangi bir validator operatörü tarafından yükseltilip değiştirilemez.

Kredi sözleşmesi bir BEP20 sözleşmesidir ve ABI şu ile aynıdır: Stake Credit sözleşmesi.

Delegasyonları sorgulamak için işlevler sağlar, bunlar arasında:

  • balanceOf(address): Bir delegatörün kredi bakiyesini alır.
  • getPooledBNB(address): Bir delegatörün havuzdaki BNB miktarını alır.
  • getPooledBNBByShares(uint256): Belirli bir hissenin havuzdaki BNB miktarını alır.
  • getSharesByPooledBNB(uint256): Belirli bir havuzdaki BNB için hisseleri alır.
  • pendingUnbondingRequests(address): Bir delegatör için unbonding isteklerinin sayısını alır.
  • unbondRequest(address, uint256): Bir delegatör için unbond isteğinin detaylarını alır.
  • claimableUnbondRequest(address): Bir delegatör için talep edilebilir unbonding isteklerinin sayısını alır.
  • lockedBNBs(address, uint256): Bir delegatörün unbond kuyruğundaki kilitli BNB'leri alır.

Bir delegatör için hisselerin/BNB miktarının nasıl alınacağını belirlemek?

Her bir belirli validator için, delegatörün hisselerini almak için validator'ün kredi sözleşmesinin balanceOf fonksiyonunu çağırın. Hisseler yerine BNB miktarını almak için getPooledBNB fonksiyonunu kullanabilirsiniz.

Tüm validator'lerin hisselerini almak için, her validator için balanceOf fonksiyonunu çağırın ve sonuçları toplayın.


Belirli bir hissenin BNB miktarının nasıl hesaplanacağını belirlemek?

Kredi sözleşmesi, belirli bir hissenin BNB miktarını hesaplamak için getPooledBNBByShares fonksiyonunu sağlar.

Tersine hesaplama için getSharesByPooledBNB fonksiyonunu kullanarak belirli bir BNB miktarı için hisseleri hesaplayın.


Bir validator'un APR/APY'sinin nasıl hesaplanacağı?

Her bir validator'ün kendine ait APR/APY'si olduğunu lütfen unutmayın ve staking sistemi ödülleri otomatik olarak bileştirir.

Ödül, her gün UTC zamanı ile 00:00:00'da her bir validator'ün BNB havuzuna dağıtılır. Bir validator'un APR/APY'sini hesaplamak için, toplam havuzdaki BNB miktarı ile aynı gün için ilgili ödül miktarı gereklidir.

StakeHub sözleşmesi, bunun amacıyla getValidatorTotalPooledBNBRecord(address,uint256)(uint256) ve getValidatorRewardRecord(address,uint256)(uint256) fonksiyonlarını sağlar.

Aşağıdaki kodlar, belirli bir günde APY'yi nasıl hesaplayacağınızı gösterir:

// örnek kod, üretimde kullanmayın

// stakehub, StakeHub sözleşmesinin örneğidir
stakeHub, _ := contracts.NewStakeHub(ethcommon.HexToAddress("0x0000000000000000000000000000000000002002"), client.GetEthClient())

// bir günde kaç blok olduğunu alın
interval, _ := stakeHub.BREATHEBLOCKINTERVAL(nil)

// belirli bir bloğun blok zamanını alın
header, _ := p.client.GetBlockHeader(blockHeight)

// aşağıdaki fonksiyonları çağırmak için indeks parametresini hesaplayın
index := int64(header.Time) / interval.Int64()

// belirli bir validator ve indeks için toplam havuzdaki BNB miktarını ve ilgili ödül miktarını alın
totalPooledBNB, _ := stakeHub.GetValidatorTotalPooledBNBRecord(nil, validatorOperatorAddress, index)
reward, _ := stakeHub.GetValidatorRewardRecord(nil, validatorOperatorAddress, index)

// APY'yi hesaplayın
rate, _ := big.NewFloat(0).Quo(big.NewFloat(0).SetInt(reward), big.NewFloat(0).SetInt(totalPooledBNB)).Float64()
apy := math.Pow(1+rate, 365) - 1.0

Bir delegatörün unbonding delegasyonlarını ve talep edilebilecek unbonding taleplerini nasıl alabilirim?

Kredi sözleşmesi, bir delegatör için unbonding delegasyonu sayısını almak için pendingUnbondRequest fonksiyonunu sağlar. Unbond isteğinin detaylarını gözden geçirmek için unbondRequest fonksiyonunu, hangi unbond isteğinin döndürüleceğini tanımlamak için bir index parametresi ile çağırın.

Talep edilebilecek unbonding taleplerini almak için, talep edilebilir olanların sayısını almak için claimableUnbondRequest fonksiyonunu çağırın.

Unbonding talepleri için kilitlenmiş BNB'leri almak üzere lockedBNBs fonksiyonunu kullanın. Bu fonksiyon, delegatörün unbond kuyruğundaki ilk number unbonding isteğinin kilitlenmiş BNB toplamını tanımlamak için number parametresine sahiptir. Tüm kilitli BNB'leri almak için number0 olarak ayarlayın.

Bir delegatörün ödülünü nasıl alabilirim?

Sözleşme, bir delegatörün başlangıç delegasyon miktarını saklamaz. Bir delegatörün biriktirdiği ödülü almak için şu adımlar izlenebilir: 1) başlangıç delegasyon miktarını sisteminizde takip edin, 2) validator'un kredi sözleşmesinin getPooledBNB fonksiyonunu çağırın, 3) matematiksel hesaplama yapın.

Bir validator'un toplam staking adresini nasıl alabilirim?

Sözleşme, bir validator'un toplam staking adresini almak için bir işlev sağlamaz. Bunun için Delegated, Redelegated, Undelegated olaylarını indekslemek üzere bir dış hizmet gerekir. Örneğin, stakeHub sözleşmesi üzerinde önce Delegated, Redelegated, Undelegated olaylarını arayan bir indeksleyici inşa etmeyi düşünebilirsiniz. Daha sonra olayları gereksinimlerinize göre sıralayın.

Tüm validator'lerin bilgilerini nasıl alabilirim?

StakeHub sözleşmesi, tüm validator'lerin bilgilerini almak için getValidators fonksiyonunu sağlar; bu bilgiler operator adresleri ve kredi sözleşmesi adreslerini içerir.

Belirli bir validator hakkında daha fazla bilgi almak için aşağıdaki fonksiyonlara bakabilirsiniz:

  • getValidatorConsensusAddress
  • getValidatorCreditContract
  • getValidatorVoteAddress
  • getValidatorBasicInfo
  • getValidatorDescription
  • getValidatorCommission

Sözleşme ABI

StakeHub'ün tam arayüzleri için lütfen ABI dosyasına bakın.