Arbiter registry by Vitalik Buterin (Sep 2015). Pay 1+ ETH to list yourself. Fee decays 50%/month. One of the earliest on-chain reputation systems on Ethereum.
Historical Significance
One of the earliest arbitration and reputation systems on Ethereum, deployed directly by Vitalik Buterin during the Frontier era. Demonstrates early experimentation with decentralized dispute resolution and Sybil resistance through economic decay mechanisms.
Key Facts
Description
The ArbiterRegistry is a Serpent contract deployed by Vitalik Buterin on September 28, 2015 (block 301,954) as part of his experimental arbitration dapp. Arbiters register by paying a minimum 1 ETH fee that decays exponentially at 50% per month using a 3rd-order Taylor series approximation.
Key functions: register() to pay and register, set_description() for profile text, get_tot_fee() for current decayed fee, get_addresses() to paginate arbiters, withdraw() for EF to collect fees.
Bytecode verified as exact byte-for-byte match with Serpent compiler at commit e5a5f875 (Sep 26 2015) and source from ethereum/dapp-bin at commit 08fe3e5b.
Source Verified
Exact byte-for-byte match (0 diffs). Source: dapp-bin 08fe3e5b (arbitration/arbiter_reg.se). Compiler: Serpent commit e5a5f875 (Sep 26 2015). Runtime: 1638 bytes. Full creation TX input matches exactly.
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
Frontier Era
The initial release of Ethereum. A bare-bones implementation for technical users.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Serpent)
# Arbiter registry
# There is a minimum 1 ETH fee to register, though registrees are free
# to pay fees above this. In the dapp, registrations will be sorted by
# the total fee paid, although an exponential decay of 50% per month
# will be added.
data arbiters[2**160](totFee, lastPaid, description[10])
data addressList[2**100]
data nextAddress
event NewRegistry(addr:address:indexed, amount)
event FeePaid(addr:address:indexed, amount, newTotal)
event NewDescription(addr:address:indexed, description:str)
PERIOD = 86400 * 30 * 1000 / 693
MINFEE = 10**15
MAX_PERIOD_BEFORE_EXPIRY = 86400 * 365
def const exp_decay(val, i):
while i > PERIOD / 2:
val = val * 6065306 / 10000000
i -= PERIOD / 2
return val - val * i / PERIOD + val * i**2 / PERIOD**2 / 2 - val * i**3 / PERIOD**3 / 6
def register():
# Minimum entry fee: 1 ETH
if self.arbiters[msg.sender].totFee + msg.value < MINFEE:
send(msg.sender, msg.value)
return(0:bool)
if self.arbiters[msg.sender].totFee == 0:
self.addressList[self.nextAddress] = msg.sender
self.nextAddress += 1
self.arbiters[msg.sender].totFee = msg.value
log(type=NewRegistry, msg.sender, msg.value)
log(type=FeePaid, msg.sender, msg.value, msg.value)
else:
timediff = block.timestamp - self.arbiters[msg.sender].lastPaid
self.arbiters[msg.sender].totFee = self.exp_decay(self.arbiters[msg.sender].totFee, timediff) + msg.value
log(type=FeePaid, msg.sender, msg.value, self.arbiters[msg.sender].totFee)
self.arbiters[msg.sender].lastPaid = block.timestamp
return(1:bool)
def set_description(description:str):
# Max length: 288 chars; also, you need to be registered before you can set description
if len(description) > 288 or not self.arbiters[msg.sender].totFee:
return(0:bool)
self.arbiters[msg.sender].description[0] = len(description)
i = 0
while i * 32 < len(description):
self.arbiters[msg.sender].description[i + 1] = description[i]
i += 1
log(type=NewDescription, msg.sender, description)
return(1:bool)
def const get_tot_fee(account:address):
tdiff = block.timestamp - self.arbiters[account].lastPaid
if (tdiff > MAX_PERIOD_BEFORE_EXPIRY):
return(0)
return(self.exp_decay(self.arbiters[account].totFee, tdiff))
def const get_description(account:address):
buffer = alloc(320)
i = 0
buffer[0] = self.arbiters[account].description[0]
while i * 32 < buffer[0]:
buffer[i + 1] = self.arbiters[account].description[i + 1]
i += 1
return(buffer + 32:str)
def const get_addresses(startIndex):
o = array(50)
i = 0
MAX = min(self.nextAddress - startIndex, 50)
while i < MAX:
o[i] = self.addressList[startIndex + i]
i += 1
o[-1] = i
return(o:address[])
# The ethereum foundation can withdraw registration fees
def withdraw():
send(0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae, self.balance)External Links
Related contracts
SerpentGamble
Same deployerProvably-fair betting game where players choose their own odds. The owner settles bets with a commit-reveal random seed. Includes a 2-day emergency refund.
0x034df8...200e2fSeptember 20, 2015SerpentGamble
Same deployerSibling of 0x034dF870 (SerpentGamble). Provably-fair Serpent betting game; players choose their own odds, owner settles via commit-reveal seed, 2-day refund.
0x9ca7e9...fa8bb4September 21, 2015SerpentGamble
Same deployerSibling of 0x034dF870 (SerpentGamble). Provably-fair Serpent betting game; players choose their own odds, owner settles via commit-reveal seed, 2-day refund.
0x75649a...176028September 21, 2015SerpentGamble
Same deployerIntermediate build of serpent_gamble, a provably-fair betting dapp (Bet/Win/Loss/NewSeed), related to verified sibling 0x59375871. Source not yet reconstructed.
0xe1a99f...0d2457September 21, 2015SerpentGamble
Same deployerIntermediate build of serpent_gamble, a provably-fair betting dapp (Bet/Win/Loss/NewSeed), related to verified sibling 0x59375871. Source not yet reconstructed.
0xdc00a9...15861fSeptember 21, 2015SerpentGamble
Same deployerIntermediate build of serpent_gamble, a provably-fair betting dapp (Bet/Win/Loss/NewSeed), related to verified sibling 0x59375871. Source not yet reconstructed.
0xd0ed09...300b48September 21, 2015