誰もが知っていることから始めます。 ICOはどこにでもあり、誰もがさまざまなプロジェクトを提供し、誰もがトークンを販売しています。 そして誰もが割引、ボーナス、条件などのある種の販売モデルを持っています。
奇妙なことに、このエリアは非常に実験的ですが、ボーナスモデルは非常に原始的です。 異なるボリュームまたは時間間隔とパーセンテージが存在するだけです。 そして、なぜそれを複雑にしますか? しかし、私はまだ試みます。 のための実験。 新しいものは常に惹きつけられます。
セキュリティの問題に加えて、スマートコントラクトを作成するときに2番目に重要な問題は、最適化の問題です。 各トランザクションはガスを消費するため、エーテルはトランザクション処理中に消費されます。 コードが複雑で、多くの計算が必要な場合、ICOの投資家にとって非常に高価になります。
ここで、投資した資金の量に応じて滑らかなボーナス曲線を作成したいと想像してください。 そして、単なる線形ではなく、べき乗則です。
ボーナス=(投資額^ 0.07)-1
チャートでは次のように表示されます。

現在の統計によると、平均的な投資家は約5 ETHを投資しているため、ボリュームが1 ETH未満の場合、ボーナスは授与されないとします。
floatはまだ非常に実験的であり、非常に高価なので、uint型のみを使用して計算する必要があります。 この場合、乗算、除算、加算、減算のみを使用できます。
したがって、指数関数を連続して展開する必要があります。
a ^ x = e ^ xlnx = 1 + xlna +(xlna)^ 2/2!+(xlna)^ 3/3!+⋯−∞ <x <∞次に、Xの対数を1回カウントし、異なる間隔で線形関数のセットで近似するためにいくつかのキーポイントを取得する必要があります。
次に、行の最初の4つのメンバーを例にとります。
次に、関数を呼び出すために通常の計算機と使用済みガスを使用して、エラーを評価します。
次のような結果になります。たとえば、近似ln(1.07)の値を計算しました。
pragma solidity ^0.4.15; library SafeMath { function mul(uint256 a, uint256 b) internal constant returns (uint256) { uint256 c = a * b; assert(a == 0 || c / a == b); return c; } function div(uint256 a, uint256 b) internal constant returns (uint256) {
評価:
9 ETHに10 ^ 8を掛けて、関数に渡します。
900000000は1048494787、つまり 10.485 ETH(約16%のボーナス)
計算機で9 ^ 1.07 = 10.496378550818314120261545161046 ETH
エラー:0.001、つまり 0.1%
転送に費やされたトランザクションを考えると、このエラーはオンエアのコミッションと非常に匹敵します。 さらに精度が必要な場合は、シリーズの5つのメンバーを確実に追加できます。
この関数を呼び出すためのガス費用:
実行コスト9598ガス(コストは契約によって呼び出された場合にのみ適用されます)
1001 ETHの場合:
162102425800を1001 ^ 1.07 = 1623.54549(つまり、約62%のボーナス)と比較すると、精度は1.0015になります。 0.15%
実行コスト6406ガス(コストは契約によって呼び出された場合にのみ適用されます)
ご覧のように、現時点ではすべてのICOが200kのガスの使用を推奨していることを考慮すると、関数のガスコストはわずか(6〜9k)です。
同時に、平均的な取引の精度は手数料の範囲内です。
これが真空の馬のようなものであると思われる場合、
SINTEZプラットフォーム sintez.globalプロジェクトのボーナスシステムでは、計算に小数度と対数が使用されると言います。