UNIXタイムスタンプを返す小さなサーバーを用意し、クライアントがそれを取得してクロックドリフト(時刻の差)を計算し、すべてのプロトコル関連の時刻をそのドリフトに基づいて算出する方式がいいだろう。時計はまだ多少ずれる(システム時計でもどのみちずれる)し、完全な同期は得られない(分散システムでは不可能)が、現在の問題は解決するだろう。
コードは約5行で、タイムスタンプを計算する際の単純な算術(加算)だ。
サーバーならすでにたくさんあるのに、なぜサーバーを用意するの?
Bitcoinクライアントの肥大化は避けたいし、Bitcoinクライアントがシステム時刻を設定するのは絶対にダメだということには同意する。
しかし、エラーの場合にBitcoinクライアントがログにメッセージを記録し、システム時刻の代わりにネットワーク時刻を使おうとするのは価値があるかもしれない。
既存のサーバーについては、Bitcoinクライアントにはすでにhttpがあるよね? まあ、今ではほとんどのHTTPサーバーがヘッダーに日付を提供している。例えばPythonでは:
import os, re, urllib
info = urllib.urlopen('http://www.yahoo.com/').info()
regx = r'Date:\s+[A-Z][a-z]{2}, (\d{1,2}) ([A-Z][a-z]{2}) (\d{1,4}) (\d\d:\d\d:\d\d)'
d, M, Y, T = re.search(regx,str(info)).groups()
m = 1+"JanFebMarAprMayJunJulAugSepOctNovDec".index(M)/3
print '%04d.%02d.%02d-%s' % (int(Y), m, int(d), T)
(この出力形式は、システム時刻を設定したい場合に “date -us” でそのまま使える)
もちろん、Yahooだけに頼るよりも、複数のサイトを確認した方がいいだろう。HTTPサーバーの時刻が正確に設定されている保証はないからね。😊