0

送信に最適なビットコイン トランザクションの組み合わせを選択する必要があります。PHPを使用して結果を達成しましたが、多くのメモリを使用し、データベースがそれをより適切に処理する可能性が非常に高くなります.

取引の全リスト:

+------------------+------+--------+
|  Transaction ID  | Vout | Amount |
+------------------+------+--------+
| transactionid1   |    0 | 10     |
| transactionid1   |    1 | 1.5    |
| transactionid2   |    0 | 0.5    |
| transactionid3   |    0 | 0.7    |
+------------------+------+--------+

amount = 0.4を指定すると、次の行を返す何らかの関数または選択クエリを作成する必要があります

+------------------+------+--------+
|  Transaction ID  | Vout | Amount |
+------------------+------+--------+
| transactionid2   |    0 | 0.5    |
+------------------+------+--------+

私が金額を提供するとき= 2.1

+------------------+------+--------+
|  Transaction ID  | Vout | Amount |
+------------------+------+--------+
| transactionid1   |    1 | 1.5    |
| transactionid3   |    0 | 0.7    |
+------------------+------+--------+

つまり、残り物のナップザック問題のようなものです。これが、組み合わせ論を使用して問題を解決した方法です。トランザクション データを $key => $value 配列にフラット化しました。ここで、$key は transactionid_vout で、value は amount です。

$flatterTransactions = 配列(4) (
  [トランザクション ID1_0] => (整数) 10
  [transactionid1_1] => (フロート) 1.5
  [transactionid2_0] => (フロート) 0.5
  [transactionid3_0] => (フロート) 0.7
)

次に、そのトランザクションから組み合わせを作成します

$combinations = 配列(15) (
    [0] => 配列
        (
            [トランザクション ID1_0] => 10
        )

    [1] => 配列
        (
            [トランザクション ID1_1] => 1.5
        )

    [2] => 配列
        (
            [トランザクション ID2_0] => 0.5
        )

    [3] => 配列
        (
            [トランザクション ID3_0] => 0.7
        )

    [4] => 配列
        (
            [トランザクション ID1_0] => 10
            [トランザクション ID1_1] => 1.5
        )

    [5] => 配列
        (
            [トランザクション ID1_0] => 10
            [トランザクション ID2_0] => 0.5
        )

    [6] => 配列
        (
            [トランザクション ID1_0] => 10
            [トランザクション ID3_0] => 0.7
        )

    [7] => 配列
        (
            [トランザクション ID1_1] => 1.5
            [トランザクション ID2_0] => 0.5
        )

    [8] => 配列
        (
            [トランザクション ID1_1] => 1.5
            [トランザクション ID3_0] => 0.7
        )

    [9] => 配列
        (
            [トランザクション ID2_0] => 0.5
            [トランザクション ID3_0] => 0.7
        )

    [10] => 配列
        (
            [トランザクション ID1_0] => 10
            [トランザクション ID1_1] => 1.5
            [トランザクション ID2_0] => 0.5
        )

    [11] =>配列
        (
            [トランザクション ID1_0] => 10
            [トランザクション ID1_1] => 1.5
            [トランザクション ID3_0] => 0.7
        )

    [12] =>配列
        (
            [トランザクション ID1_0] => 10
            [トランザクション ID2_0] => 0.5
            [トランザクション ID3_0] => 0.7
        )

    [13] =>配列
        (
            [トランザクション ID1_1] => 1.5
            [トランザクション ID2_0] => 0.5
            [トランザクション ID3_0] => 0.7
        )

    [14] =>配列
        (
            [トランザクション ID1_0] => 10
            [トランザクション ID1_1] => 1.5
            [トランザクション ID2_0] => 0.5
            [トランザクション ID3_0] => 0.7
        )

)

次に、組み合わせを調べて、スコアリング付きの合計組み合わせ配列を作成します。ここでのスコアリングの目標は、より少ないトランザクションを使用することです。

$summedCombinations[$key] = array(
                'sum' => $sum,
                'count' => count($combination),
                'score' => $sum * (count($combination) * 2)
            );

結局のところ、合計フィールドで配列をフィルタリングして、自分の金額をカバーするトランザクションのみを残します。スコア順でベストマッチを受け取る。

4

1 に答える 1