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! 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