Author

Topic: shared payments - поделенные платежи (Read 1524 times)

legendary
Activity: 1554
Merit: 1008

- не очень хорошо всю погрешность кидать на одну сумму.
random_key
legendary
Activity: 1554
Merit: 1008
добавил проверку на отриц доли

все должно пахать
legendary
Activity: 1468
Merit: 1102
Навскидку..
Надо проверять (в общем случае):

- Отрицательные доли
-  amount >0
- sum >0
- diff может быть > 0, может быть <0
- diff нельзя распределять на нулевые суммы
- после распределения diff не должно получиться  отрицательных сумм
- не очень хорошо всю погрешность кидать на одну сумму.
- после распределения некоторые суммы могут получиться равным 0

думаю, что это не полный перечень. Smiley
legendary
Activity: 1554
Merit: 1008
его много кто придумал и он даже есть на моих сервисах

но зачем? когда каждый мог бы в своем кошельке это сделать автоматом
legendary
Activity: 1386
Merit: 1000
поздравляю, ты придумал бюджетный автомат
legendary
Activity: 1554
Merit: 1008
Есть потребность одним платежом раскидывать на много адресов с разными весовыми коэффициентами

сейчас приходится для этого пользоваться сторонними службами - в случае если часть и большие списки

а что если в самом клиенте создать эту возможность?

делаем так называемый shared address - в который записываем список адресов с весовыми коэффициентами:

Code:
shadrr_list = { "addr1": 2, "addr2": 0.33, ... }

для этого в API:
Code:
# создать и сохранить в wallet.dat список, так чтобы изменить этот список нельзя было
shaddr = makesharedaddress( shaddr_list, label )
# причем создается адрес на 1 символ длинее - с добавкой 'S':
shaddr --> 'S1NilT.....13Gfas'
len(shaddr ) --> 35

Чтобы послать всем поделенные платежи вызываем команду API:
Code:
sendshared( shaddr, amount )

тело функции (послать поленные платежи) примерно такое
Code:
################## on python
def sendshared( shaddr, amount ):
  if not amount > 0: return 'error'
  # calc sum
  sum = 0.0
  for v in shaddrs:
    if v>0:
      sum += v

  # recalc amo_outs
  list_out = {}
  for (k, v) in shaddrs.iteritems():
    if v>0:
      list_out[k] = round(amount *v / sum, 8)

  sum_out = 0.0
  for v in list_out:
    sum_out += v
  diff = amount - sum_out
  # ну и раскидать разницу по 0.00000001 случайно на адреса
  while diff>0:
    diff -= 0.00000001
    list_out[random_key[list_out]] += 0.00000001

  return connection.sendmany(list_out)
#################
Jump to: