-
-
Notifications
You must be signed in to change notification settings - Fork 18
Plasma Fraud Proof Challenge
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:
- review blocks.
- submit 3 different fraud proofs.
- mine next block.
Each successful transaction will receive one of the crypto-kitties shown in the slides here (todo: link).
0xa0a368325920b028e4da0ee2d7ccd8468b7ad1ee
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);
}
blockReward: 5000000
a: 0x634B47d61F93d2096672743c5e3BCDD25f18c350
b: 0x7159fC66D7Df6Fa51C99Eaf96C160Fa8a9EC7287
c: 0x8ccfd031639D8d9F46133859EA80DEaF5dee9Be3
blockHash: 0x9e275bf0e771ff15915654c360b89394b09bc98b56eed1194fdfe9ebb03b245f
height: 1
signer: c
txList: const cb = new Tx().coinbase(blockReward, c)
blockHash: 0xadf5d3edfcff1005aacd52dff082e99b1b8153496c6081881cd424b3c429a6b2
height: 2
signer: d
txList: new Tx().coinbase(blockReward, d)
, new Tx().transfer([{prevTx: cb.hash(), outPos: 0}], [{blockReward, addr: d}])
blockHash: 0x9e9c35b7dc0660868aa2610f8953c2f60717c772a6e57583dde8ace1192beeb3
height: 3
signer: c
txList: new Tx().coinbase(blockReward, c)
, new Tx().deposit(1, blockReward, e)
blockHash: 0xc5d1e2f8486790f3b23be5d68cd17d1ce388681824ead9f95240a49c94e6d8e5
height: 4
signer: e
txList: new Tx().coinbase(blockReward, e)
blockHash: 0xd0e4c6e64b8ddbd6427e906856b1a9e44ba7e1803698bfd5358fbfd32261da4a
height: 5
signer: c
txList: new Tx().coinbase(blockReward, c)
blockHash: 0xa30133bdb51ad0f5f4b1e77095bd2a215e3defa205060730bd277b958701b5dc
height: 3
signer: d
txList: new Tx().coinbase(blockReward, d)
blockHash: 0xf665ec388eebab4a601a4ed0321901ffca25dfb9632d6e77ee21c843b12dc72e
height: 4
signer: d
txList: new Tx().coinbase(blockReward, d)
blockHash: 0x38bc8fbe8c636b6da90b3320c549fa95b3496eefb5b0891ff02101fe99b13a4b
height: 5
signer: d
txList: new Tx().coinbase(blockReward, d)
blockHash: 0x1a5f26d8e6735c5db8b40283b67b270c9c33b23f8829eef193092cd5c41e5e01
height: 6
signer: d
txList: new Tx().coinbase(blockReward, d)
blockHash: 0x298d89b69d02054ffe9323f4f6fcad3bc0c6d35c1aa85a5dce3417148e73835e
height: 3
signer: c
txList: new Tx().coinbase(blockReward, c)
, new Tx().deposit(1, blockReward, c)
blockHash: 0x51d7c43f1061a533c156961b2a034cfe3eeddf9335e2fdb7da10bdf0e9f82a72
height: 4
signer: c
txList: new Tx().coinbase(blockReward, c)
blockHash: 0xfc90987d81928e1c7a14562dc83f00b89a5fbf035adb16b35df304b31d47007a
height: 4
signer: c
txList: new Tx().coinbase(blockReward, c)
, new Tx().transfer([{prevTx: cb.hash(), outPos: 0}], [{blockReward, addr: d}])