Skip to content

Plasma Fraud Proof Challenge

Johann Barbie edited this page Apr 16, 2018 · 18 revisions

At Parsec Labs we love fraud proofs, they power the security of our Plasma chain and keep the validators in check. We have set up a chain on the Rinkeby testnet, but some malicious validators have submitted invalid blocks or withheld block data! Help us to invalidate the blocks and slack the miners' stacks. Participate with the following steps:

  1. Review blocks.
  2. Submit 3 different fraud proofs.
  3. Mine next block.

Each successful transaction will receive one of the crypto-kitties shown in the Plasma presentation.

sidechain overview

Parsec Bridge Address:

0xa0a368325920b028e4da0ee2d7ccd8468b7ad1ee

Parsec Bridge Interface:

pragma solidity ^0.4.19;

contract ParsecBridge {
    
  struct Block {
    bytes32 parent; // the id of the parent node
    uint64 height;  // the hight this block is stored at
    uint32 parentIndex; //  the position of this node in the Parent's children list
    address operator; // the operator that submitted the block
    bytes32[] children; // unordered list of children below this node
    // more node attributes here
  }
  mapping(bytes32 => Block) public chain;

  struct Deposit {
    uint64 height; 
    address owner;
    uint256 amount;
  }
  mapping(uint32 => Deposit) public deposits;
  uint32 depositCount = 0;

  uint32 public operatorCount;
  uint64 public blockReward;
  uint256 public totalStake;  
  bytes32 public tipHash;

  function join(uint256 amount) public;
  
  function submitBlockAndPrune(bytes32 prevHash, bytes32 root, uint8 v, bytes32 r, bytes32 s, bytes32[] orphans) public;

  function reportLightBranch(bytes32[] _data) public;

  function reportInvalidDeposit(bytes32[] _txData) public;

  function reportDoubleSpend(bytes32[] _proof, bytes32[] _prevProof) public;
  
  function getBranchCount(bytes32 nodeId) public constant returns(uint childCount);

  function getBranchAtIndex(bytes32 nodeId, uint index) public constant returns(bytes32 childId);

  function getTip(address[] _operators) public constant returns (bytes32, uint256);
}

Constants:

blockReward: 5000000
a: 0x634B47d61F93d2096672743c5e3BCDD25f18c350
b: 0x7159fC66D7Df6Fa51C99Eaf96C160Fa8a9EC7287
c: 0x8ccfd031639D8d9F46133859EA80DEaF5dee9Be3

Block 0x9e27:

blockHash: 0x9e275bf0e771ff15915654c360b89394b09bc98b56eed1194fdfe9ebb03b245f
height: 1
signer: c
txList: const cb = new Tx().coinbase(blockReward, c)

Block 0xadf5:

blockHash: 0xadf5d3edfcff1005aacd52dff082e99b1b8153496c6081881cd424b3c429a6b2
height: 2
signer: d
txList: new Tx().coinbase(blockReward, d), new Tx().transfer([{prevTx: cb.hash(), outPos: 0}], [{blockReward, addr: d}])

Block 0x9e9c:

blockHash: 0x9e9c35b7dc0660868aa2610f8953c2f60717c772a6e57583dde8ace1192beeb3
height: 3
signer: c
txList: new Tx().coinbase(blockReward, c), new Tx().deposit(1, blockReward, e)

Block 0xc5d1:

blockHash: 0xc5d1e2f8486790f3b23be5d68cd17d1ce388681824ead9f95240a49c94e6d8e5
height: 4
signer: e
txList: new Tx().coinbase(blockReward, e)

Block 0xd0e4:

blockHash: 0xd0e4c6e64b8ddbd6427e906856b1a9e44ba7e1803698bfd5358fbfd32261da4a
height: 5
signer: c
txList: new Tx().coinbase(blockReward, c)

Block 0xa301:

blockHash: 0xa30133bdb51ad0f5f4b1e77095bd2a215e3defa205060730bd277b958701b5dc
height: 3
signer: d
txList: new Tx().coinbase(blockReward, d)

Block 0xf665:

blockHash: 0xf665ec388eebab4a601a4ed0321901ffca25dfb9632d6e77ee21c843b12dc72e
height: 4
signer: d
txList: xxx data withholding, other operators will not build on this block xxxx

Block 0x38bc:

blockHash: 0x38bc8fbe8c636b6da90b3320c549fa95b3496eefb5b0891ff02101fe99b13a4b
height: 5
signer: d
txList: new Tx().coinbase(blockReward, d)

Block 0x1a5f:

blockHash: 0x1a5f26d8e6735c5db8b40283b67b270c9c33b23f8829eef193092cd5c41e5e01
height: 6
signer: d
txList: new Tx().coinbase(blockReward, d)

Block 0x298d:

blockHash: 0x298d89b69d02054ffe9323f4f6fcad3bc0c6d35c1aa85a5dce3417148e73835e
height: 3
signer: c
txList: new Tx().coinbase(blockReward, c), new Tx().deposit(1, blockReward, c)

Block 0x51d7:

blockHash: 0x51d7c43f1061a533c156961b2a034cfe3eeddf9335e2fdb7da10bdf0e9f82a72
height: 4
signer: c
txList: new Tx().coinbase(blockReward, c)

Block 0xfc90:

blockHash: 0xfc90987d81928e1c7a14562dc83f00b89a5fbf035adb16b35df304b31d47007a
height: 4
signer: c
txList: new Tx().coinbase(blockReward, c), new Tx().transfer([{prevTx: cb.hash(), outPos: 0}], [{blockReward, addr: d}])

Fraud Proof Lib:

https://github.com/parsec-labs/parsec-lib

Clone this wiki locally