Algorithme de sélection des sources pour transactions

Dans sakia, avec du pseudocode rapide (et résumé du vrai code qui est un peu plus poussé, c’est pour donner l’idée générale) :

  1. Calcul des sources https://git.duniter.org/clients/python/sakia/blob/master/src/sakia/services/documents.py#L221
liste_sources = liste_vide()
depassement = 0
base_courante = base_courante_reseau() # par exemple, base 1
sources_disponibles = get_sources_disponibles(pubkey)
pour chaque source dans sources_disponibles:
  si source.base == base_courante:
      test_sources = liste_sources.copy()
      test_sources.ajout(source)
      list_sources.ajout(source)
      sources_disponible.retire(source)
      si valeur(test_sources) >= valeur_cible:
            depassement = valeur(test_sources) - valeur_cible

    base_courante -= 1
retourne liste_sources, depassement
  1. Génération des transactions et chainage https://git.duniter.org/clients/python/sakia/blob/master/src/sakia/services/documents.py#L351
fonction prepare_transaction(montant_cible, pubkey_cible):
   transactions = liste_vide()
   sources, depassement = calcul_sources(montant_cible, envoyeur, receveur)
   tant_que sources.length > 40:
      transaction_chainee = prepare_transaction(valeur(sources), notre_pubkey)
      transactions.ajout(transaction_chainee)
  consommation(sources)

  pour toutes les tx dans transactions:
      creation_sources_depuis_output_vers_envoyeur(tx) # permet de connaitre en avance les outputs générés par la transaction lorsqu'elle sera ajoutée à la  chaine
      generation_doc_et_envoi(tx)
3 Likes