Solidity
如何將一定數量的月份添加到時間戳(uint)?
我正在編寫一份契約,該契約將使用每個期間的確切天數定期計算利息。因此,例如,如果我以 2018 年 1 月 1 日至 2018 年 3 月 31 日為例,則該期間將有 90 天。然後,我需要將時間提前 3 個月,以捕捉下一季度的興趣。
我現在使用的具體程式碼是:
function nextPeriod() public { lastPeriodDate = currentPeriodDate; currentPeriodDate += 1 years/4; }
這有效,但它是近似的。
有人有什麼建議嗎?
謝謝!
菲爾
在我看來,更精確地重新建構問題可能會有所幫助。
當你說“我需要”時,它會對應該發生的事情產生一點懷疑。很難說是需要契約來確定這一點,還是需要契約所有者來確定,還是由其他人來確定。這將很重要。
Solidity 沒有一個
month
詞,我懷疑這是由於固有的歧義,因為月份有不同的天數。似乎“月”和“30 天”在非正式對話中隨意互換,但契約與非正式相反。必須準確地定義契約上下文中“月份”的含義。撇開時間戳的不精確性不談,您可以執行以下操作:
now + 30 days
也就是說,在契約需要能夠弄清楚的情況下。
或者,您可以將其外包給 Oracle。
function setNextMonth(uint nextMonth) public onlyOwner ...
也就是說,如果您想準確計算每個月的開始時間並且您不想使契約過於復雜。
第三種方法是執行相當繁瑣的計算,考慮到每個月和閏年的不同天數。這推動(非常困難)反對契約設計中的極簡主義理想。
你甚至可以想像通過意見市場眾包計算,因為正確的選擇是顯而易見的。在這種結構中,“下個月”是在像 Auger 或 Gnosis 這樣的平台上由多數人決定的區塊號。
希望能幫助到你。