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) :
- 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
- 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)