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.
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)