Solidity

如何將一定數量的月份添加到時間戳(uint)?

  • May 12, 2018

我正在編寫一份契約,該契約將使用每個期間的確切天數定期計算利息。因此,例如,如果我以 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 這樣的平台上由多數人決定的區塊號。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/48284