-
Notifications
You must be signed in to change notification settings - Fork 5.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
ERC 792: Arbitration Standard #792
Comments
Good work, I really like the look of this. I am very interested in this standard as I am also currently developing platform functionality for arbitration of contracts : https://github.com/TiiQu-Network/TiiQu-Network/wiki/White-Paper#crowd-sourced-arbitrage |
Seconding the good work. We are developing a marketplace at www.originprotocol.com and arbitration will be important. I'll share this with our team. |
About
I was wondering that the |
Another solution would be to add a |
I really don't like the _extra_data bytes argument. Languages are typed to make code easier to analyze, and this feature forces developers to obscure type information. This could make bugs harder to catch. One way to fix this would be to remove _extra_data and force Arbitrator contracts to store relevant custom data using the disputeID, and to have their own functions for providing details about each stage of dispute resolution. |
@SerpentChris If you let You can see that other standards took the same approach, for example ERC777: #777 . |
@SerpentChris |
I added the |
Wanted to add some more concrete thoughts on this EIP after our call @clesaege
In addition to the In addition to this, I want to formally advocate for a settlements process that is on-chain, allowing people to settle disputes for a lower amount without having to pay arbiter fees. However, I would be open to settlement functionality not being included in the standard since I understand you (Kleros) don't include that functionality in your mechanism as of right now. |
I also want to formally share my opinion that I believe it is premature for us to create an ERC for this when we have minimal evidence of the validity of our assumptions. Standards historically have evolved out of market successes (or based on user data about previous versions of a product), however the lack of decentralized dispute resolution mechanism in the market precludes us from making any assertions about what should be in the standard without including some of our own assumptions. I believe we should align on what a general standard for this would look like, and begin employing it, well before we pursue a finalization of this EIP (similarly to how ERC20 was used well before it was finalized). |
The standard is not about functionalities, it's about interoperability. The
With the exception of the centralized arbitrators and Delphi proposals, all dispute resolution proposal I'm aware of (Kleros, Juris, Jury.Online, Aragon, TiiQu) includes an appeal system. If a contract does not allow appeals, it just has to return a high value to forbid it. But when the overwhelming majority of dispute resolution systems off-chain (state court system, ADR which even when they don't include an intra-ADR appeal system, can then be "appealed" by state courts), and on-chain proposals. It seems that the appeal system must belong to the standard.
Yes, for cases where an
No, the
An on-chain settlement process is not included in the standard as this standard is about standardization of interactions between
When speaking with projects needing dispute resolution, the contrary opinion has emerged. There a lot of teams building products which need dispute resolution and a handful of teams working on it. The projects which need dispute resolution generally don't want to have to integrate with each dispute resolution provider, especially knowing that those projects are early stage (the whole industry is) and most of them will have failed within a few years. Integration with a standard, instead of a particular project, allows them to let their users choose their dispute resolution system instead of locking them on a particular one. |
In my opinion this would be best, similar to how there was a
Correct, but this information is entirely useless unless it is being returned to another contract for storage since it's impossible for the returned value to be passed to the sender of the original transaction (if the claim is opened by a user). This information should be emitted in an event. I would also like for the claim amount and fee information to be passed as parameters to this function as well (remember when I asked about what happens if a fee is greater than the
Could you please explain this to me? If a contract is arbitrable, it means it is a contract requiring arbitration, i.e. requiring the opening of claims against it. For our staking mechanism, these arbitrable contracts are the stakes which can have claims opened against them.
This viewpoint is admirable, and I am largely behind it, however I worry that trying to formalize this standard too early as an officially accepted EIP (instead of it simply serving as a reference for dispute resolution providers and recipients), we'll be screwing ourselves over in the future by requiring new standards to be backwards compatible. Having competitors and collaborators come together on a standard is an important part of the Ethereum developer community, however it requires a light touch, where developers are open to having their ideas questioned and overturned when the market (their users) provides them feedback that their assumptions are wrong. In terms of including the appeals process in the standard as an extra function (which may revert for implementations without appeals), I believe this is a fine solution for the short term as we test out our implementations and figure out where they break. It is non-trivial for all disputes to be implemented using the same contract standard, with there generally being various approaches to the dispute resolution problem which don't necessarily mirror the adjudication methods we see in the real world right now. In an effort to encourage this exploration of new and unique methods, we should try to be fluid in our development of this standard, and open to seeing it challenged and amended as we discover what works in practise. |
This information is always being returned to another contract. It is returned to the
External accounts don't create dispute.
This is the case per
This is a general dispute resolution standard, claims not need to be monetary. A claim can for example be about blacklisting something (malicious ENS address, irrelevant item, spam) (see this contract for example https://github.com/kleros/kleros-interaction/blob/master/contracts/standard/permission/ArbitrableBlacklist.sol ). Thus the claimed amount cannot be part of the standard.
This standard is only about interaction between
That's why this ERC has been put in the issue section before making a pull request per the EIP Work Flow described by EIP1 https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1.md :
The possibility off appeals cannot break anything. If you don't need it, don't allow appeals. At worse you lost 0.01$ when deploying your contract (only once if using a library). At best you avoided duplicating your
When there is no interaction between dapps (for example in the case of Augur where they both deal with dispute resolution and enforcement), there is no need to follow a standard.
For sure, but in the other way around (not preventing usages but allowing some). If someone were to show a dispute resolution method which could not fit in the standard, I would support modifying it (as long as it would only incurs limited extra gas cost and code complexity) in order to allow this new dispute resolution method. |
It seems we have again found another strong difference in opinion. For Delphi, claims are opened by people, against particular stakes. Claims ARE for monetary amounts (units of tokens, for what else could be administered on-chain otherwise?) Are you proposing that certain byte code would execute based on these claims? Is that what you intend to store in the bytes array, and not a content hash? My desire here isn't to simply "remove appeals". We are approaching arbitration in very different manners and assuming that either approach is right from the outset is incorrect. I will apologize that I've had a bit of trouble understanding this architecture you've designed (the flow of actions between the arbitrable contract and the arbitrator contract). Here is a list of reasons why this standard doesn't currently conform to the dispute resolution mechanism we've outlined with our arbitration mechanism:
Like I said above, there are many differences in our designs, and that should be encouraged, in order to test the assumptions underlying each of them. Trying to create one standard for all possible usecases of arbitration will be very difficult, owing to the variety of instances in life where arbitration is currently used (and the many new ones which are being ideated such as the blacklisting of accounts, or other new on-chain actions). |
Items in lists, Oracle answers, Cryptokitties...
I'm proposing a system which allows the
No, the bytes contains specific information for the
That is not the case. I'm approaching arbitration from a general manner to allow every possible usecases (including yours) while you approach arbitration from a particular approach. Your approach (do you have code to link to so I can verify?) seems to be perfectly compatible with the standard.
The standard interface perfectly allows this. You have to implement this in the
Having arbitration fees not fixed is perfectly possible within the standard. If you want the
You are speaking about claims, the standard does not deal with claims (this does not mean claims are impossible, just that the
That the particular point of this standard, decoupling
No, there is not design difference, as the standardization of interactions between
There is standard framework for interoperability which is perfectly compatible with your design (from what I understood, but again, for me to verify that I'd need to see your code).
Again, feel free to give me a usecase which will not fit in. But note that the standard is about interactions between |
Here is a link to the stake contract, which will be the "arbitrable" contract in the end. This work is still very much WIP and undocumented, but I think you'll quickly see that our implementation of arbitration is not the same as yours. (or maybe it is, and I've simply misunderstood) https://github.com/Bounties-Network/Delphi/blob/develop/contracts/DelphiStake.sol |
Our respective implementations do not matter for standardization. Only the interaction needs to be standardized, not the implementation. I think that a lot of your previous comments are based on the wrong premise that the standard was about implementation.
I effectively think you misunderstood as your implementation can be slightly modified to fit in the standard. |
Why are arbiters being paid in advance when we can trustlessly pay them when they rule?
If arbiters simply sort their bounties by the value of their fees instead of by their time of creation (or some weighted combination), the spammy bounties will be the lowest value disputes, and can therefore trivially be ignored. Otherwise if spammy claims have a meaningful supply of fees attached, they can choose to rule on them as they please. |
It's not arbiters which are paid in advance, it's the
Because
|
This is why the arbitrable contracts shouldn't be coupled to the arbitrators, who can choose to rule on claims they desire to (and trust) and ignore ones they don't.
Why do you assume that the arbitrator must be another contract and can't simply be an individual?
This is trivially done on the front end by comparing byte code / the master copy which proxies point to.
Again, it only triggers that process if arbiters want it to. As you can see, a number of design differences are beginning to show themselves, and these are fine. However, trying to declare that one design should be STANDARD without any PROOF would be a terrible decision. |
That's the precise goal of this standard, providing a standard interface for coupling
Another individual can be trivially put as a contract (cf: https://github.com/kleros/kleros-interaction/blob/master/contracts/standard/arbitration/CentralizedArbitrator.sol and we can do even better by using only a unique contract for centralized arbitrators which specifies the address of the centralized arbitrator in
They would need a list of all accepted
Dispute resolution systems do not necessarily have people acting as watchdogs of what a dispute could be.
Mark, this is a standard to allow interoperability between |
Then this should not be promoted as an "arbitration standard", when it only covers specific cases of arbitration.
I am absolutely not against standardization, I have spent the last year pushing for standardization among bounty implementations on Ethereum, which is why I can tell you first hand that standards should evolve and not be enforced in a heavy handed manner. I resent any implication that my hesitation here is because I don't want a standard to exist, since my goal is very much the opposite. But standards must be administered in a prudent manner.
This is true, but a standard for arbitration doesn't need to know anything about who is adjudicating the claims (similarly to how the ERC20 contract doesn't know anything about which contract or individual is transacting with tokens). If you would like to have a standard for Arbitrable contracts, then it should not be coupled to any Arbiter contract. A second standard for Arbiters may be developed independently, and the Arbiters can make sure they are compatible with the Arbitrable contract, but there's no reason for the bidirectional coupling.
This is only half true, it's entirely possible to pursue interoperability in the short term by working with select groups on connecting Kleros to their dispute resolution needs (and competitors can do so similarly, either following the same interface or a different one). Then, once we have a better understanding of user needs, we can develop a standard. Trying to develop a standard for your product before you have any users is opposite to every product development best practise that exists in the world, and entirely ignores the needs of your future users as they arise.
I have tried repeatedly to explain to you why the standard you are developing differs from the way we have built and architected arbitrable contracts (stakes).
I am not intending to prevent you from rushing into interoperability, I am attempting to prevent an ERC from being formally proposed which not only doesn't agree with other implementations for Arbitration on Ethereum, but is based on no user data about what actual needs will be when launched into production. As I said above, interoperability can be pursued with partners without proposing an ERC; we've done this fruitfully with standard bounties for over a year, and as it turns out, our initial implementation was not complete, and as we gained users, we learned why it was lacking. If we had proposed a standard from the outset, there would be significant complexity from having to support multiple versions simultaneously (and in perpetuity). As I stated from the outset, we have significant differences in our implementations, and either one of us calling our ideas for Arbitration "complete" would be foolish. I wish you the best of luck with exploring an architecture of tight coupling between arbitrable and arbiter contracts, while we desire to decouple these components as much as possible. Neither of us has hard evidence about why our design pattern is best, so we should wait and collect that evidence before pushing an ERC forward. |
And for the record, my mention of "my product 4 times" in no way is meant to promote it (who am I promoting it to? other developers who browse EIPs? Those are unlikely going to make up the bulk of an arbitration user base). I mentioned our product because we have implemented a version of Arbitration that differs very strongly from yours. Not only does your design require high coupling between projects (dApp smart contracts) and arbitrators, it assumes that one single interface for arbitration can be used in all cases where dispute resolution is required. I apologize that my comments to you seem rude, I've tried to express my disagreement with your view on multiple occasions, and instead of attempting to understand my point of view, you ignore it. We spent 45 minutes on a call during which you repeatedly tried to explain to me about the importance of an "appeals" process, instead of looking at our design differences from a broader perspective. I really don't intend to stunt your growth or hinder your efforts towards interoperability, but there are real-life, long term consequences of building and pushing EIPs forward. For a component as critical to trust transactions as arbitration, we should make sure we get it right. Also for the record, my use of bold text and upper case letters is meant to serve to emphasize certain points, not to "shout" at you. |
Mark, since you are misreporting our interactions, I would not interact with you anymore. The issue section of an ERC is not a place for personal attacks. Your point of view has been understood. Good luck on your ventures. Further off topic comments will be reported to an EIP editor. |
Was your above comment not littered with personal attacks on my character? If you decide you are interested in actually collaborating on a standard for Arbitration on Ethereum (and not simply formalizing your teams approach into a standard that others must conform to), I would be happy to help. |
Coming back to improvement proposals, what do you think of adding the possibility to pay in tokens? |
You can review the evidence standard proposal https://docs.google.com/document/d/1AsGt_Am2rbZwCd6FULfl4ssMIlo_WZVhjo8V7ZFztmo/ . If there is no issues found we'll submit it as an ERC. |
Great standard. A minor thing:
Why is |
Thanks @TimDaub for the remark, I just fixed this (note that it does not lead to any backward compatibility issues as variable names are not used when creating the function signature). |
I propose adding the following to IArbitrable:
This would change the
In practice, it would be accompanied by an onlyGovernor modifier. What do you think? Is this limiting? |
@clesaege Has there been any updates to this proposal with the option to pay fees in tokens? I was checking the Kleros implementation but I think fees are paid in ETH. I was wondering if the standard as it's been currently proposed can easily allow the pay-in-tokens possibility or it would need some changes. I think this is important if aiming to become an interoperable standard. |
I think your idea assumes that an Arbitrable contract only has one Arbitrator, which (as the proposal makes clear) is not necessarily the case. Arbitrable contracts could have a list of multiple arbitrarors and their own complex logic for choosing or changing those according to the case. What needs to be standardized is the interface of function calls between Arbitrable and Arbitrator, which this proposal seems to cover IMO. |
@clesaege In case you check this, I'm dealing with the question of how does an Arbitrator provide additional data specific to a ruling?... For example, Arbiter is deciding on a dispute over staked tokens, therefore should be able to execute |
There has been no activity on this issue for two months. It will be closed in a week if no further activity occurs. If you would like to move this EIP forward, please respond to any outstanding feedback or add a comment indicating that you have addressed all required feedback and are ready for a review. |
This issue was closed due to inactivity. If you are still pursuing it, feel free to reopen it and respond to any feedback or request a review in a comment. |
Abstract
The following describes a standard of
Arbitrable
andArbitrator
contracts. Every Arbitrable contract can be adjudicated by every Arbitrator contract. Arbitrator contracts give rulings and Arbitrable contracts enforce them.Motivation
Using two contracts allows separation between the ruling and its enforcement. This abstraction allows
Arbitrable
contract developers not to have to know the internal process of theArbitrator
contracts. Neither doArbitrator
contract developers withArbitrable
ones.It allows dapps to easily switch from one arbitration service to another one. Or to allow their users to choose themselves their arbitration services.
Specification
Arbitrable
This contract enforces decisions given by the
Arbitrator
contract.It must calls the functions
createDispute
andappeal
of theArbitrator
contract and pay the required fee. It is its responsability to determine in which case a dispute occurs and when an appeal is possible.It must track the disputes by their
(arbitrator,disputeID)
unique key. If the contract only has a uniquearbitrator
which can't be changed, thearbitrator
part can be omitted internally.This contract must implement enforcements of
ruling
. Forruling
, the value0
is reserved to indicate that no ruling has been given.Methods
rule
To be called by the
Arbitrator
contract.Enforces the ruling
_ruling
for dispute(msg.sender,_dispute)
.Arbitrators should only call
rule
when all appeals are exhausted.It must reverts in case of failure.
It must fire the
Ruling
event.NOTE: The
Arbitrator
contract should not assume thatrule
will be successfully executed. A malicious (or buggy)Arbitrable
contract could makerule
revert.Events
Ruling
Must trigger when a final ruling is given.
Arbitrator
This contract makes rulings. It must call the
rule
function when a decision is final.Methods
NOTE: The variable
_extraData
can contains information to require a custom arbitration (resp. appeal) behaviour of the contract. The format of this variable is determined by theArbitrator
contract creator. In case_extraData
is void or invalid, functions should act according to a default arbitration (resp. appeal) behaviour.NOTE: The variable
_extraData
SHOULD be formatted the same way for both dispute creation and appeal.NOTE: Different
_extraData
values can be used by a sameArbitrable
contract, even during the same dispute. ThereforeArbitrator
contracts MUST NOT assume_extraData
to be constant across disputes and appeals.NOTE: Arbitration (resp. appeal)
fee
can change, thereforeArbitrable
contracts should call this function each time it is relevant and not assume thefee
are the same as in the last call.NOTE: If the
Arbitrable
contract does not pay enough fee, the functions should revert. However, if it pays too much fee, the contract should not revert and accept the higher fee.arbitrationCost
Returns the cost of arbitration
fee
in wei required to create a dispute.appealCost
Returns the cost of appeal
fee
in wei required to appeal the dispute(arbitrator,_disputeID)
.createDispute
Create a dispute.
It should be called by the
Arbitrable
contract. It must pay at leastarbitrationCost(bytes _extraData)
weis.The parameter
_choices
indicates the maximum value_ruling
can take. So for a binary ruling,_choices
should be2
(0
to refuse to give a ruling,1
for giving the first ruling and2
for the second).This method must fire the
DisputeCreation
event.The
Arbitrator
contract should assign a uniquedisputeID
identifier to the dispute and return it.appeal
Appeal the dispute
(arbitrator,_disputeID)
.It should be called by the
Arbitrable
contract. It must pay at leastappealCost(uint _disputeID, bytes _extraData)
weis.This method must fire the
AppealDecision
event.appealPeriod
Return the [
start
,end
] time windown for appealing a ruling if known in advance.If those time are not known or appeal is not possible, returns
(0,0)
.currentRuling
Return the
ruling
which will be given if there is no appeal or which has been given.disputeStatus
Return the
status
of the ruling.with
NOTE: The value
solved
does not necessarily means that the functionrule
was called. It means that the ruling is final and that it won't change.Events
DisputeCreation
Must trigger when a dispute is created.
AppealDecision
Must trigger when the current ruling is appealed.
AppealPossible
Must trigger when appealing a dispute becomes possible.
Rationale
Arbitrator
of anArbitrable
contract allowsArbitrable
contracts to have multiple arbitrators and to change them.Arbitrable
contract to pay the fee (opposed to requiring users to directly interact with theArbitrator
contract) allows it to determine who should pay the fee. It can choose to split them, or require parties to deposit ether to pay fee and reimburse the winners.ruling
, reserving the value0
for absence of ruling allows arbitrators to refuse to rule.extraData
allows arbitrary customization of arbitration processes. For example, the amount of jurors which will participate in a ruling and the time allowed. The way a dispute is handled is determined by the(arbitrator,extraData)
pair.appeal
is possible, as theArbitrator
contract just has to return an arbitrary high value inappealCost
to indicate that appeals are not possible.Arbitrable
contract has a bug which makes it pay too much, it's better to accept the higher fee, than to prevent disputes and appeals which could stuck the contract forever. It also allowsArbitrable
contracts to choose to give higherfee
than required, for example if thosefee
are used as an incentive for arbitrators, in order to provide incentives higher than the minimum.disputeStatus
allows contract and users to know if a ruling has been given and if it is final.currentRuling
allows contracts and users to know whichruling
would be given if there is no appeal and make their appeal decisions accordingly.Combined with
disputeStatus
, it allows other contracts to take actions depending of the result of a dispute. This can be used to enforce contingency fee payouts.Implementations
Example implementations are available at
Presentation on how to make your own implementation:
The text was updated successfully, but these errors were encountered: