Merge pull request #32 from vladzamfir/master

add casper cbc spec and cbc abstract drafts
This commit is contained in:
Vlad Zamfir 2017-11-01 18:28:49 -05:00 committed by GitHub
commit 0cac0bf1f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 3519 additions and 0 deletions

Binary file not shown.

View File

@ -0,0 +1,577 @@
\documentclass{article}
\usepackage{graphicx}
\usepackage{amsthm}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage{amssymb}
\usepackage{tikz-cd}
\usepackage{etoolbox}
\usepackage[]{algorithm2e}
\usepackage[section]{placeins}
\input{eth_header.tex}
\usepackage{geometry}
\geometry{
a4paper,
total={170mm,257mm},
left=20mm,
top=20mm,
}
\let\oldproofname=\proofname
\renewcommand\proofname{\bf{\oldproofname}}
\renewcommand\qedsymbol{$\blacksquare$}
\theoremstyle{definition}
\newtheorem{thm}{Theorem}
%\newtheorem{lemma}{Lemma}
\newtheorem{defn}{Definition}[section]
\newcommand{\notimplies}{%
\mathrel{{\ooalign{\hidewidth$\not\phantom{=}$\hidewidth\cr$\implies$}}}}
\newcommand{\cat}{
\mathbf
}
\newcommand{\domain}[1]{
\mathrm{dom}(#1)
}
\newcommand{\codomain}[1]{
\mathrm{cod}(#1)
}
\newcommand{\idarrow}[1][]{
\mathrm{1}_{#1}
}
\AtBeginEnvironment{quote}{\singlespacing\small}
\setlength{\parskip}{1em}
\setlength{\parindent}{2em}
\raggedbottom
\graphicspath{{figures/}}
\begin{document}
\title{ Casper the Friendly Ghost \\ \Large{A ``Correct-by-Construction'' Blockchain Consensus Protocol} \\ \vspace{5mm} \small{DRAFT v0.1}}
\author{Vlad Zamfir \\ Ethereum Foundation}
\maketitle
\begin{abstract}
We present a specification and limited experimental observations of a blockchain-based consensus protocol, ``Casper the Friendly Ghost.''
The protocol uses an adaptation of Y.\ Jompolovsky and A.\ Zohar's Greedy Heaviest Observed Sub-tree (GHOST) as a ``fork-choice rule.'' It is able to finalize/decide on blocks with asynchronous and Byzantine fault tolerant consensus safety. It allows blocks to be finalized while the network operates with the network overhead of the Bitcoin blockchain, with each node receiving $\mathcal{O}(1)$ messages/block. This is in contrast to the $\mathcal{O}(N)$ traditionally required for Byzantine fault tolerant state machine replication.
For pedagogical reasons, we first specify a binary consensus protocol (which decides on a bit, $0$ or $1$). This binary consensus protocol satisfies the same consensus safety proof as the blockchain consensus protocol and is therefore very similar to the blockchain consensus protocol.
\end{abstract}
\section{Introduction}
Consensus protocols are used by nodes in distributed systems to decide on the same consensus values, or on the same list of inputs to a replicated state machine. This is a challenging problem due to both network latency and the presence of faulty nodes. Arbitrary network latency, for example, means that nodes recieve distinct sets of messages, while the messages that they each receive may arrive in different orders. Faulty nodes may go offline, or they may behave in an arbitrary manner.
There are, roughly speaking, two broad classes of consensus protocols known today. One we refer to as ``traditional consensus''. This class has its ``genetic roots'' in Paxos and multi-Paxos, and in the ``traditional'' consensus protocol research from the 80s and 90s\cite{lamport_1998}. The other we refer to as ``blockchain consensus''. These are protocols that have their roots in the Bitcoin blockchain and Satoshi Nakamoto's whitepaper\cite{nakamoto}. We first discuss the differences between these classes of protocols. Then we give an overview of the safety proof that the protocols given in this document satisfy, and finally we present the specifications of the protocols at hand.
\subsection{Comparing Traditional Consensus to Blockchain Consensus}
Traditional consensus protocols (such as multi-Paxos and pbft) are notoriously difficult to understand\cite{paxos}. Blockchain consensus protocols, on the other hand, are much more accessible. This difference comes at least in part from the relative simplicity of Bitcoin's specification.
In the context of state machine replication, traditional protocols decide (with irrevocable finality) on one ``block'' of state transitions/transactions to add to the shared operation log at a time. To decide on a block, a node must receive $\mathcal{O}(N)$ messages, where $N$ is the number of consensus-forming nodes.
Blockchain consensus protocols like Bitcoin do not finalize/decide on one block at a time. In fact, the Bitcoin blockchain in particular does not make ``finalized decisions'' at all; blocks are ``orphaned'' if/when they are not in the highest total difficulty chain. However, if the miners are able to mine on the same blockchain, then the blocks that get deep enough into the blockchain won't be reverted (``orphaned''). A block's depth in the blockchain therefore serves as a proxy for finalization. In the average case for blockchain consensus protocols, each node only requires approximately one message, $\mathcal{O}(1)$, for every block.
Traditional consensus protocol research has focused on producing protocols that are asynchronously safe (i.e.\ blocks won't be reverted due to arbitrary timing of future events) and live in asynchrony (or partial synchrony) (i.e.\ nodes eventually decide on new blocks). On the other hand, the Bitcoin blockchain is not safe in an asynchonous network but is safe and live (for unknown block-depth or ``confirmation count'') in a ``partially synchronous network.''
Traditional Byzantine fault tolerant consensus protocols have precisely stated Byzantine fault tolerance numbers (often can tolerate less than a third Byzantine faults, or up to $t$ faults when there are $3t + 1$ nodes)[CITE]. On the other hand, it is less clear exactly how many faults (measured as a proportion of hashrate) the Bitcoin blockchain protocol can tolerate.
\subsection{Overview of the Work Presented}
We give the specification of a consensus protocol, ``Casper the Friendly Ghost,'' which has both the low overhead of blockchain consensus protocols and the asynchronous Byzantine fault tolerant safety normally associated with traditional consensus protocols. However, before we share the blockchain consensus protocol, we give the specification of a binary consensus protocol (which chooses between $0$ and $1$ with asynchronous, Byzantine fault tolerant safety).
Understanding the binary consensus protocol makes it much easier to understand the blockchain consensus protocol; the protocols are remarkably similar. They are so similar because they are both ``generated'' in order to satisfy the same consensus safety proof.
This process for choosing the protocol specification is not specified or justified here, but rather in another, more abstract, paper[CITE]. This paper lacks information about \emph{why exactly} certain choices were made or \emph{how exactly} certain claims are proven. Even without the full scope of the ``process paper,'' our aim is to provide the reader with clear intuitions about why/how the blockchain protocol works. We therefore give a high level sketch of the safety proof which these protocols satisfy. Then, we present the promised protocols.
\subsection{Consensus Safety Proof}
Each of the protocols presented satisfies the same consensus safety proof. (And indeed, any consensus protocol generated by the correct-by-construction process\footnote{See our related paper -- PAPER} satisfies the same proof.)
We assume that nodes running the consensus protocol have (local) states in $\Sigma$. These states have directional paths called ``protocol executions'' or ``protocol state transitions'' between them. We write $\sigma \to \sigma'$ if there is an execution from $\sigma$ to $\sigma'$. Additionally, the paths are composable: if $\sigma \to \sigma'$ and $\sigma' \to \sigma''$, then there is also an execution $\sigma \to \sigma''$.
The proof refers to an ``estimator,'' which maps protocol states to propositions about the consensus. In the binary consensus, the estimator maps protocol states to $0$ or $1$. In the blockchain consensus, on the other hand, the estimator maps protocol states to a blockchain (functioning as our ``fork choice'').
An estimate in the binary consensus ($0$ or $1$) is said to be ``safe'' (have ``estimate safety'') for a particular protocol state if it is returned by the estimator on all future protocol states\footnote{I.e.\ all states accessible from that state through any valid protocol execution.}. In the blockchain consensus, a block is said to be ``safe'' for a particular protocol state if it is also in the fork choice for all future protocol states.
The consensus safety proof shows that decisions on safe estimates have consensus safety\footnote{Consensus safe decisions have the following property: any decisions made on safe estimates by a protocol following node will be \emph{consistent} with decisions made on safe estimates by any other protocol following node.} (as long as there are not more than $t$ Byzantine faults).
The proof relies on the following key result: If node $1$ with state $\sigma_1$ has safe estimate $e_1$ and another node $2$ with state $\sigma_2$ has safe estimate $e_2$, \emph{and if they have a future state in common $\sigma_3$}, then node $1$ and node $2$'s decisions on $e_1$ and $e_2$ are consistent. The result is quite simple as it follows without much work from the definition of estimate safety. Specifically, if a state $\sigma$ has a safe estimate $e$, then any future protocol state of $\sigma$, $\sigma'$, is also safe on $e$. So if our states $\sigma_1$ and $\sigma_2$ (with safety on $e_1$ and $e_2$) share a common future, then that future has to be safe on both $e_1$ \emph{and} $e_2$, which means that they are consistent. So this first part of the proof shows that decisions on safe estimates are consensus safe \emph{for any pair of nodes who have a future protocol state in common}.
Next we aim to construct protocols (``protocol states'' with ``state transitions'') which guarantee that nodes have common future protocol states unless there are more than $t$ Byzantine faults. Such a protocol has consensus safety if there are not more than $t$ such faults, from the result we just discussed. We accomplish this in a few steps.
First, we assume that protocol states are sets of protocol messages and then insist that the union $\sigma_1 \cup \sigma_2$ of any two protocol states $\sigma_1$ and $\sigma_2$ is itself a protocol state. Further, we insist that there is a state transition from each protocol state $\sigma$ to $\sigma' \supset \sigma$ (any superset of $\sigma$). This means that $\sigma_1 \cup \sigma_2$ is a protocol future of $\sigma_1$ and $\sigma_2$.
This assumption by itself allows for any two states to always have a common future state, which by itself guarantees consensus safety of decisions on safe estimates. But there's a problem: such a protocol fails to satisfy the \emph{non-triviality} property of consensus. Non-triviality means that the protocol is able to choose between mutually exclusive values. In our context, non-triviality means that there are two protocol states $\sigma_1$ and $\sigma_2$ that are each safe on two mutually exclusive estimates. Two protocol states with mutually exclusive safe estimates cannot have a common future, but we just insisted that $\sigma_1 \cup \sigma_2$ would be such a common future. This contradiction means that we have not yet satisfied non-triviality, as claimed.
Instead, we must be certain that $\sigma_1$ and $\sigma_2$ have common a future \emph{only as long as there are less than $t$ Byzantine faults in $\sigma_1 \cup \sigma_2$}. This allows for states without shared protocol futures (allowing non-triviality) but still allows for consensus safety from our previous result (although now only as long as there are less than $t$ Byzantine faults).
So our next step is to present a process that counts ``the number of Byzantine faults'' that are evidenced in any given protocol state. In the final step we define a ``new version'' of our initial protocol by excluding states with more than $t$ such faults, using the process from the previous step.
And indeed, both of the protocols specified here have the property that the union of any pair of protocol states $\sigma_1$ and $\sigma_2$, $\sigma_1 \cup \sigma_2$, is a protocol state if and only if it does not have more than $t$ Byzantine faults. Thus, two nodes who decide on safe estimates have consensus safety if there is less than $t$ Byzantine faults, and all this required saying almost nothing about the estimator! :)
\section{Casper the Friendly Binary Consensus}
We now specify the Binary consensus protocol by first defining protocol messages and then defining the estimator (which maps sets of protocol messages to $0$ or $1$). We present a way to detect and count Byzantine faults and subsequently define Casper the Friendly Binary Consensus's ``protocol states'' as sets of messages that exhibit up to $t$ Byzantine faults. Then we define the protocol's ``state transitions'', and finally, we define binary estimate safety. These definitions satisfy those in the consensus safety proof for decisions on safe estimates.
The definition of ``protocol messages'' is parametric in a set of ``validator names'' $\mathcal{V}$, which are identified as the names of the consensus forming nodes.
Protocol messages have three parts. An ``estimate'' (a $0$ or a $1$), a ``sender'' (a validator name), and a ``justification''. The justification is itself a set of protocol messages. Validators use these protocol messages to update each other on their current estimates. Further, the estimate values are not arbitrary because a protocol message is ``valid'' only if the ``estimate'' is the result of applying the estimator on the message's ``justification''.
The definitions of the estimator and of validity appear later. For now, we denote the set of all possible protocol messages in the binary consensus pwill rotocol as $\mathcal{M}$, and define it as follows:
\begin{defn}[Protocol Messages, $\mathcal{M}$]
\begin{equation*}
\begin{split}
\mathcal{M}_0 &= \{0, 1\} \times V \times \{\emptyset\}\\
\mathcal{M}_n &= \{0, 1\} \times V \times \mathcal{P}(\bigcup_{i=0}^{n-1} \mathcal{M}_i)\\
\mathcal{M} &= \lim_{n \to \infty} \bigcup_{i=0}^{n} \mathcal{M}_i
\end{split}
\end{equation*}
\end{defn}
$\mathcal{M}_0$ is the ``base case'', the set of messages with ``null justifications''. $\mathcal{M}_n$ is the set of messages at ``height'' $n$, which have messages of height $n-1$ (and/or lower) in their justification. Note that messages $\mathcal{M}_0$ have height $0$. $\mathcal{P}$ denotes the ``power set'' function, which maps set to the set of all of its subsets, so $\mathcal{P}(\bigcup_{i=0}^{n-1} \mathcal{M}_i)$ denotes all sets of protocol messages at height $n-1$ or lower.
The estimator is a function that maps sets of protocol messages to $0$ or $1$, or a null value denoted by $\emptyset$:
\begin{equation*}
\begin{split}
\mathcal{E}:\mathcal{P}(\mathcal{M}) \to \{0, 1\} \cup \{\emptyset\}
\end{split}
\end{equation*}
With the property that $\mathcal{E}(\emptyset) = \emptyset$. A protocol message $m$ is then said to be ``valid'' if either $\mathcal{E}(J(m)) = \emptyset$ or $E(m) = \mathcal{E}(J(m))$. From now on, we assume that $\mathcal{M}$ only contains valid messages.\footnote{All protocol messages at height $0$ are valid because they have null justifications and $\mathcal{E}(\emptyset) = \emptyset$. Then we can find the valid protocol messages at height $1$ by applying the estimator to their justifications (which are sets of [valid] messages at height 0) for each message, only keeping valid messages. Similarly, we can find the valid protocol messages at height $n$ by applying the estimator to the justification of these messages (which are sets of valid messages at height $h < n$). We are thereby able to collect all valid protocol messages and restrict $\mathcal{M}.$}
But before we can define the estimator, we need a few more basic definitions. We define $E$, a ``helper function'' that picks out the ``estimate'' given in a protocol message:
$$
E(m) = e \iff m = (e, \_, \_)
$$
Similarly, we define $V$ as a function that picks out the ``sender'', and $J$ as a function that picks out the ``justification''.
We say that message $m_1$ is ``a dependency'' of message $m_2$ and we write $m_1 \prec m_2$ if $m_1$ is in the justification of $m_2$, or if $m_1$ is in the justification of one of the messages in $m_2$'s justification, or if it is in the justification of a message in the justification of a message in the justification of $m_2$...
We also call $m_1$ a dependency of $m_2$ if $m_1 = m_2$:
\begin{defn}[dependency, $\prec$]
\begin{equation*}
\begin{split}
m_1 \prec m_2 \iff & m_1 = m_2 \text{ or } \exists m' \in J(m_2) \hspace{1mm} . \hspace{1mm} m_1 \prec m'
\end{split}
\end{equation*}
\end{defn}
We define ``the dependencies'' of a message $m$ as all of the messages $m'$ such that $m' \prec m$. These are all the messages that can be accessed in the justifications, or in the justification of messages in justifications... etc.
\begin{equation*}
\begin{split}
D(m) = &\{m\}\cup \bigcup_{m' \in J(m)} D(m')
\end{split}
\end{equation*}
This definition can be extended in a natural way to define the dependencies of a set of messages (by taking the union of the dependencies of the individual messages).
If $m_1 \prec m_2$, then we also say that $m_2$ is ``later'' than $m_1$ and write $m_2 \succ m_1$.
We now have the language to talk about the latest message from a sender $v$ out of a set of messages $M$, which we denote as $L(v, M)$:
\begin{defn}[Latest message]
\begin{equation*}
\begin{split}
m \in L(v, M) \iff & \nexists m' \in D(M) \text{ such that } V(m') = v \text{ and } m' \succ m
\end{split}
\end{equation*}
\end{defn}
Latest messages are critical to defining the estimator, which returns $0$ if ``more'' of the nodes have latest messages with estimate $0$ than with estimate $1$. We use ``weights'' for nodes to measure which estimate has ``more'' consensus forming nodes, implemented by a map from validator names to positive real numbers. We do this without loss of generality (because it's possible that all weights are equal).
$$
W:V \to \mathbb{R}_+
$$
Now we define the ``score'' of an estimate $e$ in a set of messages $M$ as the total weight of validators with latest messages with estimate $e$.
\begin{defn}[Score of a binary estimate]
\begin{align}
\text{Score}(e, M) = \sum_{\substack{v \in V \\ \text{such that } m \in L(v,M) \\ \text{with } E(m) = e}} W(v)
\end{align}
\end{defn}
Finally, we define the estimator for the Binary consensus, it returns the estimate with the highest score, if there is one, otherwise it returns $\emptyset$.
\begin{defn}[Binary estimator]
\begin{align}
\mathcal{E}(M) &= 0 &\text{ if } \text{Score}(0, M) > \text{Score}(1, M), \\
\mathcal{E}(M) &= 1 &\text{ if } \text{Score}(1, M) > \text{Score}(0, M), \\
\mathcal{E}(M) &= \emptyset &\text{ if } \text{Score}(1, M) = \text{Score}(0, M)
\end{align}
\end{defn}
At this stage we have protocol messages and an estimator. If we can define a method for counting Byzantine faults from a set of protocol messages, then we can give the set of protocol states with their state transitions for a binary consensus protocol that tolerates $t$ Byzantine faults.
Each protocol message $m$ is supposed to represent a record of messages that were seen by validator $V(m)$. Any ``correct'' node has a growing record of messages that they have received and sent. Specifically, a corret node is never the sender of a pair of messages $m_1$ and $m_2$ such that neither $m_1 \prec m_2$ nor $m_1 \succ m_2$. We call such a pair of messages ``an equivocation''.
\begin{defn}[Equivocation]
\begin{align}
Eq(m_1, m_2) \iff V(m_1) = V(m_2) \text{ and } m_1 \nsucc m_2 \text{ and } m_1 \nprec m_2
\end{align}
\end{defn}
A sender $v$ with an equivocation in a set of protocol messages $M$, is said to be ``Byzantine'', or to have exhibited a ``Byzantine fault'' in $M$.
\begin{defn}[Byzantine faulty node]
\begin{align}
B(v,M) \iff \exists m_1, m_2 \in D(M) \text{ such that } v = V(m_1) \land Eq(m_1, m_2)
\end{align}
\end{defn}
We then define the Byzantine nodes visible in $M$ as
$$
B(M) = \{v \in V: B(v,M)\}
$$
The weight of Byzantine faults evidenced in a set of messages $M$ is the sum of the weights of validators who are Byzantine in $M$.
\begin{defn}[Fault weight]
\begin{align}
F(M) = \sum_{v \in B(M)} W(v)
\end{align}
\end{defn}
We now define our protocol states $\Sigma_t \subset \mathcal{P}(\mathcal{M})$ as the sets of protocol messages that exhibit less than $t$ faults, by weight:
\begin{defn}[Protocol States]
\begin{align}
\Sigma_t = \left\{\sigma \subseteq \mathcal{M}: F(\sigma) \leq t \right\}
\end{align}
\end{defn}
And we also define ``protocol executions'' as directed paths between states in $\Sigma_t$ such that an execution from $\sigma \in \Sigma_t$ to $\sigma' \in \Sigma_t$ exists if and only if $\sigma \subseteq \sigma'$. We write the existence of such a state transition as $\sigma \to \sigma'$.
\begin{defn}[Protocol Executions]
\begin{align}
\forall \sigma, \sigma' \in \Sigma_t \hspace{3mm} : \sigma \to \sigma' \iff \sigma \subseteq \sigma'
\end{align}
\end{defn}
Protocol executions compose ($\sigma \to \sigma' \land \sigma' \to \sigma'' \implies \sigma \to \sigma''$) because the improper subset relation ($\subseteq$) composes.
We can now give the definition of estimate safety for the Binary Consensus, for an estimate $e$ in a protocol state $\sigma$.
\begin{defn}[Binary Estimate Safety]
$$
S_t(e, \sigma) \iff \forall \sigma' \in \Sigma_t: \sigma \to \sigma',\hspace{1.5mm} e = \mathcal{E}(\sigma')
$$
\end{defn}
Because this construction satisfies the terms of our consensus safety proof, we know that decisions on such safe estimates in this protocol are consensus safe (if there are less than $t$ Byzantine faults (by weight)).
We have yet to discuss how nodes running the binary consensus protocol can detect when they are in a state with a safe estimate. We discuss this following the specification of blockchain consensus protocol because we detect estimate safety in the same way for both protocols.
Now that we've covered the binary consensus protocol, it is much simpler to specify the blockchain consensus protocol.
\section{Casper the Friendly Ghost}
The specification of Casper the Friendly Ghost proceeds along \emph{very} similar lines as Casper the Friendly Binary Consensus. In fact, we are able to reuse most of our definitions without any modification.
We again first define the set of all protocol messages and then the estimator, which this time is the Greedy Heaviest-observed Sub-tree (GHOST) ``fork choice rule''. Then, we define protocol states as sets of messages which exhibit up to $t$ Byzantine faults (by weight), and then we define the protocol's ``state transitions''. Finally, we define block estimate safety. These definitions satisfy those in the consensus safety proof for decisions on safe estimates.
Protocol messages are called ``blocks'' and have the same three components as the messages in the binary consensus protocol; an estimate, a sender and a justification. The estimate is a block, called ``the prevblock'' or ``the parent block''. For valid messages, the estimate is the block on the head of the blockchain chosen by the GHOST fork choice rule in the justification. The ``sender'' (a validator name) field is defined precisely as before. Finally, the justification is again simply a set of protocol messages.
Formally, in Casper the Friendly Ghost we have protocol messages, $\mathcal{M}$, with the following form (again parametric in a set of validator names, $\mathcal{V}$):
\begin{defn}[Blocks]
\begin{equation*}
\begin{split}
&\text{Genesis Block} = \{\emptyset\}\\
&\mathcal{M}_0 = \{\text{Genesis Block}\} \times V \times \{\text{Genesis Block}\}\\
&\mathcal{M}_n = \bigcup_{i=0}^{n-1} \mathcal{M}_i \times V \times \mathcal{P}(\bigcup_{i=0}^{n-1} \mathcal{M}_i)\\
&\mathcal{M} = \{\text{Genesis Block}\} \cup \lim_{n \to \infty} \bigcup_{i=0}^{n} \mathcal{M}_i
\end{split}
\end{equation*}
\end{defn}
The definitions of the ``helper functions'' ($E$, $V$, and $J$), ``dependency'', ``later'', ``latest messages'', and ``validator weights'' given in the previous section binary consensus are defined \emph{precisely} in the same way here. We therefore use them without giving the definitions again.
We do need a couple of new terms, though, to define the fork choice rule. We write $b_1 \downarrow b_2$ and say that block $b_1$ is ``in the blockchain'' of block $b_2$, if
\begin{defn}[Blockchain membership, $b_1 \downarrow b_2$]
\begin{align}
b_1 \downarrow b_2 &\iff b_1 = b_2 \text{ or } b_1 \downarrow E(b_2)
\end{align}
\end{defn}
We define the ``score'' of a block $b$ given a set of protocol messages $M$ as the total weight of validators with latest blocks $b'$ such that $b \downarrow b'$.
\begin{defn}[Score of a block]
\begin{align}
\text{Score}(b, M) = \sum_{\substack{v \in V \\ m \in L(v,M) \\ b \downarrow E(m)}} W(v)
\end{align}
\end{defn}
The ``children'' of a block $b$ in a set of protocol messages $M$ are the blocks with $b$ as their prevblock.
$$
C(b,M) = \{b' \in M : E(b') = b\}
$$
We now have the language required to define the estimator for the blockchain consensus, the Greedy Heaviest-Observed Sub-Tree rule!
\begin{defn}[The Greedy Heaviest-Observed Sub-Tree (GHOST) fork-choice rule, $\mathcal{E}$]
\end{defn}
\begin{algorithm}[H]
\KwData{A set of blocks, $M$}
\KwResult{The block at the head of the fork choice}
$b$ = Genesis Block
\While{$b$ has children ($C(b,M)$ is nonempty)}{
scores = dict()
\For{each child of block $b$, $b' \in C(b,M)$}{
scores[$b'$] = $\text{Score}(b', M)$
}
\eIf{scores has a unique maximum}{
$b$ = argmax(scores)
}{
$b$ = the max score block with the lowest hash
}
}
\Return{b}
\caption{The Greedy Heaviest-Observed Sub-tree Fork-choice rule, $\mathcal{E}$}
\end{algorithm}
We assume that ``hash'' has the property that out of any set of blocks, only one has the lowest hash. Using the hashes of blocks to eliminate ``ties'' means that the estimator for the blockchain consensus never outputs an exception. Previously the binary estimator return $\emptyset$ when $0$ and $1$ had the same score. This means that a message $m$ is valid if $E(m) = \mathcal{E}(J(m))$, and just as in the binary consensus we insist that all the blocks are valid. \footnote{Following the process decribed in the footnote about excluding invalid messages from the binary consensus.}
``Equivocation'', ``Byzantine faulty'', ``fault weight'', ``protocol states'', and ``protocol executions'' are defined here in \emph{precisely} the same way as in the binary consensus. We therefore do not give the definitions again.
We can now give the definition of estimate safety for Casper the Friendly Ghost, for a block $b$ in a protocol state $\sigma$.
\begin{defn}[Blockchain Estimate Safety]
$$
S_t(b, \sigma) \iff \forall \sigma' \in \Sigma_t: \sigma \to \sigma',\hspace{1.5mm} b \downarrow \mathcal{E}(\sigma')
$$
\end{defn}
Because this construction satisfies the terms of our consensus safety proof, we know that decisions on safe estimates in this protocol are consensus safe (if there are less than $t$ Byzantine faults (by weight)).
We now present a mechanism that nodes can use to detect which of their estimates are safe in both the binary and the blockchain consensus.
\section{A Simple Safety Oracle}
Estimate safety is parametric in some protocol state $\sigma$ and is a property of all its future protocol states. The challenge with estimate safety is that there are (at least in our cases) an infinite number of possible future protocol states, yet nodes somehow need to make a determination about whether or not an estimate is safe in a finite (ideally very short) amount of time.
Estimate safety is also parametric in a value of the estimate which is somehow invariant in the estimator $\mathcal{E}$ over these future states. We refer to the estimate whose safety is being determined as ``the candidate estimate.''
An ``ideal adversary'' returns an ``attack'', a future protocol state $\sigma'$ such that $\sigma \to \sigma'$, with an estimator $\mathcal{E}(\sigma')$ that ``disagrees'' with the candidate estimate if and only if such a protocol state exists in $\Sigma_t$. We might imagine that such an adversary would be strategic about which possible future states they search. An ``ideal safety oracle'' would indicate safety whenever the ideal adversary fails to find an attack.
If we can detect \emph{only some} of the circumstances in which the ideal adversary fails to find an attack, then we can construct a safety oracle which is able to detect safety in some of the states with estimate safety. Due to efficiency considerations, the cases may be available enough for it to be useful in an implementation even though it may not be an ideal safety oracle.
We identify such a set of circumstances. To discuss more generally, we denote ``agreement'' between estimate $e$ and estimate $e'$ as $e \equiv e'$. This correspond to $e = e'$ in the binary consensus, and $e \downarrow e'$ in the blockchain consensus. Disagreement will be denoted with $\not\equiv$.
We say that validator $v_i$ ``sees validator $v_j$ agreeing with estimate $e$ in a set of protocol messages $M$'' if:
\begin{itemize}
\item $v_i$ has exactly one latest message in $M$ (we are denoting this message as $L(v_i, M)$)
\item $v_j$ has exactly one latest message in the justification of $v_i$'s latest message, $J(L(v_i, M))$ (which we denote as $L(v_j, J(L(v_i, M))))$
\item This message's estimate agrees with $e$, i.e. $E(L(v_j, J(L(v_i, M))))) \equiv e$
\end{itemize}
\begin{defn}[$v_i$ sees $v_j$ agreeing with $e$ in $M$]
$$
v_i \xrightarrow[\text{$M$}]{\text{$\equiv, e$}} v_j \iff E(L(v_j, J(L(v_i, M)))) \equiv e
$$
\end{defn}
And we say that a validator $v_i$ ``can see $v_j$ disagreeing with estimate $e$ in a set of protocol messages $M$'' if:
\begin{itemize}
\item $v_i$ has exactly one latest message in $M$, $L(v_i, M)$
\item $v_j$ has exactly one latest message in the justification of $v_i$'s latest message, $J(L(v_i, M))$ (which we denote as $L(v_j, J(L(v_i, M))))$
\item $v_j$ has a ``new latest message for $v_i$'' $m \in M$ such that $m \succ L(v_j, J(L(v_i, M))))$
\item And this $m$ disagrees with $e$, $E(m) \not\equiv e$
\end{itemize}
\begin{defn}[$v_i$ can see $v_j$ disagreeing with $e$ in $M$]
$$
v_i \xRightarrow[\text{$M$}]{\text{$\not\equiv, e$}} v_j \iff \exists m \in M : V(m) = v_j \land m \succ L(v_j, J(L(v_i, M)))) \land E(m) \not\equiv e
$$
\end{defn}
A set of non-Byzantine nodes in $M$ \emph{who each mutually see each other agreeing with $e$ in $M$ and also mutually can't see each other disagreeing with $e$ in $M$} are called an ``$e$-clique'' in $M$.
Our aim is to show that if there is an $e$-clique in $M$ with total weight $W'$, and $2*W' > \sum_{v\in V} W(v)$, then $e$ is safe for the protocol with states $\Sigma_t$ for $t = 0$. We won't give a rigorous proof, but the idea is simple enough. If nodes in an $e$-clique see each other agreeing on $e$ and can't see each other disagreeing on $e$, then there does not exist any new message from inside the clique that will cause them to assign lower scores to $e$. Further, if the clique has more than half of the validators by weight, then no messages external to the clique can raise the scores these validators assign to a competing estimate to be higher than the score they assign to $e$. Messages from senders who are inside or outside the clique therefore cannot change the estimates of senders inside the clique, and the ideal adversary will necessarily fail.
We can also show that if $e$-clique in $M$ with total weight $W'$, and $2*W' > \sum_{v\in V} W(v)$, then $e$ is safe as long as $2*W' - \sum_{v\in V} W(v) \leq t - F(M)$, but we leave this for a future draft of this work.
We present the pseudocode for the ``clique oracle'' that uses this result to detect estimate safety:
\begin{algorithm}[H]
\KwData{An estimate $e$, a set of messages $M \in \Sigma_t$}
\KwResult{True or False, an indicator when $e$ is safe in $M \in \Sigma_t$}
$N$ = a fully connected network with undirected edges and validator names $V$ as nodes
\For{each non-Byzantine validator, $v_i \in V$}{
\For{each non-Byzantine validator, $v_j \in V$}{
\If{$v_i$ doesn't see $v_j$ agreeing with $e$ in $M$ (not $v_i \xrightarrow[\text{$M$}]{\text{$\equiv, e$}} v_j$)}{
$N$.remove\_edge($(v_i, v_j)$)
}
\If{$v_i$ can see $v_j$ disagreeing with $e$ in $M$ ($v_i \xRightarrow[\text{$M$}]{\text{$\not\equiv, e$}} v_j$)}{
$N$.remove\_edge($(v_i, v_j)$)
}
}
}
$N'$ = $N$.maximum\_weight\_fully\_connected\_subcomponent(weights=$W$)
clique\_weight = $\sum_{v \in N'.nodes} W(v)$
total\_weight = $\sum_{v \in V} W(v)$
\If{2*clique\_weight $\leq$ total\_weight}{
\Return{False}
}
\If{2*clique\_weight $>$ total\_weight}{
initial\_fault\_weight = $F(M)$ (this will be $\leq t$ because $M \in \Sigma_t$)
fault\_tolerance = 2*clique\_weight - total\_weight
\eIf{fault\_tolerance + initial\_fault\_weight $>$ $t$}
{
\Return{True}
}{
\Return{False}
}
}
\caption{The ``Clique Oracle'', $S_t$}
\end{algorithm}
Now that we have an implementable safety oracle, we can equip nodes in both Casper the Friendly Binary Consensus and in Casper the Friendly Ghost with the ability to detect estimate safety. This allows nodes to \emph{actually} rather than \emph{only hypothetically} make (consensus safe) decisions on safe estimates.
\section{Subjective Fault Tolerance Thresholds}
The consensus safety proof can be adapted to discuss the consensus safety of decisions on safe estimates by nodes who are running any of these ``correct-by-construction'' consensus protocols \emph{at different levels of fault tolerance}.
One node can execute the protocol in $\Sigma_{t_1}$ while another node can execute in $\Sigma_{t_2}$. Their decisions (which happen only on safe estimates, of course) have consensus safety as long as the union of their states exhibits less than the smallest of $t_1$ and $t_2$ faults (by weight).
This is because the protocol states in these different protocols are identical, except for the fact that one of them also includes protocol states that exhibit even more Byzantine faults than the other. If for example $t_1 < t_2$, then $\Sigma_{t_1} \subset \Sigma_{t_2}$. This means a node at $\sigma_2 \in \Sigma_{t_2}$ shares a common future with a node at $\sigma_1 \in \Sigma_{t_1}$ as long as it is not in a state $\sigma_2$ such that $F(\sigma_1 \cup \sigma_2) > t_1$.
Removing fault tolerance thresholds from the protocol and making them, instead, a setting that each node can configure independently has a number of attractive properties. For one, an attacker may not know the fault tolerance threshold of its targets. There are also economic benefits, but these are out of scope of this paper.\footnote{Briefly, removing in-protocol fault tolerance thresholds allows every node to marginally contribute to consensus (since more fault tolerance may allow more nodes to find safety) and therefore have a positive contribution to any cartel (and thus it would not be in the cartel's interest to censor them). It also removes focal points for cartelization.}
\section{Casper the Friendly Ghost with Validator Rotation}
We can define a modified version of Casper the Friendly Ghost which allows for dynamically changing sets of consensus forming nodes (and/or their weights). The protocol specification works as normal, so we are lighter on the details.
Block structures are modified so that the justifications also include a weights map.
\begin{defn}[Blocks]
\begin{equation*}
\begin{split}
&\text{Genesis Block} = \{\emptyset\} \times \{\emptyset\} \times (\{\emptyset\} \times \{W_{genesis}\})\\
&\mathcal{M}_0 = \{\text{Genesis Block}\} \times V \times (\{\text{Genesis Block}\} \times \mathcal{W})\\
&\mathcal{M}_n = \bigcup_{i=0}^{n-1} \mathcal{M}_i \times V \times (\mathcal{P}(\bigcup_{i=0}^{n-1} \mathcal{M}_i) \times \mathcal{W}))\\
&\mathcal{M} = \{\text{Genesis Block}\} \cup \lim_{n \to \infty} \bigcup_{i=0}^{n} \mathcal{M}_i
\end{split}
\end{equation*}
\end{defn}
We use $\mathcal{W}$ to represent the set of all weights mappings $W:V \to \mathbb{R}_+$
We redefine a block's ``score'' to use the weights in the parent block. The score, remember, is used to by the GHOST fork choice rule choose between children of some block. Those children (naturally) have the same parent, and therefore will have scores determined by the latest messages from the same validators.
\begin{defn}[Score of a block, for Casper the Friendly Ghost with validator rotation]
\begin{align}
\text{Score}(b, M) = \sum_{\substack{v \in V \\ m \in L(v,M) \\ b \downarrow E(m)}} J(E(b)).W(v)
\end{align}
\end{defn}
Using ```$J(m).W$'' to pick out the weights from the justification of $m$.
The rest of the definitions in the protocol remain completely identical (including the estimator, the protocol states/transitions, and the safety oracle), and therefore are not restated. We have therefore specified Casper the Friendly Ghost with validator rotation, a consensus protocol which tolerates up to $t$ Byzantine faults.\footnote{We allowed completely unrestrained changes in the validator set between any block and any of its children. This means that while we always have estimate safety unless there are $t$ or more faults for nodes running $\Sigma_t$, we have not restricted the total sum of the weights to be constant (or even greater than $t$). In practice, we either restrict the sum of the weights to be constant or redefine $t$ so that it refers to a proportion of the weight.}
\section{Liveness Considerations}
Traditionally, we would like to show that the protocol ``has liveness'', i.e. that nodes running the consensus protocol \emph{eventually} decide on a value. For us, the corresponding guarantee is that nodes \emph{eventually} detect that they have a safe estimate.
FLP impossibility shows that it is impossible for consensus protocols like ours (which don't use non-determinism or cryptography) to be live in an ``asynchronous network,'' which is to say, without making assumptions about the timing of message propagation (or the order of message arrival)[CITE].
We have not yet made any synchrony assumptions of any kind, which is why the consensus protocols given here are asynchronously safe. Moreover, we have not said anything about when nodes \emph{should} send protocol messages. We have instead imposed relatively loose constraints on the protocol executions that nodes can take (they can receive messages and move to any state $\sigma' \supset \sigma$ from $\sigma$, as long as $\sigma'$ does not evidence too many Byzantine faults).
This absence of a specified strategy for how validators should make blocks means that we cannot at the moment give a liveness proof. However, we present see some experimental observations where estimate safety is accomplished in the following section. These protocol executions correspond to message arrival orders which are live, and we can therefore construct reliable strategies for achieving liveness as long as nodes can coordinate timeouts in order to (eventually) produce the desired ``shape'' of protocol messages. In a synchronous or partically synchonous network (i.e. one where there's a known or unknown bound on the message arrival time) timeout coordination is (at least eventually) possible.
Nonetheless, liveness considerations are considered largely out of scope, and should be treated in future work.
\pagebreak
\section{Experimental Observations}
Early prototypes of both Casper the Friendly Binary Consensus and Casper the Friendly Ghost have been implemented, and the following graphics represent observations of executions of these protocols with various message passing orders.\footnote{The code is available at https://github.com/ethereum/casper-cbc}
In all of these representations, each message is represented by a node in the graph. Messages from the same validator are vertically aligned. And later messages are always displayed higher than their dependencies.
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\textwidth]{3binary}
\caption{A Binary consensus protocol execution. Dotted lines are messages included in the justification of the later message. The label on the nodes represents the estimate of the message. A message is coloured if it has achieved some amount of Byzantine fault tolerant estimate safety, accoring to a clique oracle given its justification. The darker the colour, the more faults are tolerated by the estimate}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\textwidth]{3nodeblockchain-fix}
\caption{Blockchain protocol execution with 3 validators, $v_0, v_1, v_2$. Each node labeled $0$ is the first message from that validator, and the nodes verically aligned above each validator represent messages made by that validator. Dotted black lines are messages included in the justification of the later message. Blue lines represent the forkchoices of the validators given by their latest blocks. Solid grey lines are prevblock pointers (that aren't blue because they are no longer the validator's forkchoice). The red line is the result of applying GHOST to the set of messages displayed here.}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\textwidth]{blockchainsafety}
\caption{In this execution of the blockchain consensus protocol, we observe some safe blocks. They are colour coded the same way as in the earlier, however this time they represent the blocks that are seen to be safe from the view that includes all of the nodes. In contrast, in the binary consensus we displayed safety that was detected locally.}
\end{figure}
\begin{figure}[h!]
\centering
\includegraphics[width=0.5\textwidth]{roundrobin}
\caption{Finally, in this execution of the blockchain consensus protocol where the validators are able to pass blocks around in a ``round-robin'' configuration, we observe the $\mathcal{O}(1)$ messages received per (finalized) block. This is possible because each block contributes to the consensus safety of many blocks.}
\end{figure}
\section{Conclusion}
We gave a brief overview of the consensus safety proof that Casper the Friendly Ghost has been derived to satisfy (in a ``correct-by-construction'' manner). Then we defined a binary consensus protocol (Casper the Friendly Binary Consensus) that satisfies the terms of the proof and therefore benefits from the results. We then remarkably slightly modified the binary consensus protocol to give the blockchain based consensus protocol (which can be adopted for, or even termed as sequential state machine replication).
Then we further witnessed the power of the safety proof when we showed that we can remove the fault tolerance threshold from the protocol and implement validator rotation without making significant changes to the protocol. Finally, we saw (as advertised) that it is possible for Casper the Friendly Ghost to decide on blocks with consensus safety that tolerates $t$ Byzantine faults (in an asynchronous network) with $\mathcal{O}(1)$ messages per block.
We hope this work has been educational and will lead to the development of many interesting and useful consensus protocols.
\section{Acknowledgements}
I would like to thank Nate Rush and Danny Ryan for their hard work on getting the codebase ready for release at Devcon3, for their help on this (draft) paper. Thanks to Karl Floersch, who was the first developer to work on the codebase. I'd like to thank Greg Meredith for an introduction to the ``correct-by-construction'' approach to protocol design, as well as for helping formalize a lot of the ideas. Finally, I'd like to thank Vitalik Buterin, with whom I have collaborated on this research from its very early stages over three years ago.
\bibliographystyle{naturemag}
\bibliography{ethereum}
\end{document}

View File

@ -0,0 +1,144 @@
% make in the latest NIPS format (as of this writing, 2017)
\usepackage[nonatbib,final]{nips_2017}
%\usepackage[nonatbib,final]{nips_2017}
\usepackage{color}
\usepackage{graphicx}
\DeclareGraphicsExtensions{.pdf,.eps,.png,.jpg} % search for .pdf, then .eps, then .pngs, then .jpg
% look in these subdirectories for graphics referenced by \includegraphics
% each entry must end with a /
\graphicspath{{figs/}{figures/}{images/}{./}}
\newcommand*{\red}[1]{ \color{red} #1}
%\usepackage{tabularx}
\usepackage{url}
\usepackage{amsmath}
% this is for environments \subfigure and \subtable
\usepackage{subcaption}
% These packages are FORBIDDEN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\usepackage{lmodern} % messes up \textsc
%\usepackage{cite} % messes up NIPS
%\usepackage{fullpage} % messes up NIPS
%\usepackage{natbib} % messes up NIPS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{array} % replacement for eqnarray. Must be BEFORE \usepackage{arydshln}
\usepackage{units} % for \nicefrac{\alpha}{\beta}
\usepackage{amsthm} % for theorems
\newtheorem{definition}{Definition}
% text looks a little better
\usepackage{microtype}
\usepackage{wasysym}
\usepackage{textcomp, marvosym} % pretty symbols
\usepackage{booktabs} % for much better looking tables
% for indicator functions
\usepackage{dsfont}
% For automatic capitalizaton of section names, etc.
\usepackage{titlesec,titlecaps}
\Addlcwords{is with of the and in}
\Addlcwords{of the}
\Addlcwords{and}
\titleformat{\section}[block]{}{\normalfont\Large\bfseries\thesection.\;}{0pt}{\formatsectiontitle}
\newcommand{\formatsectiontitle}[1]{\normalfont\Large\bfseries\titlecap{#1}}
\titleformat{\subsection}[block]{}{\normalfont\large\bfseries\thesubsection.\;}{0pt}{\formatsubsectiontitle}
\newcommand{\formatsubsectiontitle}[1]{\normalfont\large\bfseries\titlecap{#1}}
% for pretty Euler script
% \usepackage[mathscr]{euscript}
% \usepackage{bold-extra}
%\usepackage{subfig}
\usepackage{float} % for \subfloat
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% More customizable Lists
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Better symbols custom enumerative lists, define any symbol you'd like
% \usepackage{enumitem}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Custom Symbols
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \xspace at the end of custom macros never screws up spacing.
\usepackage{xspace}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Abbreviations you'll always want
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand*{\TODO}[1]{{\centering {\small \sffamily \color{red} #1} \vskip10pt }}
\newcommand*{\todo}[1]{{\small \sffamily [{\color{red} #1}]}}
\newcommand*{\q}[1]{{\small \sffamily [{\color{blue} #1}]}}
\newcommand*{\fix}[1]{{\sffamily [{\textnormal{\color{red} #1}}]}}
%-----------------------------------------------------------------------------
% Cross references
%-----------------------------------------------------------------------------
% The following code defines how you make references to figures, tables, etc...
% It is defined in one place only, and can be modified for all references
% in the document at the same time.
% Instead of typing each time: "see Fig. \ref{myfig}" you can create a command
% \figref which will do the job. Then in text you only type \figref{myfig} and LaTeX
% will do the rest.
\newcommand{\tblref}[1]{Table~\ref{#1}}
%\renewcommand*{\figref}[1]{Fig.~\ref{#1}}
\renewcommand{\eqref}[1]{eq.~(\ref{#1})}
\newcommand{\Subref}[1]{(\subref{#1})}
\newcommand{\figref}[1]{Figure~\ref{#1}}
\newcommand{\Figref}[1]{Figure~\ref{#1}}
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}[theorem]{Lemma}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% for \sout{} for strikeout
% \usepackage[normalem]{ulem}
% for better manipulation of tables
\usepackage{makecell}
\renewcommand\theadfont{\bfseries}
%-----------------------------------------------------------------------------
% Misc symbols that I like
%-----------------------------------------------------------------------------
\newcommand*{\opname}[1]{\operatorname{#1}}
\renewcommand*{\to}{\rightarrow}
%%%%

View File

@ -0,0 +1,592 @@
@MISC{nakamoto,
TITLE = {Bitcoin: A Peer-to-Peer Electronic Cash Systems},
author = {Satoshi Nakamoto},
URL = {https://bitcoin.org/bitcoin.pdf},
YEAR = {2008},
Month = {11}
}
@misc{paxos,
title={Paxos Made Moderately Complex},
url={http://paxos.systems/},
journal={Paxos Made Moderately Complex}
}
@article{lamport_1998,
title={The part-time parliament},
volume={16},
DOI={10.1145/279227.279229},
number={2},
journal={ACM Transactions on Computer Systems},
author={Lamport, Leslie},
year={1998},
month={Jan},
pages={133169}
}
@INPROCEEDINGS{castro1999practical,
AUTHOR = {Miguel Castro and Barbara Liskov and et. al},
BOOKTITLE = {Proceedings of the Third Symposium on Operating Systems Design and Implementation},
EDITOR = {Paul J. Leach and Margo Seltzer},
LOCATION = {New Orleans},
MONTH = {February},
PAGES = {173--186},
TITLE = {Practical Byzantine fault tolerance},
VOLUME = {99},
YEAR = {1999},
}
@ARTICLE{eyal2013,
author = {Ittay Eyal and
Emin G{\"{u}}n Sirer},
title = {Majority is not Enough: Bitcoin Mining is Vulnerable},
journal = {CoRR},
volume = {abs/1311.0243},
year = {2013},
url = {http://arxiv.org/abs/1311.0243},
timestamp = {Wed, 07 Jun 2017 14:41:57 +0200},
biburl = {http://dblp.uni-trier.de/rec/bib/journals/corr/EyalS13},
bibsource = {dblp computer science bibliography, http://dblp.org}
}
@MISC{bitcoinwikipos,
TITLE = {Bitcoin Wiki: Proof of Stake, Cunicula's Implementation and Meni's implementation},
URL = {https://en.bitcoin.it/wiki/Proof_of_Stake#Cunicula.27s_Implementation_of_Mixed_Proof-of-Work_and_Proof-of-Stake},
YEAR = {2017},
}
@MISC{slasher,
AUTHOR = {Vitalik Buterin},
TITLE = {Slasher: A Punitive Proof-of-Stake Algorithm},
URL = {https://blog.ethereum.org/2014/01/15/slasher-a-punitive-proof-of-stake-algorithm/},
YEAR = {2014},
}
@ARTICLE{sompolinsky2013accelerating,
AUTHOR = {Sompolinsky, Yonatan and Zohar, Aviv},
JOURNALTITLE = {IACR Cryptology ePrint Archive},
NUMBER = {881},
TITLE = {Accelerating Bitcoin's Transaction Processing. Fast Money Grows on Trees, Not Chains.},
VOLUME = {2013},
YEAR = {2013},
}
@MISC{kwon2014tendermint,
AUTHOR = {Kwon, Jae},
TITLE = {Tendermint: Consensus without mining},
URL = {https://tendermint.com/static/docs/tendermint.pdf},
YEAR = {2014},
}
@ARTICLE{monderer1996potential,
AUTHOR = {Monderer, Dov and Shapley, Lloyd S},
JOURNALTITLE = {Games and economic behavior},
NUMBER = {1},
PAGES = {124--143},
TITLE = {Potential games},
VOLUME = {14},
YEAR = {1996},
}
@MISC{vasin2014blackcoin,
AUTHOR = {Vasin, Pavel},
TITLE = {Blackcoin's proof-of-stake protocol v2},
URL = {http://blackcoin.co/blackcoin-pos-protocol-v2-whitepaper.pdf},
YEAR = {2014},
}
@ARTICLE{king2012ppcoin,
AUTHOR = {King, Sunny and Nadal, Scott},
JOURNALTITLE = {self-published paper, August},
TITLE = {Ppcoin: Peer-to-peer crypto-currency with proof-of-stake},
URL = {https://decred.org/research/king2012.pdf},
VOLUME = {19},
YEAR = {2012},
}
@INPROCEEDINGS{bentov2016pos,
AUTHOR = {Iddo Bentov and Ariel Gabizon and Alex Mizrahi},
BOOKTITLE = {International Conference on Financial Cryptography and Data Security},
EDITOR = {Radu Sion},
ORGANIZATION = {Springer},
PAGES = {142--157},
TITLE = {Cryptocurrencies without proof of work},
YEAR = {2016},
}
@INPROCEEDINGS{selfishminingBTC,
AUTHOR = {Ayelet Sapirshtein and Yonatan Sompolinsky and Aviv Zohar},
BOOKTITLE = {International Conference on Financial Cryptography and Data Security},
EDITOR = {Radu Sion},
ORGANIZATION = {Springer},
PAGES = {515--532},
TITLE = {Optimal selfish mining strategies in bitcoin},
YEAR = {2016},
}
@MISC{minslashing,
AUTHOR = {Vitalik Buterin},
DAY = {02},
MONTH = {03},
TITLE = {Minimal Slashing Conditions},
URL = {https://medium.com/@VitalikButerin/minimal-slashing-conditions-20f0b500fc6c},
YEAR = {2017},
}
@MISC{truebit,
AUTHOR = {Jason Teustch and Christian Reitwießner},
DAY = {07},
MONTH = {03},
TITLE = {A scalable verification solution for blockchains},
URL = {https://truebit.io/},
YEAR = {2017},
}
@ARTICLE{ostrom2002,
AUTHOR = {Ostrom, Elinor},
JOURNALTITLE = {unpublished paper},
PAGES = {15},
TITLE = {Type of good and collective action},
YEAR = {2002},
}
@MISC{barder14,
AUTHOR = {Alice Lépissier and Owen Barder},
DAY = {08},
MONTH = {09},
TITLE = {A Global Carbon Tax or Cap-and-Trade? Part 1: The Economic Arguments},
URL = {https://www.cgdev.org/blog/global-carbon-tax-or-cap-and-trade-part-1-economic-arguments},
YEAR = {2014},
}
@MISC{braveICO,
AUTHOR = {Jon Southurst},
DAY = {31},
MONTH = {05},
TITLE = {BAT Token Sale Causes Hours of Ethereum Network Delays},
URL = {http://www.bitsonline.com/bat-sale-ethereum-network-delays/},
YEAR = {2017},
}
@REPORT{ibm2011,
AUTHOR = {Richard F. Freitas and Joe Slember and Wayne Sawdon and Lawrence Chiu},
DAY = {22},
INSTITUTION = {IBM},
MONTH = {07},
TITLE = {GPFS Scans 10 Billion Files in 43 Minutes},
TYPE = {techreport},
URL = {https://domino.research.ibm.com/library/CyberDig.nsf/papers/4A50C2D66A1F90F7852578E3005A2034/$File/rj10484.pdf},
YEAR = {2011},
}
@MISC{infura,
AUTHOR = {Consensys},
DAY = {01},
MONTH = {06},
TITLE = {INFURA},
URL = {https://infura.io},
YEAR = {2017},
}
@MISC{spectrumetcalfe,
AUTHOR = {Bob Briscoe, Andrew Odlyzko, and Benjamin Tilly},
DAY = {01},
MONTH = {06},
TITLE = {Metcalfe's Law is Wrong},
URL = {http://spectrum.ieee.org/computing/networks/metcalfes-law-is-wrong},
YEAR = {2006},
}
@MISC{env-econ,
AUTHOR = {Tim Haab},
DAY = {23},
MONTH = {06},
TITLE = {The long run elasticity of demand for gas},
URL = {http://www.env-econ.net/2008/06/the-long-run-el.html},
YEAR = {2008},
}
@INPROCEEDINGS{cornell-position,
AUTHOR = {Kyle Croman and Christian Decker and Ittay Eyal and Adem Efe Gencer and Ari Juels},
BOOKTITLE = {3rd Workshop on Bitcoin and Blockchain Research},
EDITOR = {Sarah Meiklejohn and Jeremy Clark},
ORGANIZATION = {International Financial Cryptography Association},
TITLE = {On Scaling Decentralized Blockchains},
URL = {http://fc16.ifca.ai/bitcoin/papers/CDE+16.pdf},
YEAR = {2017},
}
@MISC{medium-codetract,
AUTHOR = {CodeTract},
DAY = {01},
MONTH = {06},
TITLE = {BAT ICO, USD 35 million in 24 seconds, gas and gasPrice},
URL = {https://medium.com/@codetractio/bat-ico-usd-35-million-in-24-seconds-gas-and-gasprice-6cdde370a615},
YEAR = {2017},
}
@MISC{vitalik-uncle-rate,
AUTHOR = {Vitalik Buterin},
DAY = {31},
MONTH = {10},
TITLE = {Uncle Rate and Transaction Fee Analysis},
URL = {https://blog.ethereum.org/2016/10/31/uncle-rate-transaction-fee-analysis/},
YEAR = {2016},
}
@MISC{vitalik-twitter1,
AUTHOR = {Vitalik Buterin},
DAY = {03},
MONTH = {06},
TITLE = {Tweet},
URL = {https://twitter.com/VitalikButerin/status/871218258212290560},
YEAR = {2017},
}
@MISC{reddit-rec-miners,
AUTHOR = {Hudson Jameson},
DAY = {31},
MONTH = {05},
TITLE = {Recommendations to miners to change gas limit and gas price settings},
URL = {https://www.reddit.com/r/ethereum/comments/6ehp60/recommendations_to_miners_to_change_gas_limit_and/},
YEAR = {2017},
}
@MISC{coindesk-btc-txn-fee,
AUTHOR = {Danny Bradbury},
DAY = {28},
MONTH = {02},
TITLE = {Bitcoin Transaction Fees To Be Slashed Tenfold},
URL = {http://www.coindesk.com/bitcoin-transaction-fees-slashed-tenfold/},
YEAR = {2014},
}
@MISC{vitalik-coord,
AUTHOR = {Vitalik Buterin},
DAY = {08},
MONTH = {05},
TITLE = {Engineering Security Through Coordination Problems},
URL = {http://vitalik.ca/general/2017/05/08/coordination_problems.html},
YEAR = {2017},
}
@MISC{etherchaingas,
AUTHOR = {Etherchain},
DAY = {01},
MONTH = {May},
TITLE = {Economic gas price estimation},
URL = {https://etherchain.org/statistics/gasPrice},
YEAR = {2017},
}
@MISC{40years,
AUTHOR = {Karl Rupp},
DAY = {25},
MONTH = {06},
TITLE = {40 Years of Microprocessor Trend Data},
URL = {https://www.karlrupp.net/2015/06/40-years-of-microprocessor-trend-data/},
YEAR = {2015},
}
@MISC{wiki:runaway,
AUTHOR = {Wikipedia},
NOTE = {[Online; accessed 5-May-2017]},
TITLE = {Runaway climate change --- Wikipedia{,} The Free Encyclopedia},
URL = {https://en.wikipedia.org/w/index.php?title=Runaway_climate_change&oldid=776345569},
YEAR = {2017},
}
@MISC{wood2014ethereum,
AUTHOR = {Gavin Wood},
TITLE = {Ethereum: A Secure Decentralized Generalized Transaction Ledger},
URL = {http://yellowpaper.io/},
YEAR = {2014},
}
@ARTICLE{weitzman1974prices,
AUTHOR = {Martin L Weitzman},
JOURNALTITLE = {The review of economic studies},
NUMBER = {4},
PAGES = {477--491},
TITLE = {Prices vs. quantities},
VOLUME = {41},
YEAR = {1974},
}
@MISC{bip:141,
AUTHOR = {Eric Lombrozo, Johnson Lau, and Pieter Wuille},
DAY = {21},
MONTH = {12},
TITLE = {BIP 141: Segregated Witness},
URL = {https://github.com/bitcoin/bips/blob/master/bip-0141.mediawiki},
YEAR = {2015},
}
@BOOK{knight1921risk,
AUTHOR = {Knight, Frank H},
PUBLISHER = {Courier Corporation},
TITLE = {Risk, uncertainty and profit},
YEAR = {1921},
}
@INPROCEEDINGS{fc17ai,
AUTHOR = {McCorry, Patrick and Shahandashti, Siamak F. and Hao, Feng},
BOOKTITLE = {Proceedings of Financial Cryptography and Data Security},
EDITOR = {Rainer Böhme and Tatsuaki Okamoto},
ORGANIZATION = {International Financial Cryptography Association},
TITLE = {A Smart Contract for Boardroom Voting with Maximum Voter Privacy},
URL = {http://fc17.ifca.ai/preproceedings/paper_80.pdf},
YEAR = {2017},
}
@ARTICLE{vigna13fibonacci,
AUTHOR = {Sebastiano Vigna},
JOURNALTITLE = {CoRR},
TITLE = {Fibonacci Binning},
URL = {http://arxiv.org/abs/1312.3749},
VOLUME = {abs/1312.3749},
YEAR = {2013},
}
@MISC{wiki:ricochet,
AUTHOR = {Wikipedia},
NOTE = {[Online; accessed 28-February-2017]},
TITLE = {Ricochet (software) --- Wikipedia{,} The Free Encyclopedia},
URL = {https://en.wikipedia.org/w/index.php?title=Ricochet_(software)&oldid=755044411},
YEAR = {2016},
}
@ARTICLE{darknet,
AUTHOR = {Manlio De Domenico and Alex Arenas},
DOI = {10.1103/PhysRevE.95.022313},
ISSUE = {2},
JOURNALTITLE = {Phys. Rev. E},
MONTH = {Feb},
PAGES = {022313},
TITLE = {Modeling structure and resilience of the dark network},
URL = {http://link.aps.org/doi/10.1103/PhysRevE.95.022313},
VOLUME = {95},
YEAR = {2017},
}
@ARTICLE{borgatti1998network,
AUTHOR = {Borgatti, Stephen P and Jones, Candace and Everett, Martin G},
JOURNALTITLE = {Connections},
NUMBER = {2},
PAGES = {27--36},
TITLE = {Network measures of social capital},
VOLUME = {21},
YEAR = {1998},
}
@MISC{wiki:torchat,
AUTHOR = {Wikipedia},
NOTE = {[Online; accessed 28-February-2017]},
TITLE = {TorChat --- Wikipedia{,} The Free Encyclopedia},
URL = {https://en.wikipedia.org/w/index.php?title=TorChat&oldid=728783759},
YEAR = {2016},
}
@MISC{wiki:tormessenger,
AUTHOR = {Wikipedia},
NOTE = {[Online; accessed 28-February-2017]},
TITLE = {Tor (anonymity network) --- Wikipedia{,} The Free Encyclopedia},
URL = {https://en.wikipedia.org/w/index.php?title=Tor_(anonymity_network)#Tor_Messenger&oldid=767770868},
YEAR = {2017},
}
@REPORT{pagerank,
ABSTRACT = {The importance of a Web page is an inherently subjective matter, which depends on the readers interests, knowledge and attitudes. But there is still much that can be said objectively about the relative importance of Web pages. This paper describes PageRank, a mathod for rating Web pages objectively and mechanically, effectively measuring the human interest and attention devoted to them. We compare PageRank to an idealized random Web surfer. We show how to efficiently compute PageRank for large numbers of pages. And, we show how to apply PageRank to search and to user navigation.},
AUTHOR = {Lawrence Page and Sergey Brin and Rajeev Motwani and Terry Winograd},
INSTITUTION = {Stanford InfoLab},
MONTH = {November},
NOTE = {Previous number = SIDL-WP-1999-0120},
NUMBER = {1999-66},
TITLE = {The PageRank Citation Ranking: Bringing Order to the Web.},
TYPE = {Technical Report},
URL = {http://ilpubs.stanford.edu:8090/422/},
YEAR = {1999},
}
@BOOK{everton2012disrupting,
AUTHOR = {Everton, Sean F},
PUBLISHER = {Cambridge University Press},
TITLE = {Disrupting dark networks},
VOLUME = {34},
YEAR = {2012},
}
@ARTICLE{broder2000graph,
AUTHOR = {Andrei Broder and Ravi Kumar and Farzin Maghoul and Prabhakar Raghavan and Sridhar Rajagopalan and Raymie Stata and Andrew Tomkins and Janet Wiener},
JOURNALTITLE = {Computer networks},
NUMBER = {1},
PAGES = {309--320},
TITLE = {Graph structure in the web},
VOLUME = {33},
YEAR = {2000},
}
@ARTICLE{rfc7686,
AUTHOR = {Appelbaum, Jacob and Muffet, Alex},
ISSN = {2070-1721},
JOURNALTITLE = {Internet Engineering Task Force RFC},
MONTH = {Oct},
TITLE = {The ``.onion'' Special-Use Domain Name},
URL = {https://tools.ietf.org/html/rfc7686},
VOLUME = {7686},
YEAR = {2015},
}
@ARTICLE{clauset2009power,
AUTHOR = {Clauset, Aaron and Shalizi, Cosma Rohilla and Newman, Mark EJ},
JOURNALTITLE = {SIAM review},
NUMBER = {4},
PAGES = {661--703},
TITLE = {Power-law distributions in empirical data},
VOLUME = {51},
YEAR = {2009},
}
@ARTICLE{meusel2015graph,
AUTHOR = {Meusel, Robert and Vigna, Sebastiano and Lehmberg, Oliver and Bizer, Christian},
JOURNALTITLE = {The Journal of Web Science},
NUMBER = {1},
TITLE = {The Graph Structure in the Web--Analyzed on Different Aggregation Levels},
VOLUME = {1},
YEAR = {2015},
}
@ARTICLE{Serrano2007,
AUTHOR = {Serrano, M. Ángeles and Maguitman, Ana and Boguñá, Marián and Fortunato, Santo and Vespignani, Alessandro},
DOI = {10.1145/1255438.1255442},
ISSN = {1559-1131},
JOURNALTITLE = {ACM Trans. Web},
KEYWORDS = {Web graph structure, Web measurement, crawler biases, statistical analysis},
MONTH = {08},
NUMBER = {2},
TITLE = {Decoding the Structure of the WWW: A Comparative Analysis of Web Crawls},
URL = {http://doi.acm.org/10.1145/1255438.1255442},
VOLUME = {1},
YEAR = {2007},
}
@ARTICLE{bollobas2004robustness,
AUTHOR = {Bollobás, Béla and Riordan, Oliver},
JOURNALTITLE = {Internet Mathematics},
NUMBER = {1},
PAGES = {1--35},
TITLE = {Robustness and vulnerability of scale-free random graphs},
VOLUME = {1},
YEAR = {2004},
}
@ARTICLE{barabasi1999emergence,
AUTHOR = {Barabási, Albert-László and Albert, Réka},
JOURNALTITLE = {science},
NUMBER = {5439},
PAGES = {509--512},
TITLE = {Emergence of scaling in random networks},
VOLUME = {286},
YEAR = {1999},
}
@ARTICLE{willinger2013internet,
AUTHOR = {Willinger, Walter and Roughan, Matthew},
JOURNALTITLE = {ACM SIGCOMM eBook: Recent Advances in Networking},
TITLE = {Internet topology research redux},
YEAR = {2013},
}
@ARTICLE{willinger2009mathematics,
AUTHOR = {Willinger, Walter and Alderson, David and Doyle, John C},
JOURNALTITLE = {Notices of the AMS},
NUMBER = {5},
PAGES = {586--599},
TITLE = {Mathematics and the internet: A source of enormous confusion and great potential},
VOLUME = {56},
YEAR = {2009},
}
@ARTICLE{pansiot1998routes,
AUTHOR = {Jean-Jacques Pansiot and Dominique Grad},
JOURNALTITLE = {ACM SIGCOMM Computer Communication Review},
NUMBER = {1},
PAGES = {41--50},
TITLE = {On routes and multicast trees in the Internet},
VOLUME = {28},
YEAR = {1998},
}
@THESIS{jovanovic2001modeling,
AUTHOR = {Jovanovic, Mihajlo A},
INSTITUTION = {University of Cincinnati},
TITLE = {Modeling large-scale peer-to-peer networks and a case study of Gnutella},
TYPE = {mathesis},
YEAR = {2001},
}
@ARTICLE{barabasi2000scale,
AUTHOR = {Barabási, Albert-László and Albert, Réka and Jeong, Hawoong},
JOURNALTITLE = {Physica A: Statistical Mechanics and its Applications},
NUMBER = {1},
PAGES = {69--77},
TITLE = {Scale-free characteristics of random networks: the topology of the world-wide web},
VOLUME = {281},
YEAR = {2000},
}
@ARTICLE{siganos2003power,
AUTHOR = {Siganos, Georgos and Faloutsos, Michalis and Faloutsos, Petros and Faloutsos, Christos},
JOURNALTITLE = {IEEE/ACM Transactions on Networking (TON)},
NUMBER = {4},
PAGES = {514--524},
TITLE = {Power laws and the AS-level internet topology},
VOLUME = {11},
YEAR = {2003},
}
@ARTICLE{albert2001physics,
AUTHOR = {Albert-László Barabási, July},
JOURNALTITLE = {Physics Web http://www.physicsweb.org/article/world/14/7/09},
TITLE = {The physics of the Web},
YEAR = {2001},
}
@ARTICLE{cohen2001breakdown,
AUTHOR = {Cohen, Reuven and Erez, Keren and Ben-Avraham, Daniel and Havlin, Shlomo},
JOURNALTITLE = {Physical review letters},
NUMBER = {16},
PAGES = {3682},
TITLE = {Breakdown of the Internet under intentional attack},
VOLUME = {86},
YEAR = {2001},
}
@ARTICLE{albert2000error,
AUTHOR = {Albert, Réka and Jeong, Hawoong and Barabási, Albert-László},
JOURNALTITLE = {Nature},
NUMBER = {6794},
PAGES = {378--382},
TITLE = {Error and attack tolerance of complex networks},
VOLUME = {406},
YEAR = {2000},
}
@ARTICLE{adamic2000power,
AUTHOR = {Adamic, Lada A and Huberman, Bernardo A},
JOURNALTITLE = {Science},
NUMBER = {5461},
PAGES = {2115--2115},
TITLE = {Power-law distribution of the world wide web},
VOLUME = {287},
YEAR = {2000},
}
@MISC{tormetrics,
AUTHOR = {The Tor Project},
MONTH = {January},
TITLE = {TorMetrics --- Unique .onion addresses},
URL = {https://metrics.torproject.org/hidserv-dir-onions-seen.html},
YEAR = {2017},
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 194 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

View File

@ -0,0 +1,338 @@
% partial rewrite of the LaTeX2e package for submissions to the
% Conference on Neural Information Processing Systems (NIPS):
%
% - uses more LaTeX conventions
% - line numbers at submission time replaced with aligned numbers from
% lineno package
% - \nipsfinalcopy replaced with [final] package option
% - automatically loads times package for authors
% - loads natbib automatically; this can be suppressed with the
% [nonatbib] package option
% - adds foot line to first page identifying the conference
%
% Roman Garnett (garnett@wustl.edu) and the many authors of
% nips15submit_e.sty, including MK and drstrip@sandia
%
% last revision: March 2017
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{nips_2017}[2017/03/20 NIPS 2017 submission/camera-ready style file]
% declare final option, which creates camera-ready copy
\newif\if@nipsfinal\@nipsfinalfalse
\DeclareOption{final}{
\@nipsfinaltrue
}
% declare nonatbib option, which does not load natbib in case of
% package clash (users can pass options to natbib via
% \PassOptionsToPackage)
\newif\if@natbib\@natbibtrue
\DeclareOption{nonatbib}{
\@natbibfalse
}
\ProcessOptions\relax
% fonts
\renewcommand{\rmdefault}{ptm}
\renewcommand{\sfdefault}{phv}
% change this every year for notice string at bottom
\newcommand{\@nipsordinal}{31st}
\newcommand{\@nipsyear}{2017}
\newcommand{\@nipslocation}{Long Beach, CA, USA}
% handle tweaks for camera-ready copy vs. submission copy
\if@nipsfinal
\newcommand{\@noticestring}{%
\@nipsordinal\/ Conference on Neural Information Processing Systems
(NIPS \@nipsyear), \@nipslocation.%
}
\else
\newcommand{\@noticestring}{%
Submitted to \@nipsordinal\/ Conference on Neural Information
Processing Systems (NIPS \@nipsyear). Do not distribute.%
}
% line numbers for submission
\RequirePackage{lineno}
\linenumbers
% fix incompatibilities between lineno and amsmath, if required, by
% transparently wrapping linenomath environments around amsmath
% environments
\AtBeginDocument{%
\@ifpackageloaded{amsmath}{%
\newcommand*\patchAmsMathEnvironmentForLineno[1]{%
\expandafter\let\csname old#1\expandafter\endcsname\csname #1\endcsname
\expandafter\let\csname oldend#1\expandafter\endcsname\csname end#1\endcsname
\renewenvironment{#1}%
{\linenomath\csname old#1\endcsname}%
{\csname oldend#1\endcsname\endlinenomath}%
}%
\newcommand*\patchBothAmsMathEnvironmentsForLineno[1]{%
\patchAmsMathEnvironmentForLineno{#1}%
\patchAmsMathEnvironmentForLineno{#1*}%
}%
\patchBothAmsMathEnvironmentsForLineno{equation}%
\patchBothAmsMathEnvironmentsForLineno{align}%
\patchBothAmsMathEnvironmentsForLineno{flalign}%
\patchBothAmsMathEnvironmentsForLineno{alignat}%
\patchBothAmsMathEnvironmentsForLineno{gather}%
\patchBothAmsMathEnvironmentsForLineno{multline}%
}{}
}
\fi
% load natbib unless told otherwise
\if@natbib
\RequirePackage{natbib}
\fi
% set page geometry
\usepackage[verbose=true,letterpaper]{geometry}
\AtBeginDocument{
\newgeometry{
textheight=9in,
textwidth=6in,
top=1in,
headheight=12pt,
headsep=25pt,
footskip=30pt
}
\@ifpackageloaded{fullpage}
{\PackageWarning{nips_2016}{fullpage package not allowed! Overwriting formatting.}}
{}
}
\widowpenalty=10000
\clubpenalty=10000
\flushbottom
\sloppy
% font sizes with reduced leading
\renewcommand{\normalsize}{%
\@setfontsize\normalsize\@xpt\@xipt
\abovedisplayskip 7\p@ \@plus 2\p@ \@minus 5\p@
\abovedisplayshortskip \z@ \@plus 3\p@
\belowdisplayskip \abovedisplayskip
\belowdisplayshortskip 4\p@ \@plus 3\p@ \@minus 3\p@
}
\normalsize
\renewcommand{\small}{%
\@setfontsize\small\@ixpt\@xpt
\abovedisplayskip 6\p@ \@plus 1.5\p@ \@minus 4\p@
\abovedisplayshortskip \z@ \@plus 2\p@
\belowdisplayskip \abovedisplayskip
\belowdisplayshortskip 3\p@ \@plus 2\p@ \@minus 2\p@
}
\renewcommand{\footnotesize}{\@setfontsize\footnotesize\@ixpt\@xpt}
\renewcommand{\scriptsize}{\@setfontsize\scriptsize\@viipt\@viiipt}
\renewcommand{\tiny}{\@setfontsize\tiny\@vipt\@viipt}
\renewcommand{\large}{\@setfontsize\large\@xiipt{14}}
\renewcommand{\Large}{\@setfontsize\Large\@xivpt{16}}
\renewcommand{\LARGE}{\@setfontsize\LARGE\@xviipt{20}}
\renewcommand{\huge}{\@setfontsize\huge\@xxpt{23}}
\renewcommand{\Huge}{\@setfontsize\Huge\@xxvpt{28}}
% sections with less space
\providecommand{\section}{}
\renewcommand{\section}{%
\@startsection{section}{1}{\z@}%
{-2.0ex \@plus -0.5ex \@minus -0.2ex}%
{ 1.5ex \@plus 0.3ex \@minus 0.2ex}%
{\large\bf\raggedright}%
}
\providecommand{\subsection}{}
\renewcommand{\subsection}{%
\@startsection{subsection}{2}{\z@}%
{-1.8ex \@plus -0.5ex \@minus -0.2ex}%
{ 0.8ex \@plus 0.2ex}%
{\normalsize\bf\raggedright}%
}
\providecommand{\subsubsection}{}
\renewcommand{\subsubsection}{%
\@startsection{subsubsection}{3}{\z@}%
{-1.5ex \@plus -0.5ex \@minus -0.2ex}%
{ 0.5ex \@plus 0.2ex}%
{\normalsize\bf\raggedright}%
}
\providecommand{\paragraph}{}
\renewcommand{\paragraph}{%
\@startsection{paragraph}{4}{\z@}%
{1.5ex \@plus 0.5ex \@minus 0.2ex}%
{-1em}%
{\normalsize\bf}%
}
\providecommand{\subparagraph}{}
\renewcommand{\subparagraph}{%
\@startsection{subparagraph}{5}{\z@}%
{1.5ex \@plus 0.5ex \@minus 0.2ex}%
{-1em}%
{\normalsize\bf}%
}
\providecommand{\subsubsubsection}{}
\renewcommand{\subsubsubsection}{%
\vskip5pt{\noindent\normalsize\rm\raggedright}%
}
% float placement
\renewcommand{\topfraction }{0.85}
\renewcommand{\bottomfraction }{0.4}
\renewcommand{\textfraction }{0.1}
\renewcommand{\floatpagefraction}{0.7}
\newlength{\@nipsabovecaptionskip}\setlength{\@nipsabovecaptionskip}{7\p@}
\newlength{\@nipsbelowcaptionskip}\setlength{\@nipsbelowcaptionskip}{\z@}
\setlength{\abovecaptionskip}{\@nipsabovecaptionskip}
\setlength{\belowcaptionskip}{\@nipsbelowcaptionskip}
% swap above/belowcaptionskip lengths for tables
\renewenvironment{table}
{\setlength{\abovecaptionskip}{\@nipsbelowcaptionskip}%
\setlength{\belowcaptionskip}{\@nipsabovecaptionskip}%
\@float{table}}
{\end@float}
% footnote formatting
\setlength{\footnotesep }{6.65\p@}
\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@}
\renewcommand{\footnoterule}{\kern-3\p@ \hrule width 12pc \kern 2.6\p@}
\setcounter{footnote}{0}
% paragraph formatting
\setlength{\parindent}{\z@}
\setlength{\parskip }{5.5\p@}
% list formatting
\setlength{\topsep }{4\p@ \@plus 1\p@ \@minus 2\p@}
\setlength{\partopsep }{1\p@ \@plus 0.5\p@ \@minus 0.5\p@}
\setlength{\itemsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@}
\setlength{\parsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@}
\setlength{\leftmargin }{3pc}
\setlength{\leftmargini }{\leftmargin}
\setlength{\leftmarginii }{2em}
\setlength{\leftmarginiii}{1.5em}
\setlength{\leftmarginiv }{1.0em}
\setlength{\leftmarginv }{0.5em}
\def\@listi {\leftmargin\leftmargini}
\def\@listii {\leftmargin\leftmarginii
\labelwidth\leftmarginii
\advance\labelwidth-\labelsep
\topsep 2\p@ \@plus 1\p@ \@minus 0.5\p@
\parsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@
\itemsep \parsep}
\def\@listiii{\leftmargin\leftmarginiii
\labelwidth\leftmarginiii
\advance\labelwidth-\labelsep
\topsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@
\parsep \z@
\partopsep 0.5\p@ \@plus 0\p@ \@minus 0.5\p@
\itemsep \topsep}
\def\@listiv {\leftmargin\leftmarginiv
\labelwidth\leftmarginiv
\advance\labelwidth-\labelsep}
\def\@listv {\leftmargin\leftmarginv
\labelwidth\leftmarginv
\advance\labelwidth-\labelsep}
\def\@listvi {\leftmargin\leftmarginvi
\labelwidth\leftmarginvi
\advance\labelwidth-\labelsep}
% create title
\providecommand{\maketitle}{}
\renewcommand{\maketitle}{%
\par
\begingroup
\renewcommand{\thefootnote}{\fnsymbol{footnote}}
% for perfect author name centering
\renewcommand{\@makefnmark}{\hbox to \z@{$^{\@thefnmark}$\hss}}
% The footnote-mark was overlapping the footnote-text,
% added the following to fix this problem (MK)
\long\def\@makefntext##1{%
\parindent 1em\noindent
\hbox to 1.8em{\hss $\m@th ^{\@thefnmark}$}##1
}
\thispagestyle{empty}
\@maketitle
\@thanks
% \@notice
\endgroup
\let\maketitle\relax
\let\thanks\relax
}
% rules for title box at top of first page
\newcommand{\@toptitlebar}{
\hrule height 4\p@
\vskip 0.25in
\vskip -\parskip%
}
\newcommand{\@bottomtitlebar}{
\vskip 0.29in
\vskip -\parskip
\hrule height 1\p@
\vskip 0.09in%
}
% create title (includes both anonymized and non-anonymized versions)
\providecommand{\@maketitle}{}
\renewcommand{\@maketitle}{%
\vbox{%
\hsize\textwidth
\linewidth\hsize
\vskip 0.1in
\@toptitlebar
\centering
{\LARGE\bf \@title\par}
\@bottomtitlebar
% \if@nipsfinal
\def\And{%
\end{tabular}\hfil\linebreak[0]\hfil%
\begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces%
}
\def\AND{%
\end{tabular}\hfil\linebreak[4]\hfil%
\begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces%
}
\begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\@author\end{tabular}%
% \else
% \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}
% Anonymous Author(s) \\
% Affiliation \\
% Address \\
% \texttt{email} \\
% \end{tabular}%
% \fi
\vskip 0.3in \@minus 0.1in
}
}
% add conference notice to bottom of first page
\newcommand{\ftype@noticebox}{8}
\newcommand{\@notice}{%
% give a bit of extra room back to authors on first page
\enlargethispage{2\baselineskip}%
\@float{noticebox}[b]%
\footnotesize\@noticestring%
\end@float%
}
% abstract styling
\renewenvironment{abstract}%
{%
\vskip 0.075in%
\centerline%
{\large\bf Abstract}%
\vspace{0.5ex}%
\begin{quote}%
}
{
\par%
\end{quote}%
\vskip 1ex%
}
\endinput

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,144 @@
% make in the latest NIPS format (as of this writing, 2017)
\usepackage[nonatbib,final]{nips_2017}
%\usepackage[nonatbib,final]{nips_2017}
\usepackage{color}
\usepackage{graphicx}
\DeclareGraphicsExtensions{.pdf,.eps,.png,.jpg} % search for .pdf, then .eps, then .pngs, then .jpg
% look in these subdirectories for graphics referenced by \includegraphics
% each entry must end with a /
\graphicspath{{figs/}{figures/}{images/}{./}}
\newcommand*{\red}[1]{ \color{red} #1}
%\usepackage{tabularx}
\usepackage{url}
\usepackage{amsmath}
% this is for environments \subfigure and \subtable
\usepackage{subcaption}
% These packages are FORBIDDEN
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\usepackage{lmodern} % messes up \textsc
%\usepackage{cite} % messes up NIPS
%\usepackage{fullpage} % messes up NIPS
%\usepackage{natbib} % messes up NIPS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{array} % replacement for eqnarray. Must be BEFORE \usepackage{arydshln}
\usepackage{units} % for \nicefrac{\alpha}{\beta}
\usepackage{amsthm} % for theorems
\newtheorem{definition}{Definition}
% text looks a little better
\usepackage{microtype}
\usepackage{wasysym}
\usepackage{textcomp, marvosym} % pretty symbols
\usepackage{booktabs} % for much better looking tables
% for indicator functions
\usepackage{dsfont}
% For automatic capitalizaton of section names, etc.
\usepackage{titlesec,titlecaps}
\Addlcwords{is with of the and in}
\Addlcwords{of the}
\Addlcwords{and}
\titleformat{\section}[block]{}{\normalfont\Large\bfseries\thesection.\;}{0pt}{\formatsectiontitle}
\newcommand{\formatsectiontitle}[1]{\normalfont\Large\bfseries\titlecap{#1}}
\titleformat{\subsection}[block]{}{\normalfont\large\bfseries\thesubsection.\;}{0pt}{\formatsubsectiontitle}
\newcommand{\formatsubsectiontitle}[1]{\normalfont\large\bfseries\titlecap{#1}}
% for pretty Euler script
% \usepackage[mathscr]{euscript}
% \usepackage{bold-extra}
%\usepackage{subfig}
\usepackage{float} % for \subfloat
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% More customizable Lists
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Better symbols custom enumerative lists, define any symbol you'd like
% \usepackage{enumitem}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Custom Symbols
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \xspace at the end of custom macros never screws up spacing.
\usepackage{xspace}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% Abbreviations you'll always want
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\newcommand*{\TODO}[1]{{\centering {\small \sffamily \color{red} #1} \vskip10pt }}
\newcommand*{\todo}[1]{{\small \sffamily [{\color{red} #1}]}}
\newcommand*{\q}[1]{{\small \sffamily [{\color{blue} #1}]}}
\newcommand*{\fix}[1]{{\sffamily [{\textnormal{\color{red} #1}}]}}
%-----------------------------------------------------------------------------
% Cross references
%-----------------------------------------------------------------------------
% The following code defines how you make references to figures, tables, etc...
% It is defined in one place only, and can be modified for all references
% in the document at the same time.
% Instead of typing each time: "see Fig. \ref{myfig}" you can create a command
% \figref which will do the job. Then in text you only type \figref{myfig} and LaTeX
% will do the rest.
\newcommand{\tblref}[1]{Table~\ref{#1}}
%\renewcommand*{\figref}[1]{Fig.~\ref{#1}}
\renewcommand{\eqref}[1]{eq.~(\ref{#1})}
\newcommand{\Subref}[1]{(\subref{#1})}
\newcommand{\figref}[1]{Figure~\ref{#1}}
\newcommand{\Figref}[1]{Figure~\ref{#1}}
\newtheorem{theorem}{Theorem}
\newtheorem{lemma}[theorem]{Lemma}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% for \sout{} for strikeout
% \usepackage[normalem]{ulem}
% for better manipulation of tables
\usepackage{makecell}
\renewcommand\theadfont{\bfseries}
%-----------------------------------------------------------------------------
% Misc symbols that I like
%-----------------------------------------------------------------------------
\newcommand*{\opname}[1]{\operatorname{#1}}
\renewcommand*{\to}{\rightarrow}
%%%%

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -0,0 +1,338 @@
% partial rewrite of the LaTeX2e package for submissions to the
% Conference on Neural Information Processing Systems (NIPS):
%
% - uses more LaTeX conventions
% - line numbers at submission time replaced with aligned numbers from
% lineno package
% - \nipsfinalcopy replaced with [final] package option
% - automatically loads times package for authors
% - loads natbib automatically; this can be suppressed with the
% [nonatbib] package option
% - adds foot line to first page identifying the conference
%
% Roman Garnett (garnett@wustl.edu) and the many authors of
% nips15submit_e.sty, including MK and drstrip@sandia
%
% last revision: March 2017
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{nips_2017}[2017/03/20 NIPS 2017 submission/camera-ready style file]
% declare final option, which creates camera-ready copy
\newif\if@nipsfinal\@nipsfinalfalse
\DeclareOption{final}{
\@nipsfinaltrue
}
% declare nonatbib option, which does not load natbib in case of
% package clash (users can pass options to natbib via
% \PassOptionsToPackage)
\newif\if@natbib\@natbibtrue
\DeclareOption{nonatbib}{
\@natbibfalse
}
\ProcessOptions\relax
% fonts
\renewcommand{\rmdefault}{ptm}
\renewcommand{\sfdefault}{phv}
% change this every year for notice string at bottom
\newcommand{\@nipsordinal}{31st}
\newcommand{\@nipsyear}{2017}
\newcommand{\@nipslocation}{Long Beach, CA, USA}
% handle tweaks for camera-ready copy vs. submission copy
\if@nipsfinal
\newcommand{\@noticestring}{%
\@nipsordinal\/ Conference on Neural Information Processing Systems
(NIPS \@nipsyear), \@nipslocation.%
}
\else
\newcommand{\@noticestring}{%
Submitted to \@nipsordinal\/ Conference on Neural Information
Processing Systems (NIPS \@nipsyear). Do not distribute.%
}
% line numbers for submission
\RequirePackage{lineno}
\linenumbers
% fix incompatibilities between lineno and amsmath, if required, by
% transparently wrapping linenomath environments around amsmath
% environments
\AtBeginDocument{%
\@ifpackageloaded{amsmath}{%
\newcommand*\patchAmsMathEnvironmentForLineno[1]{%
\expandafter\let\csname old#1\expandafter\endcsname\csname #1\endcsname
\expandafter\let\csname oldend#1\expandafter\endcsname\csname end#1\endcsname
\renewenvironment{#1}%
{\linenomath\csname old#1\endcsname}%
{\csname oldend#1\endcsname\endlinenomath}%
}%
\newcommand*\patchBothAmsMathEnvironmentsForLineno[1]{%
\patchAmsMathEnvironmentForLineno{#1}%
\patchAmsMathEnvironmentForLineno{#1*}%
}%
\patchBothAmsMathEnvironmentsForLineno{equation}%
\patchBothAmsMathEnvironmentsForLineno{align}%
\patchBothAmsMathEnvironmentsForLineno{flalign}%
\patchBothAmsMathEnvironmentsForLineno{alignat}%
\patchBothAmsMathEnvironmentsForLineno{gather}%
\patchBothAmsMathEnvironmentsForLineno{multline}%
}{}
}
\fi
% load natbib unless told otherwise
\if@natbib
\RequirePackage{natbib}
\fi
% set page geometry
\usepackage[verbose=true,letterpaper]{geometry}
\AtBeginDocument{
\newgeometry{
textheight=9in,
textwidth=6in,
top=1in,
headheight=12pt,
headsep=25pt,
footskip=30pt
}
\@ifpackageloaded{fullpage}
{\PackageWarning{nips_2016}{fullpage package not allowed! Overwriting formatting.}}
{}
}
\widowpenalty=10000
\clubpenalty=10000
\flushbottom
\sloppy
% font sizes with reduced leading
\renewcommand{\normalsize}{%
\@setfontsize\normalsize\@xpt\@xipt
\abovedisplayskip 7\p@ \@plus 2\p@ \@minus 5\p@
\abovedisplayshortskip \z@ \@plus 3\p@
\belowdisplayskip \abovedisplayskip
\belowdisplayshortskip 4\p@ \@plus 3\p@ \@minus 3\p@
}
\normalsize
\renewcommand{\small}{%
\@setfontsize\small\@ixpt\@xpt
\abovedisplayskip 6\p@ \@plus 1.5\p@ \@minus 4\p@
\abovedisplayshortskip \z@ \@plus 2\p@
\belowdisplayskip \abovedisplayskip
\belowdisplayshortskip 3\p@ \@plus 2\p@ \@minus 2\p@
}
\renewcommand{\footnotesize}{\@setfontsize\footnotesize\@ixpt\@xpt}
\renewcommand{\scriptsize}{\@setfontsize\scriptsize\@viipt\@viiipt}
\renewcommand{\tiny}{\@setfontsize\tiny\@vipt\@viipt}
\renewcommand{\large}{\@setfontsize\large\@xiipt{14}}
\renewcommand{\Large}{\@setfontsize\Large\@xivpt{16}}
\renewcommand{\LARGE}{\@setfontsize\LARGE\@xviipt{20}}
\renewcommand{\huge}{\@setfontsize\huge\@xxpt{23}}
\renewcommand{\Huge}{\@setfontsize\Huge\@xxvpt{28}}
% sections with less space
\providecommand{\section}{}
\renewcommand{\section}{%
\@startsection{section}{1}{\z@}%
{-2.0ex \@plus -0.5ex \@minus -0.2ex}%
{ 1.5ex \@plus 0.3ex \@minus 0.2ex}%
{\large\bf\raggedright}%
}
\providecommand{\subsection}{}
\renewcommand{\subsection}{%
\@startsection{subsection}{2}{\z@}%
{-1.8ex \@plus -0.5ex \@minus -0.2ex}%
{ 0.8ex \@plus 0.2ex}%
{\normalsize\bf\raggedright}%
}
\providecommand{\subsubsection}{}
\renewcommand{\subsubsection}{%
\@startsection{subsubsection}{3}{\z@}%
{-1.5ex \@plus -0.5ex \@minus -0.2ex}%
{ 0.5ex \@plus 0.2ex}%
{\normalsize\bf\raggedright}%
}
\providecommand{\paragraph}{}
\renewcommand{\paragraph}{%
\@startsection{paragraph}{4}{\z@}%
{1.5ex \@plus 0.5ex \@minus 0.2ex}%
{-1em}%
{\normalsize\bf}%
}
\providecommand{\subparagraph}{}
\renewcommand{\subparagraph}{%
\@startsection{subparagraph}{5}{\z@}%
{1.5ex \@plus 0.5ex \@minus 0.2ex}%
{-1em}%
{\normalsize\bf}%
}
\providecommand{\subsubsubsection}{}
\renewcommand{\subsubsubsection}{%
\vskip5pt{\noindent\normalsize\rm\raggedright}%
}
% float placement
\renewcommand{\topfraction }{0.85}
\renewcommand{\bottomfraction }{0.4}
\renewcommand{\textfraction }{0.1}
\renewcommand{\floatpagefraction}{0.7}
\newlength{\@nipsabovecaptionskip}\setlength{\@nipsabovecaptionskip}{7\p@}
\newlength{\@nipsbelowcaptionskip}\setlength{\@nipsbelowcaptionskip}{\z@}
\setlength{\abovecaptionskip}{\@nipsabovecaptionskip}
\setlength{\belowcaptionskip}{\@nipsbelowcaptionskip}
% swap above/belowcaptionskip lengths for tables
\renewenvironment{table}
{\setlength{\abovecaptionskip}{\@nipsbelowcaptionskip}%
\setlength{\belowcaptionskip}{\@nipsabovecaptionskip}%
\@float{table}}
{\end@float}
% footnote formatting
\setlength{\footnotesep }{6.65\p@}
\setlength{\skip\footins}{9\p@ \@plus 4\p@ \@minus 2\p@}
\renewcommand{\footnoterule}{\kern-3\p@ \hrule width 12pc \kern 2.6\p@}
\setcounter{footnote}{0}
% paragraph formatting
\setlength{\parindent}{\z@}
\setlength{\parskip }{5.5\p@}
% list formatting
\setlength{\topsep }{4\p@ \@plus 1\p@ \@minus 2\p@}
\setlength{\partopsep }{1\p@ \@plus 0.5\p@ \@minus 0.5\p@}
\setlength{\itemsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@}
\setlength{\parsep }{2\p@ \@plus 1\p@ \@minus 0.5\p@}
\setlength{\leftmargin }{3pc}
\setlength{\leftmargini }{\leftmargin}
\setlength{\leftmarginii }{2em}
\setlength{\leftmarginiii}{1.5em}
\setlength{\leftmarginiv }{1.0em}
\setlength{\leftmarginv }{0.5em}
\def\@listi {\leftmargin\leftmargini}
\def\@listii {\leftmargin\leftmarginii
\labelwidth\leftmarginii
\advance\labelwidth-\labelsep
\topsep 2\p@ \@plus 1\p@ \@minus 0.5\p@
\parsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@
\itemsep \parsep}
\def\@listiii{\leftmargin\leftmarginiii
\labelwidth\leftmarginiii
\advance\labelwidth-\labelsep
\topsep 1\p@ \@plus 0.5\p@ \@minus 0.5\p@
\parsep \z@
\partopsep 0.5\p@ \@plus 0\p@ \@minus 0.5\p@
\itemsep \topsep}
\def\@listiv {\leftmargin\leftmarginiv
\labelwidth\leftmarginiv
\advance\labelwidth-\labelsep}
\def\@listv {\leftmargin\leftmarginv
\labelwidth\leftmarginv
\advance\labelwidth-\labelsep}
\def\@listvi {\leftmargin\leftmarginvi
\labelwidth\leftmarginvi
\advance\labelwidth-\labelsep}
% create title
\providecommand{\maketitle}{}
\renewcommand{\maketitle}{%
\par
\begingroup
\renewcommand{\thefootnote}{\fnsymbol{footnote}}
% for perfect author name centering
\renewcommand{\@makefnmark}{\hbox to \z@{$^{\@thefnmark}$\hss}}
% The footnote-mark was overlapping the footnote-text,
% added the following to fix this problem (MK)
\long\def\@makefntext##1{%
\parindent 1em\noindent
\hbox to 1.8em{\hss $\m@th ^{\@thefnmark}$}##1
}
\thispagestyle{empty}
\@maketitle
\@thanks
% \@notice
\endgroup
\let\maketitle\relax
\let\thanks\relax
}
% rules for title box at top of first page
\newcommand{\@toptitlebar}{
\hrule height 4\p@
\vskip 0.25in
\vskip -\parskip%
}
\newcommand{\@bottomtitlebar}{
\vskip 0.29in
\vskip -\parskip
\hrule height 1\p@
\vskip 0.09in%
}
% create title (includes both anonymized and non-anonymized versions)
\providecommand{\@maketitle}{}
\renewcommand{\@maketitle}{%
\vbox{%
\hsize\textwidth
\linewidth\hsize
\vskip 0.1in
\@toptitlebar
\centering
{\LARGE\bf \@title\par}
\@bottomtitlebar
% \if@nipsfinal
\def\And{%
\end{tabular}\hfil\linebreak[0]\hfil%
\begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces%
}
\def\AND{%
\end{tabular}\hfil\linebreak[4]\hfil%
\begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\ignorespaces%
}
\begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}\@author\end{tabular}%
% \else
% \begin{tabular}[t]{c}\bf\rule{\z@}{24\p@}
% Anonymous Author(s) \\
% Affiliation \\
% Address \\
% \texttt{email} \\
% \end{tabular}%
% \fi
\vskip 0.3in \@minus 0.1in
}
}
% add conference notice to bottom of first page
\newcommand{\ftype@noticebox}{8}
\newcommand{\@notice}{%
% give a bit of extra room back to authors on first page
\enlargethispage{2\baselineskip}%
\@float{noticebox}[b]%
\footnotesize\@noticestring%
\end@float%
}
% abstract styling
\renewenvironment{abstract}%
{%
\vskip 0.075in%
\centerline%
{\large\bf Abstract}%
\vspace{0.5ex}%
\begin{quote}%
}
{
\par%
\end{quote}%
\vskip 1ex%
}
\endinput