Ecoer Logo

@prolic

28

Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist

steemit.com/@prolic
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS53.10%
Net Worth
2.976USD
STEEM
0.001STEEM
SBD
0.000SBD
Own SP
51.310SP

Detailed Balance

STEEM
balance
0.001STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
51.310SP
Delegated Out
0.000SP
Delegation In
0.000SP
Effective Power
51.310SP
Reward SP (pending)
0.000SP
SBD
sbd_balance
0.000SBD
sbd_conversions
0.000SBD
sbd_market_balance
0.000SBD
savings_sbd_balance
0.000SBD
reward_sbd_balance
0.000SBD
{
  "balance": "0.001 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "83460.555652 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "0.000000 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

nameprolic
id126291
rank39,770
reputation1910831112
created2017-01-14T05:12:42
recovery_accountsteem
proxyNone
post_count5
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2018-04-23T14:27:12
last_root_post2018-04-23T14:27:12
last_vote_time2017-09-20T13:23:51
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power9,800
delayed_votes0
balance0.001 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares83460.555652 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares0.000000 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn0
to_withdraw0
withdraw_routes0
savings_withdraw_requests0
last_account_recovery1970-01-01T00:00:00
reset_accountnull
last_owner_update1970-01-01T00:00:00
last_account_update2018-06-29T19:51:12
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM51ryKkUn9KHP7Y5E1ag686vTtqH9hnPxmq5wssuMvLgsQKiQnx",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "balance": "0.001 STEEM",
  "can_vote": true,
  "comment_count": 0,
  "created": "2017-01-14T05:12:42",
  "curation_rewards": 0,
  "delegated_vesting_shares": "0.000000 VESTS",
  "downvote_manabar": {
    "current_mana": 0,
    "last_update_time": 1484370762
  },
  "guest_bloggers": [],
  "id": 126291,
  "json_metadata": "{\"profile\":{\"profile_image\":\"https://avatars2.githubusercontent.com/u/394428?v=3&s=460\",\"about\":\"Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist\",\"location\":\"Philippines\",\"website\":\"http://www.sasaprolic.com/\"}}",
  "last_account_recovery": "1970-01-01T00:00:00",
  "last_account_update": "2018-06-29T19:51:12",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_post": "2018-04-23T14:27:12",
  "last_root_post": "2018-04-23T14:27:12",
  "last_vote_time": "2017-09-20T13:23:51",
  "lifetime_vote_count": 0,
  "market_history": [],
  "memo_key": "STM6HFc88q1yLFkY5bPjjNW1QBAJyXrLpD3Ash3RKbSfLo1F1mvP1",
  "mined": false,
  "name": "prolic",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "other_history": [],
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM79AAYqqzwugCoMzfP6FZ75nfP453BgpeFJ9pQPLm36jP6sK1Fy",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "pending_claimed_accounts": 0,
  "post_bandwidth": 10065,
  "post_count": 5,
  "post_history": [],
  "posting": {
    "account_auths": [
      [
        "dtube.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM5rmSzdA38vQCajTEpzfCDAXpwzPAEPh4rmDLa7PaUT7DtWKgg6",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting_json_metadata": "{\"profile\":{\"profile_image\":\"https://avatars2.githubusercontent.com/u/394428?v=3&s=460\",\"about\":\"Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist\",\"location\":\"Philippines\",\"website\":\"http://www.sasaprolic.com/\"}}",
  "posting_rewards": 0,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "proxy": "",
  "received_vesting_shares": "0.000000 VESTS",
  "recovery_account": "steem",
  "reputation": 1910831112,
  "reset_account": "null",
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "sbd_balance": "0.000 SBD",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "tags_usage": [],
  "to_withdraw": 0,
  "transfer_history": [],
  "vesting_balance": "0.000 STEEM",
  "vesting_shares": "83460.555652 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "vote_history": [],
  "voting_manabar": {
    "current_mana": 9800,
    "last_update_time": 1505913831
  },
  "voting_power": 9800,
  "withdraw_routes": 0,
  "withdrawn": 0,
  "witness_votes": [],
  "witnesses_voted_for": 0,
  "rank": 39770
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
2020/01/14 05:46:27
authorsteemitboard
bodyCongratulations @prolic! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@prolic/birthday3.png</td><td>Happy Birthday! - You are on the Steem blockchain for 3 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@prolic) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=prolic)_</sub> ###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorprolic
parent permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
permlinksteemitboard-notify-prolic-20200114t054626000z
title
Transaction InfoBlock #39912932/Trx b0d9cf7da34ceeb1fd9c5277568d471ed777a0cb
View Raw JSON Data
{
  "block": 39912932,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @prolic! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@prolic/birthday3.png</td><td>Happy Birthday! - You are on the Steem blockchain for 3 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@prolic) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=prolic)_</sub>\n\n\n###### [Vote for @Steemitboard as a witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1) to get one more award and increased upvotes!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "prolic",
      "parent_permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "permlink": "steemitboard-notify-prolic-20200114t054626000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2020-01-14T05:46:27",
  "trx_id": "b0d9cf7da34ceeb1fd9c5277568d471ed777a0cb",
  "trx_in_block": 8,
  "virtual_op": 0
}
dtubesent 0.001 STEEM to @prolic- "Time is running out, claim your DTube account now before anyone else can! Login at https://d.tube"
2019/08/22 15:30:03
amount0.001 STEEM
fromdtube
memoTime is running out, claim your DTube account now before anyone else can! Login at https://d.tube
toprolic
Transaction InfoBlock #35778612/Trx c59dd61a3464f7d1318aa36069024e05d21a164e
View Raw JSON Data
{
  "block": 35778612,
  "op": [
    "transfer",
    {
      "amount": "0.001 STEEM",
      "from": "dtube",
      "memo": "Time is running out, claim your DTube account now before anyone else can! Login at https://d.tube",
      "to": "prolic"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-08-22T15:30:03",
  "trx_id": "c59dd61a3464f7d1318aa36069024e05d21a164e",
  "trx_in_block": 22,
  "virtual_op": 0
}
2019/01/14 08:33:09
authorsteemitboard
bodyCongratulations @prolic! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@prolic/birthday2.png</td><td>2 Years on Steemit</td></tr></table> <sub>_[Click here to view your Board](https://steemitboard.com/@prolic)_</sub> > Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!
json metadata{"image":["https://steemitboard.com/img/notify.png"]}
parent authorprolic
parent permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
permlinksteemitboard-notify-prolic-20190114t083308000z
title
Transaction InfoBlock #29443504/Trx 4146bfd214ef00eea1acef89ebf65e8ee5cfb21c
View Raw JSON Data
{
  "block": 29443504,
  "op": [
    "comment",
    {
      "author": "steemitboard",
      "body": "Congratulations @prolic! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@prolic/birthday2.png</td><td>2 Years on Steemit</td></tr></table>\n\n<sub>_[Click here to view your Board](https://steemitboard.com/@prolic)_</sub>\n\n\n> Support [SteemitBoard's project](https://steemit.com/@steemitboard)! **[Vote for its witness](https://v2.steemconnect.com/sign/account-witness-vote?witness=steemitboard&approve=1)** and **get one more award**!",
      "json_metadata": "{\"image\":[\"https://steemitboard.com/img/notify.png\"]}",
      "parent_author": "prolic",
      "parent_permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "permlink": "steemitboard-notify-prolic-20190114t083308000z",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2019-01-14T08:33:09",
  "trx_id": "4146bfd214ef00eea1acef89ebf65e8ee5cfb21c",
  "trx_in_block": 6,
  "virtual_op": 0
}
2018/11/04 03:02:36
authorprolic
permlinkauthorization-and-event-sourcing-with-prooph-and-zf2-zf3
voterkeithyoungblood
weight10000 (100.00%)
Transaction InfoBlock #27393419/Trx 2eac1d194890a4aefbba566a8fa03badcc54b037
View Raw JSON Data
{
  "block": 27393419,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "authorization-and-event-sourcing-with-prooph-and-zf2-zf3",
      "voter": "keithyoungblood",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-11-04T03:02:36",
  "trx_id": "2eac1d194890a4aefbba566a8fa03badcc54b037",
  "trx_in_block": 23,
  "virtual_op": 0
}
2018/06/29 19:51:36
idfollow
json["follow",{"follower":"prolic","following":"samuel-johnson","what":["blog"]}]
required auths[]
required posting auths["prolic"]
Transaction InfoBlock #23755255/Trx 434bb491167554139feffbc556ebef96ec8406c0
View Raw JSON Data
{
  "block": 23755255,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"prolic\",\"following\":\"samuel-johnson\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "prolic"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-29T19:51:36",
  "trx_id": "434bb491167554139feffbc556ebef96ec8406c0",
  "trx_in_block": 47,
  "virtual_op": 0
}
prolicupdated their account properties
2018/06/29 19:51:12
accountprolic
json metadata{"profile":{"profile_image":"https://avatars2.githubusercontent.com/u/394428?v=3&s=460","about":"Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist","location":"Philippines","website":"http://www.sasaprolic.com/"}}
memo keySTM6HFc88q1yLFkY5bPjjNW1QBAJyXrLpD3Ash3RKbSfLo1F1mvP1
posting{"account_auths":[["dtube.app",1]],"key_auths":[["STM5rmSzdA38vQCajTEpzfCDAXpwzPAEPh4rmDLa7PaUT7DtWKgg6",1]],"weight_threshold":1}
Transaction InfoBlock #23755247/Trx 5120e543e24a07b55a1aa30315f54642935df95d
View Raw JSON Data
{
  "block": 23755247,
  "op": [
    "account_update",
    {
      "account": "prolic",
      "json_metadata": "{\"profile\":{\"profile_image\":\"https://avatars2.githubusercontent.com/u/394428?v=3&s=460\",\"about\":\"Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist\",\"location\":\"Philippines\",\"website\":\"http://www.sasaprolic.com/\"}}",
      "memo_key": "STM6HFc88q1yLFkY5bPjjNW1QBAJyXrLpD3Ash3RKbSfLo1F1mvP1",
      "posting": {
        "account_auths": [
          [
            "dtube.app",
            1
          ]
        ],
        "key_auths": [
          [
            "STM5rmSzdA38vQCajTEpzfCDAXpwzPAEPh4rmDLa7PaUT7DtWKgg6",
            1
          ]
        ],
        "weight_threshold": 1
      }
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-06-29T19:51:12",
  "trx_id": "5120e543e24a07b55a1aa30315f54642935df95d",
  "trx_in_block": 9,
  "virtual_op": 0
}
2018/04/23 23:23:42
authorprolic
permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
votershamg
weight10000 (100.00%)
Transaction InfoBlock #21831558/Trx bb0c4167662af7b6d125357858f47e23e94a5331
View Raw JSON Data
{
  "block": 21831558,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "voter": "shamg",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-23T23:23:42",
  "trx_id": "bb0c4167662af7b6d125357858f47e23e94a5331",
  "trx_in_block": 13,
  "virtual_op": 0
}
2018/04/23 23:23:39
authorprolic
permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
votersimona2001
weight10000 (100.00%)
Transaction InfoBlock #21831557/Trx 5e23309d3f4c9c6506d438a75ca1a9c86110eaaf
View Raw JSON Data
{
  "block": 21831557,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "voter": "simona2001",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-23T23:23:39",
  "trx_id": "5e23309d3f4c9c6506d438a75ca1a9c86110eaaf",
  "trx_in_block": 60,
  "virtual_op": 0
}
2018/04/23 23:23:39
authorprolic
permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
voteruryvs
weight10000 (100.00%)
Transaction InfoBlock #21831557/Trx 5d9293d9f28101057ab149a46b5d084c1c46f697
View Raw JSON Data
{
  "block": 21831557,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "voter": "uryvs",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-23T23:23:39",
  "trx_id": "5d9293d9f28101057ab149a46b5d084c1c46f697",
  "trx_in_block": 28,
  "virtual_op": 0
}
2018/04/23 14:27:36
authorcheetah
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: http://www.sasaprolic.com/
json metadata
parent authorprolic
parent permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
permlinkcheetah-re-prolicwhy-there-will-be-no-kafka-eventstore-in-prooph
title
Transaction InfoBlock #21821234/Trx 955a83424aa52772c4b7210641dfce90948a590e
View Raw JSON Data
{
  "block": 21821234,
  "op": [
    "comment",
    {
      "author": "cheetah",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttp://www.sasaprolic.com/",
      "json_metadata": "",
      "parent_author": "prolic",
      "parent_permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "permlink": "cheetah-re-prolicwhy-there-will-be-no-kafka-eventstore-in-prooph",
      "title": ""
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-23T14:27:36",
  "trx_id": "955a83424aa52772c4b7210641dfce90948a590e",
  "trx_in_block": 40,
  "virtual_op": 0
}
2018/04/23 14:27:30
authorprolic
permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
votercheetah
weight8 (0.08%)
Transaction InfoBlock #21821232/Trx 7da4d48dd0d02673976411bbeb7a6748793e6918
View Raw JSON Data
{
  "block": 21821232,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "voter": "cheetah",
      "weight": 8
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-23T14:27:30",
  "trx_id": "7da4d48dd0d02673976411bbeb7a6748793e6918",
  "trx_in_block": 7,
  "virtual_op": 0
}
2018/04/23 14:27:21
authorprolic
permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
voterax3
weight100 (1.00%)
Transaction InfoBlock #21821229/Trx 51ed5f322396024756697a503cf4a49c1ea53d29
View Raw JSON Data
{
  "block": 21821229,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "voter": "ax3",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-23T14:27:21",
  "trx_id": "51ed5f322396024756697a503cf4a49c1ea53d29",
  "trx_in_block": 51,
  "virtual_op": 0
}
2018/04/23 14:27:12
authorprolic
bodytl;dr When even Greg Young, the author of the original EventStore implementation (http://geteventstore.com/) says that it's a bad idea to implement a Kafka EventStore, than it's a bad idea. The prooph-team will not provide a Kafka EventStore implementation. Before we begin, let's see what requirements we need from an event-store: - Concurrency checks When an event with same version is appended twice to the event-store, only the first attempt is allowed to succeed. This is very important, imagine you have multiple processes inserting event to an existing stream, let's say we have an an existing aggregate with only one event (version 1). Now two processes insert two events, so we have: event 1, event 2, event 2', event 3, event 3'. Next another process is inserting an event 4. If the consumer of the stream has to decide whether or not an event belongs to the stream, it's a hard decision now, because we could have the following possible event streams: event 1, event 2, event 3, event 4 or event 1, event 2', event 3, event 4 or event 1, event 2, event 3', event 4 or event 1, event 2', event 3', event 4. Additionally you can't rely on timing (let's say event 2 was inserted slightly before event 2'), because on a different data center the order could be the other way around. The matter complicates the further the event stream goes. And this is not a blockchain-like problem, where simply the longest chain wins, because sometimes, there will be no more additional events to an existing stream. I have to add, that this concurrency check requirement and version constraint might not be needed for all use-cases, in some applications it might be okay to just record whatever happened and versions / order don't matter at all (or not that much), but for a general purpose event-store implementation (where you don't wanna put dozens of warnings, and stuff), this will only bring problems and lot of bug-reports. - One stream per aggregate In the original event-store implementation of Greg Young (https://github.com/EventStore/EventStore), there is by default one stream per aggregate. That means that not all events related to aggregate type "User" are stored in a single stream, but that we have one stream for each aggregate, f.e. "User-<user_id_1>", "User-<user_id_2>", "User-<user_id_3>", ... This option is also available for prooph-event-store, limiting the usage to disallow this strategy is possibile, but not really wanted. To quote Greg Young: "You need stream per aggregate not type. You can do single aggregate instance for all instances but it's yucky" - Store forever While at first glance obvious, the event store should persist the event forever, it's not allowed to be removed, garbage collected or deleted on server shutdown. - Querying event offset Another quite obvious thing to consider at first: Given you loaded an aggregate from a snapshot, you already have it at a specific version (let's say event version is 10 f.e.). Then you only need to load events starting from 11. This is especially important, once you have thousands of events in an aggregate (imagine you would need to load all 5000 events again, instead of only the last 3, event when you have a snapshot). Even more important when one stream per aggregate is not possible. Now let's look at what Kafka has to offer: - Concurrency checks Well, Kafka hasn't that. It would not be such a problem with something like actor model, to quote Greg Young again: >> I also really like the idea of in memory models (especially when built >> up as actors in say erlang or akka). One of the main benefits here is >> that the actor infrastructure can assure you a single instance in the >> cluster and gets rid of things like the need for optimistic concurrency. >> >> Greg This this one is a really big issue. - One stream per aggregate If I have thousands of aggregates and each have a topic, Kafka (and ZooKeeper specifically) will explode. These are real problems with Kafka. ZooKeeper can't handle 10M partitions right now. - Store forever On Kafka events expire! Yes really, they expire! Fortunately enough, with never versions of Kafka, you can configure it to not expire messages at all (day saved!). - Querying event offset Here we go, that's not possibile with Kafka! Combine that with the "One stream per aggregate" problem, and here we go full nightmare. It's simply not reasonable to read millions or even billions of events, just to replay the 5 events you're interessted in to your aggregate root. Way around some limitations: - Use some actor modelish implementation (like Akka) - this would solve the "Concurrency checks" issue and well as the "Queryingevent offset" issue, because you can use stuff like "idempotent producer semantics" (to track producer id and position in event stream) and in-memory checks of aggregates, to go around the concurrency checks requirement. But prooph are PHP components and even if we would implement some akka-like infrastructure, that would be a rare use-case that someone wanted to use this implementation. Another interessting quote from Greg Young about an Kafka EventStore: >> Most systems have some amount of data that is "live" and some much >> larger amount of data that is essentially "historical" a perfect example >> of this might be mortgage applications in a bank. There is some tiny % >> that are currently in process in the system and a vast number that are >> "done". >> >> If you wanted to just put everything into one stream you would need to >> hydrate all of them and keep them in memory (even the ones you really >> don't care about any more). >> >> This can turn into a very expensive operation/decision. >> >> Cheers, >> >> Greg and also this one: >> Most of the systems discussed are not really event sourced they just >> raise events and are distributing them. They do not keep their events as >> their source of truth (they just throw them away). They don't do things >> like replaying (which is kind of the benchmark) >> >> Not everyone who sends a message is "event sourcing" >> >> Greg Final thoughts: Kafka is great for stream processing. With enqueue (github.com/php-enqueue/enqueue-dev) and prooph's enqueue-producer (github.com/prooph/psb-enqueue-producer/) you can already send messages to Kafka for processing. So send your messages to Kafka, if you need or want to. In my opinion a Kafka EventStore implementation would be very limited and not useful for most of the PHP applications build. Therefor I think there will never be a Kafka EventStore implementation (not in prooph, nor in any other programming language - correct me if I'm wrong and you know an open source Kafka EventStore implementation somewhere!). When even Greg Young things a Kafka EventStore is a bad idea, I'm at least not the only one out there. References: Most of the Greg Young quotes about an Kafka EventStore are taken from here: https://groups.google.com/forum/#!topic/dddcqrs/rm02iCfffUY I recommend this thread for everyone you wants to dig deaper into the problems with Kafka as an EventStore.
json metadata{"tags":["php","prooph","kafka","programming"],"links":["http://geteventstore.com/","https://github.com/EventStore/EventStore","https://groups.google.com/forum/#!topic/dddcqrs/rm02iCfffUY"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkphp
permlinkwhy-there-will-be-no-kafka-eventstore-in-prooph
titleWhy there will be no Kafka EventStore in prooph
Transaction InfoBlock #21821226/Trx 57613daa8f5e1f3d72cd095014bdc76a2c10276a
View Raw JSON Data
{
  "block": 21821226,
  "op": [
    "comment",
    {
      "author": "prolic",
      "body": "tl;dr\n\n\nWhen even Greg Young, the author of the original EventStore implementation (http://geteventstore.com/) says that it's a bad idea to implement a Kafka EventStore, than it's a bad idea. The prooph-team will not provide a Kafka EventStore implementation.\n\n\nBefore we begin, let's see what requirements we need from an event-store:\n\n\n- Concurrency checks\n\n  When an event with same version is appended twice to the event-store, only the first attempt is allowed to succeed. This is very important, imagine you have multiple processes inserting event to an existing stream, let's say we have an an existing aggregate with only one event (version 1). Now two processes insert two events, so we have: event 1, event 2, event 2', event 3, event 3'. Next another process is inserting an event 4. If the consumer of the stream has to decide whether or not an event belongs to the stream, it's a hard decision now, because we could have the following possible event streams: event 1, event 2, event 3, event 4 or event 1, event 2', event 3, event 4 or event 1, event 2, event 3', event 4 or event 1, event 2', event 3', event 4. Additionally you can't rely on timing (let's say event 2 was inserted slightly before event 2'), because on a different data center the order could be the other way around. The matter complicates the further the event stream goes. And this is not a blockchain-like problem, where simply the longest chain wins, because sometimes, there will be no more additional events to an existing stream. I have to add, that this concurrency check requirement and version constraint might not be needed for all use-cases, in some applications it might be okay to just record whatever happened and versions / order don't matter at all (or not that much), but for a general purpose event-store implementation (where you don't wanna put dozens of warnings, and stuff), this will only bring problems and lot of bug-reports.\n\n\n- One stream per aggregate\n\n  In the original event-store implementation of Greg Young (https://github.com/EventStore/EventStore), there is by default one stream per aggregate. That means that not all events related to aggregate type \"User\" are stored in a single stream, but that we have one stream for each aggregate, f.e. \"User-<user_id_1>\", \"User-<user_id_2>\", \"User-<user_id_3>\", ...\n\n  This option is also available for prooph-event-store, limiting the usage to disallow this strategy is possibile, but not really wanted.\n\n  To quote Greg Young: \"You need stream per aggregate not type. You can do single aggregate instance for all instances but it's yucky\"\n\n\n- Store forever\n\n  While at first glance obvious, the event store should persist the event forever, it's not allowed to be removed, garbage collected or deleted on server shutdown.\n\n\n- Querying event offset\n\n  Another quite obvious thing to consider at first: Given you loaded an aggregate from a snapshot, you already have it at a specific version (let's say event version is 10 f.e.). Then you only need to load events starting from 11. This is especially important, once you have thousands of events in an aggregate (imagine you would need to load all 5000 events again, instead of only the last 3, event when you have a snapshot). Even more important when one stream per aggregate is not possible.\n\n \n\n\nNow let's look at what Kafka has to offer:\n\n\n- Concurrency checks\n\n\n  Well, Kafka hasn't that. It would not be such a problem with something like actor model, to quote Greg Young again:\n\n  >> I also really like the idea of in memory models (especially when built\n\n  >> up as actors in say erlang or akka). One of the main benefits here is\n\n  >> that the actor infrastructure can assure you a single instance in the\n\n  >> cluster and gets rid of things like the need for optimistic concurrency.\n\n  >>\n\n  >> Greg\n\n  This this one is a really big issue.\n\n\n- One stream per aggregate\n\n  If I have thousands of aggregates and each have a topic, Kafka (and ZooKeeper specifically) will explode. These are real problems with Kafka. ZooKeeper can't handle 10M partitions right now.\n\n\n- Store forever\n\n  On Kafka events expire! Yes really, they expire! Fortunately enough, with never versions of Kafka, you can configure it to not expire messages at all (day saved!).\n\n\n- Querying event offset\n\n  Here we go, that's not possibile with Kafka! Combine that with the \"One stream per aggregate\" problem, and here we go full nightmare. It's simply not reasonable to read millions or even billions of events, just to replay the 5 events you're interessted in to your aggregate root.\n\n\nWay around some limitations:\n\n\n- Use some actor modelish implementation (like Akka) - this would solve the \"Concurrency checks\" issue and well as the\n\n  \"Queryingevent offset\" issue, because you can use stuff like \"idempotent producer semantics\" (to track producer id and position in event stream) and in-memory checks of aggregates, to go around the concurrency checks requirement. But prooph are PHP components and even if we would implement some akka-like infrastructure, that would be a rare use-case that someone wanted to use this implementation.\n\n \n\n \n\nAnother interessting quote from Greg Young about an Kafka EventStore:\n\n\n>> Most systems have some amount of data that is \"live\" and some much\n\n>> larger amount of data that is essentially \"historical\" a perfect example\n\n>> of this might be mortgage applications in a bank. There is some tiny %\n\n>> that are currently in process in the system and a vast number that are\n\n>> \"done\".\n\n>>\n\n>> If you wanted to just put everything into one stream you would need to\n\n>> hydrate all of them and keep them in memory (even the ones you really\n\n>> don't care about any more).\n\n>>\n\n>> This can turn into a very expensive operation/decision.\n\n>>\n\n>> Cheers,\n\n>>\n\n>> Greg\n\n\nand also this one:\n\n\n>> Most of the systems discussed are not really event sourced they just\n\n>> raise events and are distributing them. They do not keep their events as\n\n>> their source of truth (they just throw them away). They don't do things\n\n>> like replaying (which is kind of the benchmark)\n\n>>\n\n>> Not everyone who sends a message is \"event sourcing\"\n\n>>\n\n>> Greg\n\n\nFinal thoughts:\n\n\nKafka is great for stream processing. With enqueue (github.com/php-enqueue/enqueue-dev) and prooph's enqueue-producer (github.com/prooph/psb-enqueue-producer/) you can already send messages to Kafka for processing. So send your messages to Kafka, if you need or want to.\n\nIn my opinion a Kafka EventStore implementation would be very limited and not useful for most of the PHP applications build. Therefor I think there will never be a Kafka EventStore implementation (not in prooph, nor in any other programming language - correct me if I'm wrong and you know an open source Kafka EventStore implementation somewhere!).\n\nWhen even Greg Young things a Kafka EventStore is a bad idea, I'm at least not the only one out there.\n\n\nReferences:\n\n\nMost of the Greg Young quotes about an Kafka EventStore are taken from here: https://groups.google.com/forum/#!topic/dddcqrs/rm02iCfffUY\n\nI recommend this thread for everyone you wants to dig deaper into the problems with Kafka as an EventStore.",
      "json_metadata": "{\"tags\":[\"php\",\"prooph\",\"kafka\",\"programming\"],\"links\":[\"http://geteventstore.com/\",\"https://github.com/EventStore/EventStore\",\"https://groups.google.com/forum/#!topic/dddcqrs/rm02iCfffUY\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "php",
      "permlink": "why-there-will-be-no-kafka-eventstore-in-prooph",
      "title": "Why there will be no Kafka EventStore in prooph"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2018-04-23T14:27:12",
  "trx_id": "57613daa8f5e1f3d72cd095014bdc76a2c10276a",
  "trx_in_block": 25,
  "virtual_op": 0
}
ubgupvoted (1.00%) @prolic / 3izhf8rx
2017/09/20 13:38:54
authorprolic
permlink3izhf8rx
voterubg
weight100 (1.00%)
Transaction InfoBlock #15633332/Trx 535a740509495e9487cb5545f0a1054974e724bf
View Raw JSON Data
{
  "block": 15633332,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "3izhf8rx",
      "voter": "ubg",
      "weight": 100
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-09-20T13:38:54",
  "trx_id": "535a740509495e9487cb5545f0a1054974e724bf",
  "trx_in_block": 26,
  "virtual_op": 0
}
prolicupvoted (100.00%) @prolic / 3izhf8rx
2017/09/20 13:23:51
authorprolic
permlink3izhf8rx
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #15633031/Trx b98fe117e457b9eb6cc4c419356a2f8c4428c452
View Raw JSON Data
{
  "block": 15633031,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "3izhf8rx",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-09-20T13:23:51",
  "trx_id": "b98fe117e457b9eb6cc4c419356a2f8c4428c452",
  "trx_in_block": 3,
  "virtual_op": 0
}
ipfs01upvoted (15.00%) @prolic / 3izhf8rx
2017/09/20 13:20:42
authorprolic
permlink3izhf8rx
voteripfs01
weight1500 (15.00%)
Transaction InfoBlock #15632968/Trx 77fc90e8305f5dde2134b7529783efc9bae31eef
View Raw JSON Data
{
  "block": 15632968,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "3izhf8rx",
      "voter": "ipfs01",
      "weight": 1500
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-09-20T13:20:42",
  "trx_id": "77fc90e8305f5dde2134b7529783efc9bae31eef",
  "trx_in_block": 16,
  "virtual_op": 0
}
prolicupdated options for 3izhf8rx
2017/09/20 13:19:54
allow curation rewardstrue
allow votestrue
authorprolic
extensions[[0,{"beneficiaries":[{"account":"dtube","weight":2500}]}]]
max accepted payout1000000.000 SBD
percent steem dollars10000
permlink3izhf8rx
Transaction InfoBlock #15632952/Trx c2ee51b094e32f65f366ecadf5a29aca71da3865
View Raw JSON Data
{
  "block": 15632952,
  "op": [
    "comment_options",
    {
      "allow_curation_rewards": true,
      "allow_votes": true,
      "author": "prolic",
      "extensions": [
        [
          0,
          {
            "beneficiaries": [
              {
                "account": "dtube",
                "weight": 2500
              }
            ]
          }
        ]
      ],
      "max_accepted_payout": "1000000.000 SBD",
      "percent_steem_dollars": 10000,
      "permlink": "3izhf8rx"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-09-20T13:19:54",
  "trx_id": "c2ee51b094e32f65f366ecadf5a29aca71da3865",
  "trx_in_block": 2,
  "virtual_op": 0
}
prolicpublished a new post: 3izhf8rx
2017/09/20 13:19:54
authorprolic
body<center><a href='https://dtube.video/#!/v/prolic/3izhf8rx'><img src='https://ipfs.io/ipfs/QmRwUHrnRWoRD8ckq8KBNi3vdipDi1qT3wp4jtz2AsrJau'></a></center><hr>Changes and new features in prooph event-store v7 github.com/prooph/event-store github.com/prooph/pdo-event-store gitter.im/prooph/improoph<hr><a href='https://dtube.video/#!/v/prolic/3izhf8rx'>► Watch on DTube</a><br /><a href='https://earth.i.ipfs.io/ipfs/QmcHvTxXofubT5aQ3dEVa8oski3CyJRAuvLikAeAoKPDLp'>► Watch Source (IPFS)</a>
json metadata{"video":{"info":{"title":"Prooph Event Store v7","snaphash":"QmRwUHrnRWoRD8ckq8KBNi3vdipDi1qT3wp4jtz2AsrJau","author":"prolic","permlink":"3izhf8rx"},"content":{"videohash":"QmcHvTxXofubT5aQ3dEVa8oski3CyJRAuvLikAeAoKPDLp","description":"Changes and new features in prooph event-store v7 \n\ngithub.com/prooph/event-store\ngithub.com/prooph/pdo-event-store\n\ngitter.im/prooph/improoph","tags":["dtube","dtube-prooph","dtube-php","dtube-eventsourcing","dtube-ddd"]},"_id":"4913edea8a7c0b5a571e8e6acf212ff7"},"tags":["dtube","dtube-prooph","dtube-php","dtube-eventsourcing","dtube-ddd"],"app":"dtube/0.3"}
parent author
parent permlinkdtube
permlink3izhf8rx
titleProoph Event Store v7
Transaction InfoBlock #15632952/Trx c2ee51b094e32f65f366ecadf5a29aca71da3865
View Raw JSON Data
{
  "block": 15632952,
  "op": [
    "comment",
    {
      "author": "prolic",
      "body": "<center><a href='https://dtube.video/#!/v/prolic/3izhf8rx'><img src='https://ipfs.io/ipfs/QmRwUHrnRWoRD8ckq8KBNi3vdipDi1qT3wp4jtz2AsrJau'></a></center><hr>Changes and new features in prooph event-store v7 \n\ngithub.com/prooph/event-store\ngithub.com/prooph/pdo-event-store\n\ngitter.im/prooph/improoph<hr><a href='https://dtube.video/#!/v/prolic/3izhf8rx'>► Watch on DTube</a><br /><a href='https://earth.i.ipfs.io/ipfs/QmcHvTxXofubT5aQ3dEVa8oski3CyJRAuvLikAeAoKPDLp'>► Watch Source (IPFS)</a>",
      "json_metadata": "{\"video\":{\"info\":{\"title\":\"Prooph Event Store v7\",\"snaphash\":\"QmRwUHrnRWoRD8ckq8KBNi3vdipDi1qT3wp4jtz2AsrJau\",\"author\":\"prolic\",\"permlink\":\"3izhf8rx\"},\"content\":{\"videohash\":\"QmcHvTxXofubT5aQ3dEVa8oski3CyJRAuvLikAeAoKPDLp\",\"description\":\"Changes and new features in prooph event-store v7 \\n\\ngithub.com/prooph/event-store\\ngithub.com/prooph/pdo-event-store\\n\\ngitter.im/prooph/improoph\",\"tags\":[\"dtube\",\"dtube-prooph\",\"dtube-php\",\"dtube-eventsourcing\",\"dtube-ddd\"]},\"_id\":\"4913edea8a7c0b5a571e8e6acf212ff7\"},\"tags\":[\"dtube\",\"dtube-prooph\",\"dtube-php\",\"dtube-eventsourcing\",\"dtube-ddd\"],\"app\":\"dtube/0.3\"}",
      "parent_author": "",
      "parent_permlink": "dtube",
      "permlink": "3izhf8rx",
      "title": "Prooph Event Store v7"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-09-20T13:19:54",
  "trx_id": "c2ee51b094e32f65f366ecadf5a29aca71da3865",
  "trx_in_block": 2,
  "virtual_op": 0
}
prolicfollowed @dtube
2017/09/20 12:28:33
idfollow
json["follow",{"follower":"prolic","following":"dtube","what":["blog"]}]
required auths[]
required posting auths["prolic"]
Transaction InfoBlock #15631925/Trx 5c04850957b865280c786d578a01509caace9ebb
View Raw JSON Data
{
  "block": 15631925,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"prolic\",\"following\":\"dtube\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "prolic"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-09-20T12:28:33",
  "trx_id": "5c04850957b865280c786d578a01509caace9ebb",
  "trx_in_block": 9,
  "virtual_op": 0
}
2017/03/14 04:18:57
authoroliver-janich
permlinkspam-attack-a-new-method-of-censorship-seems-emerges-on-facebook
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #10156816/Trx a5467f404c8e33340d1d77addffe8c111330f5e1
View Raw JSON Data
{
  "block": 10156816,
  "op": [
    "vote",
    {
      "author": "oliver-janich",
      "permlink": "spam-attack-a-new-method-of-censorship-seems-emerges-on-facebook",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-03-14T04:18:57",
  "trx_id": "a5467f404c8e33340d1d77addffe8c111330f5e1",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:29:36
authorscreenname
permlinkre-rip-udo-ulfkotte-20170115t010827
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495418/Trx 7db664186fc1745cf38a1791f150d6aa18f874e7
View Raw JSON Data
{
  "block": 8495418,
  "op": [
    "vote",
    {
      "author": "screenname",
      "permlink": "re-rip-udo-ulfkotte-20170115t010827",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:29:36",
  "trx_id": "7db664186fc1745cf38a1791f150d6aa18f874e7",
  "trx_in_block": 2,
  "virtual_op": 0
}
2017/01/15 10:29:30
authorhomeartpictures
permlinkre-polluxone-rip-udo-ulfkotte-20170114t150704700z
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495416/Trx 54fd8f57f5a79a06ac0bcb56070dd6b7331f1b2a
View Raw JSON Data
{
  "block": 8495416,
  "op": [
    "vote",
    {
      "author": "homeartpictures",
      "permlink": "re-polluxone-rip-udo-ulfkotte-20170114t150704700z",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:29:30",
  "trx_id": "54fd8f57f5a79a06ac0bcb56070dd6b7331f1b2a",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:29:18
authorpollux.one
permlinkrip-udo-ulfkotte
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495412/Trx f36c7c69f10ec06a158fc87c8df5e864975eaa9c
View Raw JSON Data
{
  "block": 8495412,
  "op": [
    "vote",
    {
      "author": "pollux.one",
      "permlink": "rip-udo-ulfkotte",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:29:18",
  "trx_id": "f36c7c69f10ec06a158fc87c8df5e864975eaa9c",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:27:21
authorstevemilne
permlinkthe-real-truth-about-the-trump-intelligence-dossier-and-the-mi6-agent-involved
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495373/Trx df20075b621ff562e880f2beebfe96e5418c7f32
View Raw JSON Data
{
  "block": 8495373,
  "op": [
    "vote",
    {
      "author": "stevemilne",
      "permlink": "the-real-truth-about-the-trump-intelligence-dossier-and-the-mi6-agent-involved",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:27:21",
  "trx_id": "df20075b621ff562e880f2beebfe96e5418c7f32",
  "trx_in_block": 2,
  "virtual_op": 0
}
2017/01/15 10:26:15
authorlarkenrose
permlinkcivil-rights-fairness-fascism
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495351/Trx b8b3bb547f438cef20931cf2481f07ab64e933f6
View Raw JSON Data
{
  "block": 8495351,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "civil-rights-fairness-fascism",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:26:15",
  "trx_id": "b8b3bb547f438cef20931cf2481f07ab64e933f6",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:26:12
authorlarkenrose
permlinkstar-spangled-bullpoop
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495350/Trx a2e4382f6474ea81d92daef3da89331c9430e2c2
View Raw JSON Data
{
  "block": 8495350,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "star-spangled-bullpoop",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:26:12",
  "trx_id": "a2e4382f6474ea81d92daef3da89331c9430e2c2",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:26:06
authorlarkenrose
permlinka-test-of-consistency
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495348/Trx aee1afee778494a567ae547a338afc5950c5ff0d
View Raw JSON Data
{
  "block": 8495348,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "a-test-of-consistency",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:26:06",
  "trx_id": "aee1afee778494a567ae547a338afc5950c5ff0d",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:26:03
authorlarkenrose
permlinkdissecting-the-statist-mind
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495347/Trx 04beb1c3ae7d60984ae443bf9dbd65f6a8f20cd1
View Raw JSON Data
{
  "block": 8495347,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "dissecting-the-statist-mind",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:26:03",
  "trx_id": "04beb1c3ae7d60984ae443bf9dbd65f6a8f20cd1",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:25:57
authorlarkenrose
permlinkcan-we-trust-the-market
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495345/Trx e09ef807bb93cce96b437d4d0aa90722d714a9a1
View Raw JSON Data
{
  "block": 8495345,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "can-we-trust-the-market",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:25:57",
  "trx_id": "e09ef807bb93cce96b437d4d0aa90722d714a9a1",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:25:27
authorlarkenrose
permlinkdmv-a-study-in-stupidity
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495335/Trx c6e7a714a15640f3e450c598f541d34c6b16cb22
View Raw JSON Data
{
  "block": 8495335,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "dmv-a-study-in-stupidity",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:25:27",
  "trx_id": "c6e7a714a15640f3e450c598f541d34c6b16cb22",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:25:24
authorlarkenrose
permlinkin-your-home-town
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495334/Trx 9094048c036864cbe6127a73aed6e49896a87ccc
View Raw JSON Data
{
  "block": 8495334,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "in-your-home-town",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:25:24",
  "trx_id": "9094048c036864cbe6127a73aed6e49896a87ccc",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:25:15
authorlarkenrose
permlinkgood-intentions-politics-evil-crap
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495331/Trx 41db5a812c7224a47a9e5626872bb7aa3b7aef99
View Raw JSON Data
{
  "block": 8495331,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "good-intentions-politics-evil-crap",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:25:15",
  "trx_id": "41db5a812c7224a47a9e5626872bb7aa3b7aef99",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:25:12
authorlarkenrose
permlinkchoosing-the-battleground
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495330/Trx 39ea0daaf8c48bd91261af131936bb5d8a14a6c1
View Raw JSON Data
{
  "block": 8495330,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "choosing-the-battleground",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:25:12",
  "trx_id": "39ea0daaf8c48bd91261af131936bb5d8a14a6c1",
  "trx_in_block": 2,
  "virtual_op": 0
}
2017/01/15 10:20:00
authorlarkenrose
permlinkall-i-am-asking
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495226/Trx aba2c445451528a2dc1c80489d9ed910ad69665b
View Raw JSON Data
{
  "block": 8495226,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "all-i-am-asking",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:20:00",
  "trx_id": "aba2c445451528a2dc1c80489d9ed910ad69665b",
  "trx_in_block": 2,
  "virtual_op": 0
}
2017/01/15 10:20:00
authorlarkenrose
permlinkline-in-the-sand
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495226/Trx 8a9dce376d78e2fb8dfd45d01bf657ca7417a32a
View Raw JSON Data
{
  "block": 8495226,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "line-in-the-sand",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:20:00",
  "trx_id": "8a9dce376d78e2fb8dfd45d01bf657ca7417a32a",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:19:57
authorlarkenrose
permlinkhow-to-enslave-the-world
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495225/Trx dc03579e3b8195d7340f0341c930125145acf862
View Raw JSON Data
{
  "block": 8495225,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "how-to-enslave-the-world",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:19:57",
  "trx_id": "dc03579e3b8195d7340f0341c930125145acf862",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:19:54
authorlarkenrose
permlinkpolitical-mythology-101-part-one
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495224/Trx bc09097f65e0135aab233940b2bbacc43fbf811d
View Raw JSON Data
{
  "block": 8495224,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "political-mythology-101-part-one",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:19:54",
  "trx_id": "bc09097f65e0135aab233940b2bbacc43fbf811d",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:19:48
authorlarkenrose
permlinkpolitical-mythology-101-part-three
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495222/Trx 9d46e750bf77f4aa49b0beaee648c36258a1cd82
View Raw JSON Data
{
  "block": 8495222,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "political-mythology-101-part-three",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:19:48",
  "trx_id": "9d46e750bf77f4aa49b0beaee648c36258a1cd82",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:19:42
authorlarkenrose
permlinklove-it-or-leave-it
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495220/Trx 8cc4ed8505d3c3e46a18bbd4086fb24ba857f614
View Raw JSON Data
{
  "block": 8495220,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "love-it-or-leave-it",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:19:42",
  "trx_id": "8cc4ed8505d3c3e46a18bbd4086fb24ba857f614",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:19:33
authorlarkenrose
permlinkyou-should-be-offended
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495217/Trx 8096c986db43968c0d951ac7e0ab02712795442c
View Raw JSON Data
{
  "block": 8495217,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "you-should-be-offended",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:19:33",
  "trx_id": "8096c986db43968c0d951ac7e0ab02712795442c",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:19:27
authorlarkenrose
permlinkgovernment-evil-no-joke
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495215/Trx 113d0a5154cb14f64d627457fcdfe4bcabb66def
View Raw JSON Data
{
  "block": 8495215,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "government-evil-no-joke",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:19:27",
  "trx_id": "113d0a5154cb14f64d627457fcdfe4bcabb66def",
  "trx_in_block": 2,
  "virtual_op": 0
}
2017/01/15 10:19:09
authorlarkenrose
permlinkarguing-with-yourself
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495209/Trx abe0788e1425c53edcd6584394b6b75b219fc9e1
View Raw JSON Data
{
  "block": 8495209,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "arguing-with-yourself",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:19:09",
  "trx_id": "abe0788e1425c53edcd6584394b6b75b219fc9e1",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:18:51
authorlarkenrose
permlinkprinciples-and-predictions
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495203/Trx 580b5a1333622bc9f3160587cbc7e4b6a2ebcc48
View Raw JSON Data
{
  "block": 8495203,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "principles-and-predictions",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:51",
  "trx_id": "580b5a1333622bc9f3160587cbc7e4b6a2ebcc48",
  "trx_in_block": 13,
  "virtual_op": 0
}
2017/01/15 10:18:51
authorlarkenrose
permlinkthe-power-vacuum-argument
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495203/Trx 50bbfd48e93e2f6565ff5d15c029517c4f196370
View Raw JSON Data
{
  "block": 8495203,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "the-power-vacuum-argument",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:51",
  "trx_id": "50bbfd48e93e2f6565ff5d15c029517c4f196370",
  "trx_in_block": 1,
  "virtual_op": 0
}
prolicupvoted (100.00%) @larkenrose / rebel-posers
2017/01/15 10:18:48
authorlarkenrose
permlinkrebel-posers
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495202/Trx 41c95b39919fbd99dda690431a7881cad0cfee70
View Raw JSON Data
{
  "block": 8495202,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "rebel-posers",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:48",
  "trx_id": "41c95b39919fbd99dda690431a7881cad0cfee70",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:18:45
authorlarkenrose
permlinklaw-and-order-sucks
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495201/Trx a8d7b081b0c23f019dbb05b876c1189273c6fad7
View Raw JSON Data
{
  "block": 8495201,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "law-and-order-sucks",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:45",
  "trx_id": "a8d7b081b0c23f019dbb05b876c1189273c6fad7",
  "trx_in_block": 5,
  "virtual_op": 0
}
2017/01/15 10:18:39
authorlarkenrose
permlinksupply-and-demand-steemit-style
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495199/Trx 5059dee3deb1946338a95272bd12938601211908
View Raw JSON Data
{
  "block": 8495199,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "supply-and-demand-steemit-style",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:39",
  "trx_id": "5059dee3deb1946338a95272bd12938601211908",
  "trx_in_block": 3,
  "virtual_op": 0
}
prolicupvoted (100.00%) @larkenrose / never-forget
2017/01/15 10:18:36
authorlarkenrose
permlinknever-forget
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495198/Trx b39740bd694219a775cc7cb5130cee45354f8005
View Raw JSON Data
{
  "block": 8495198,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "never-forget",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:36",
  "trx_id": "b39740bd694219a775cc7cb5130cee45354f8005",
  "trx_in_block": 9,
  "virtual_op": 0
}
2017/01/15 10:18:30
authorlarkenrose
permlinkraising-human-livestock
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495196/Trx b721b8dbeeee10612e9eb2f954f21ff172b95d12
View Raw JSON Data
{
  "block": 8495196,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "raising-human-livestock",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:30",
  "trx_id": "b721b8dbeeee10612e9eb2f954f21ff172b95d12",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:18:27
authorlarkenrose
permlinkauthoritarianism-as-security-blanket
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495195/Trx 11dbc9841c11413052cac5bc95ad33ec73f09fd1
View Raw JSON Data
{
  "block": 8495195,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "authoritarianism-as-security-blanket",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:27",
  "trx_id": "11dbc9841c11413052cac5bc95ad33ec73f09fd1",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:18:24
authorlarkenrose
permlinkexcept-when-we-do-it
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495194/Trx 75e2bff36671e57400a13a2019e2a06a1a4b15f1
View Raw JSON Data
{
  "block": 8495194,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "except-when-we-do-it",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:24",
  "trx_id": "75e2bff36671e57400a13a2019e2a06a1a4b15f1",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:18:21
authorlarkenrose
permlinkdemocracy-tricking-the-profoundly-gullible
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495193/Trx 8b608134c8e113685757b5c5f25152c20b1721a5
View Raw JSON Data
{
  "block": 8495193,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "democracy-tricking-the-profoundly-gullible",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:21",
  "trx_id": "8b608134c8e113685757b5c5f25152c20b1721a5",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:18:18
authorlarkenrose
permlinkcapitalism-good-or-bad-part-1-of-a-series
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495192/Trx 2d2922c6f34a3ebbdd9aaa18af1947f07b616bb9
View Raw JSON Data
{
  "block": 8495192,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "capitalism-good-or-bad-part-1-of-a-series",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:18",
  "trx_id": "2d2922c6f34a3ebbdd9aaa18af1947f07b616bb9",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:18:15
authorlarkenrose
permlinkcollective-vs-private-ownership-part-2-of-a-series
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495191/Trx 476495b7e334ec11ab34f93f49784b00d692531b
View Raw JSON Data
{
  "block": 8495191,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "collective-vs-private-ownership-part-2-of-a-series",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:15",
  "trx_id": "476495b7e334ec11ab34f93f49784b00d692531b",
  "trx_in_block": 3,
  "virtual_op": 0
}
2017/01/15 10:18:15
authorlarkenrose
permlinkmoney-good-or-bad-part-3-of-a-series
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495191/Trx 5b6918a7decaf7759409386cd22fd55eadaef2f6
View Raw JSON Data
{
  "block": 8495191,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "money-good-or-bad-part-3-of-a-series",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:18:15",
  "trx_id": "5b6918a7decaf7759409386cd22fd55eadaef2f6",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:16:18
authorsteemvest17
permlinkre-larkenrose-what-muslims-believe-20161218t174756053z
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495152/Trx a54b39b9186c7b17cd82ae13859f596bc55d5029
View Raw JSON Data
{
  "block": 8495152,
  "op": [
    "vote",
    {
      "author": "steemvest17",
      "permlink": "re-larkenrose-what-muslims-believe-20161218t174756053z",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:16:18",
  "trx_id": "a54b39b9186c7b17cd82ae13859f596bc55d5029",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:15:09
authorlarkenrose
permlinkwhat-muslims-believe
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495129/Trx b3ea1e3986699f886fe7f1586a1212bce65588fa
View Raw JSON Data
{
  "block": 8495129,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "what-muslims-believe",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:15:09",
  "trx_id": "b3ea1e3986699f886fe7f1586a1212bce65588fa",
  "trx_in_block": 1,
  "virtual_op": 0
}
prolicupvoted (100.00%) @larkenrose / elm-grove-song
2017/01/15 10:13:21
authorlarkenrose
permlinkelm-grove-song
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495093/Trx 25087009f1180977bcd106e2c3dbf9bd469ea0ca
View Raw JSON Data
{
  "block": 8495093,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "elm-grove-song",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:13:21",
  "trx_id": "25087009f1180977bcd106e2c3dbf9bd469ea0ca",
  "trx_in_block": 2,
  "virtual_op": 0
}
2017/01/15 10:13:18
authorlarkenrose
permlinkfreedom-principles-and-immigration
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495092/Trx 610474842539583d70bcbfbcfef2699854b1f1f8
View Raw JSON Data
{
  "block": 8495092,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "freedom-principles-and-immigration",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:13:18",
  "trx_id": "610474842539583d70bcbfbcfef2699854b1f1f8",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:13:18
authorlarkenrose
permlinkhierarchy-good-or-bad-part-4-of-a-series
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495092/Trx 0554e0275558fbd24ce8be886fd23a8dceef9e71
View Raw JSON Data
{
  "block": 8495092,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "hierarchy-good-or-bad-part-4-of-a-series",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:13:18",
  "trx_id": "0554e0275558fbd24ce8be886fd23a8dceef9e71",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:13:12
authorlarkenrose
permlinkwanted-road-pirate
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495090/Trx e407acb6e2f488f390fce84c40cf99c96ced4581
View Raw JSON Data
{
  "block": 8495090,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "wanted-road-pirate",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:13:12",
  "trx_id": "e407acb6e2f488f390fce84c40cf99c96ced4581",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:13:03
authorlarkenrose
permlinkit-s-a-free-country
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495087/Trx 5cbb41df2d021fdf380a148a307123af386f1ee8
View Raw JSON Data
{
  "block": 8495087,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "it-s-a-free-country",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:13:03",
  "trx_id": "5cbb41df2d021fdf380a148a307123af386f1ee8",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 10:12:57
authorlarkenrose
permlinka-tyrant-s-eye-view
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495085/Trx 8d5b84305aa7ce21b78b3b77797ba9d500140a2d
View Raw JSON Data
{
  "block": 8495085,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "a-tyrant-s-eye-view",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:12:57",
  "trx_id": "8d5b84305aa7ce21b78b3b77797ba9d500140a2d",
  "trx_in_block": 3,
  "virtual_op": 0
}
2017/01/15 10:12:51
authorlarkenrose
permlinkgovernment-always-a-bad-deal
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495083/Trx 8f1145e88d38fdeb4fee79ca8a6388b0a9eb7ecf
View Raw JSON Data
{
  "block": 8495083,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "government-always-a-bad-deal",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:12:51",
  "trx_id": "8f1145e88d38fdeb4fee79ca8a6388b0a9eb7ecf",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:12:48
authorlarkenrose
permlinkhope-and-change-no-really
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495082/Trx 4a4b23d496eedf4c5b7a85297f91419632d71daf
View Raw JSON Data
{
  "block": 8495082,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "hope-and-change-no-really",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:12:48",
  "trx_id": "4a4b23d496eedf4c5b7a85297f91419632d71daf",
  "trx_in_block": 2,
  "virtual_op": 0
}
2017/01/15 10:12:45
authorlarkenrose
permlinkoppression-symptoms-and-causes
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8495081/Trx 7786b5e2e25149a724bc88c4401cf2d8d15f4e70
View Raw JSON Data
{
  "block": 8495081,
  "op": [
    "vote",
    {
      "author": "larkenrose",
      "permlink": "oppression-symptoms-and-causes",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:12:45",
  "trx_id": "7786b5e2e25149a724bc88c4401cf2d8d15f4e70",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 10:12:36
idfollow
json["follow",{"follower":"prolic","following":"larkenrose","what":["blog"]}]
required auths[]
required posting auths["prolic"]
Transaction InfoBlock #8495078/Trx e3932778c6c6608e4176386de859d7b898057abd
View Raw JSON Data
{
  "block": 8495078,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"prolic\",\"following\":\"larkenrose\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "prolic"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T10:12:36",
  "trx_id": "e3932778c6c6608e4176386de859d7b898057abd",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 09:05:39
authorprolic
permlinkinheritance-with-aggregate-roots-in-proophevent-store
voterzulfahmiaulia
weight10000 (100.00%)
Transaction InfoBlock #8493740/Trx e959ca1ca4d5ced71baca95ff0415b091cee88ac
View Raw JSON Data
{
  "block": 8493740,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "inheritance-with-aggregate-roots-in-proophevent-store",
      "voter": "zulfahmiaulia",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T09:05:39",
  "trx_id": "e959ca1ca4d5ced71baca95ff0415b091cee88ac",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 09:02:12
authorprolic
permlinkinheritance-with-aggregate-roots-in-proophevent-store
voterfyrstikken
weight200 (2.00%)
Transaction InfoBlock #8493671/Trx fc8c76c691eda7e380fdcc51e9433a297af4f0e0
View Raw JSON Data
{
  "block": 8493671,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "inheritance-with-aggregate-roots-in-proophevent-store",
      "voter": "fyrstikken",
      "weight": 200
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T09:02:12",
  "trx_id": "fc8c76c691eda7e380fdcc51e9433a297af4f0e0",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 08:59:48
authorprolic
permlinkinheritance-with-aggregate-roots-in-proophevent-store
voterfyrst-witness
weight200 (2.00%)
Transaction InfoBlock #8493623/Trx 7ac153bb33c9624b723d58874beb420ff04d306b
View Raw JSON Data
{
  "block": 8493623,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "inheritance-with-aggregate-roots-in-proophevent-store",
      "voter": "fyrst-witness",
      "weight": 200
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T08:59:48",
  "trx_id": "7ac153bb33c9624b723d58874beb420ff04d306b",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 08:56:54
authorprolic
permlinkinheritance-with-aggregate-roots-in-proophevent-store
votersteemspeak
weight200 (2.00%)
Transaction InfoBlock #8493565/Trx 47b781402c79c3fd94c8e81ad3f6517624e2fde1
View Raw JSON Data
{
  "block": 8493565,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "inheritance-with-aggregate-roots-in-proophevent-store",
      "voter": "steemspeak",
      "weight": 200
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T08:56:54",
  "trx_id": "47b781402c79c3fd94c8e81ad3f6517624e2fde1",
  "trx_in_block": 1,
  "virtual_op": 0
}
2017/01/15 08:33:51
authorprolic
permlinkinheritance-with-aggregate-roots-in-proophevent-store
voterprolic
weight10000 (100.00%)
Transaction InfoBlock #8493104/Trx 262ceb2096e026d3d37c2556b3251717ea252dcf
View Raw JSON Data
{
  "block": 8493104,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "inheritance-with-aggregate-roots-in-proophevent-store",
      "voter": "prolic",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T08:33:51",
  "trx_id": "262ceb2096e026d3d37c2556b3251717ea252dcf",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/15 08:33:51
authorprolic
bodyIf you want to make inheritance work with aggregate roots using a common repository for all subtypes, this can be achieved very easily. You need the latest ProophEvent-Store v6.1 (http://getprooph.org/) to do this. ## An example Consider the following use case: ```php <?php abstract class User extends \Prooph\EventSourcing\AggregateRoot { protected $name; protected $email; public function name() { return $this->name; } public function email() { return $this->email; } protected function whenUserWasRegisterd(UserWasRegisterd $event) { $this->name = $event->name(); $this->email = $event->email(); } } class Admin extends User { public static function register($name, $email) { $self = new self(); $self->recordThat(UserWasRegisterd::withData('admin', $name, $email); return $self; } } class Member extends User { public static function register($name, $email) { $self = new self(); $self->recordThat(UserWasRegisterd::withData('member', $name, $email); return $self; } } ``` So in order to make this work, you need 3 small changes in your application. ## Step 1: Create a UserAggregateTranslator ```php <?php final class UserAggregateTranslator extends \Prooph\EventSourcing\EventStoreIntegration\AggregateTranslator { /** * @param \Prooph\EventStore\Aggregate\AggregateType $aggregateType * @param \Iterator $historyEvents * @return object reconstructed AggregateRoot */ public function reconstituteAggregateFromHistory( \Prooph\EventStore\Aggregate\AggregateType $aggregateType, \Iterator $historyEvents ) { $aggregateRootDecorator = $this->getAggregateRootDecorator(); $firstEvent = $historyEvents->current(); $type = $firstEvent->type(); if ($type === 'admin') { return $aggregateRootDecorator->fromHistory(Admin::class, $historyEvents); } elseif ($type === 'member') { return $aggregateRootDecorator->fromHistory(Member::class, $historyEvents); } } } ``` ## Step 2: Change the assertion method in the EventStoreUserCollection ```php <?php final class EventStoreUserCollection extends \Prooph\EventStore\Aggregate\AggregateRepository { public function add(User $user) { $this->addAggregateRoot($user); } public function get(UserId $userId) { return $this->getAggregateRoot($userId->toString()); } protected function assertAggregateType($eventSourcedAggregateRoot) { \Assert\Assertion::isInstanceOf($eventSourcedAggregateRoot, User::class); } } ``` ## Step 3: Make use of your custom AggregateTranslator ```php <?php final class EventStoreUserCollectionFactory { public function __invoke(ContainerInterface $container) { return new EventStoreUserCollection( $container->get(EventStore::class), AggregateType::fromAggregateRootClass(User::class), new UserAggregateTranslator() ); } } ``` If you use the provided container factory (\Prooph\EventStore\Container\Aggregate\AbstractAggregateRepositoryFactory) then you can also just change the `aggregate_translator` key in your config to point to the new `UserAggregateTranslator` and register the `UserAggregateTranslator` in your container.
json metadata{"tags":["programming","php","prooph","eventsourcing","ddd"],"links":["http://getprooph.org/"],"app":"steemit/0.1","format":"markdown"}
parent author
parent permlinkprogramming
permlinkinheritance-with-aggregate-roots-in-proophevent-store
titleInheritance with Aggregate Roots in ProophEvent-Store
Transaction InfoBlock #8493104/Trx 262ceb2096e026d3d37c2556b3251717ea252dcf
View Raw JSON Data
{
  "block": 8493104,
  "op": [
    "comment",
    {
      "author": "prolic",
      "body": "If you want to make inheritance work with aggregate roots using a common repository for all subtypes, this can be achieved very easily. You need the latest ProophEvent-Store v6.1 (http://getprooph.org/) to do this.\n\n## An example\n\nConsider the following use case:\n\n```php\n<?php\nabstract class User extends \\Prooph\\EventSourcing\\AggregateRoot\n{\n    protected $name;\n\n    protected $email;\n\n    public function name()\n    {\n        return $this->name;\n    }\n\n    public function email()\n    {\n        return $this->email;\n    }\n\n    protected function whenUserWasRegisterd(UserWasRegisterd $event)\n    {\n        $this->name = $event->name();\n        $this->email = $event->email();\n    }\n}\n\nclass Admin extends User\n{\n    public static function register($name, $email)\n    {\n        $self = new self();\n        $self->recordThat(UserWasRegisterd::withData('admin', $name, $email);\n\n        return $self;\n    }\n}\n\nclass Member extends User\n{\n    public static function register($name, $email)\n    {\n        $self = new self();\n        $self->recordThat(UserWasRegisterd::withData('member', $name, $email);\n\n        return $self;\n    }\n}\n```\n\nSo in order to make this work, you need 3 small changes in your application.\n\n\n## Step 1: Create a UserAggregateTranslator\n\n```php\n<?php\nfinal class UserAggregateTranslator extends \\Prooph\\EventSourcing\\EventStoreIntegration\\AggregateTranslator\n{\n    /**\n     * @param \\Prooph\\EventStore\\Aggregate\\AggregateType $aggregateType\n     * @param \\Iterator $historyEvents\n     * @return object reconstructed AggregateRoot\n     */\n    public function reconstituteAggregateFromHistory(\n        \\Prooph\\EventStore\\Aggregate\\AggregateType $aggregateType, \n        \\Iterator $historyEvents\n    ) {\n        $aggregateRootDecorator = $this->getAggregateRootDecorator();\n\n        $firstEvent = $historyEvents->current();\n        $type = $firstEvent->type();\n\n        if ($type === 'admin') {\n            return $aggregateRootDecorator->fromHistory(Admin::class, $historyEvents);\n        } elseif ($type === 'member') {\n            return $aggregateRootDecorator->fromHistory(Member::class, $historyEvents);\n        }\n    }\n}\n```\n\n\n## Step 2: Change the assertion method in the EventStoreUserCollection\n\n```php\n<?php\nfinal class EventStoreUserCollection extends \n    \\Prooph\\EventStore\\Aggregate\\AggregateRepository\n{\n    public function add(User $user)\n    {\n        $this->addAggregateRoot($user);\n    }\n    public function get(UserId $userId)\n    {\n        return $this->getAggregateRoot($userId->toString());\n    }\n    protected function assertAggregateType($eventSourcedAggregateRoot)\n    {\n        \\Assert\\Assertion::isInstanceOf($eventSourcedAggregateRoot, User::class);\n    }\n}\n```\n\n\n## Step 3: Make use of your custom AggregateTranslator\n\n```php\n<?php\nfinal class EventStoreUserCollectionFactory\n{\n    public function __invoke(ContainerInterface $container)\n    {\n        return new EventStoreUserCollection(\n            $container->get(EventStore::class),\n            AggregateType::fromAggregateRootClass(User::class),\n            new UserAggregateTranslator()\n        );\n    }\n}\n```\n\n\nIf you use the provided container factory (\\Prooph\\EventStore\\Container\\Aggregate\\AbstractAggregateRepositoryFactory) then you can also just change the `aggregate_translator` key in your config to point to the new `UserAggregateTranslator` and register the `UserAggregateTranslator` in your container.",
      "json_metadata": "{\"tags\":[\"programming\",\"php\",\"prooph\",\"eventsourcing\",\"ddd\"],\"links\":[\"http://getprooph.org/\"],\"app\":\"steemit/0.1\",\"format\":\"markdown\"}",
      "parent_author": "",
      "parent_permlink": "programming",
      "permlink": "inheritance-with-aggregate-roots-in-proophevent-store",
      "title": "Inheritance with Aggregate Roots in ProophEvent-Store"
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-15T08:33:51",
  "trx_id": "262ceb2096e026d3d37c2556b3251717ea252dcf",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/14 10:18:51
idfollow
json["follow",{"follower":"prolic","following":"dollarvigilante","what":["blog"]}]
required auths[]
required posting auths["prolic"]
Transaction InfoBlock #8466449/Trx 574fcdc34715cdf635fca47fda948a43682116b6
View Raw JSON Data
{
  "block": 8466449,
  "op": [
    "custom_json",
    {
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"prolic\",\"following\":\"dollarvigilante\",\"what\":[\"blog\"]}]",
      "required_auths": [],
      "required_posting_auths": [
        "prolic"
      ]
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-14T10:18:51",
  "trx_id": "574fcdc34715cdf635fca47fda948a43682116b6",
  "trx_in_block": 0,
  "virtual_op": 0
}
2017/01/14 09:39:30
authorprolic
permlinkauthorization-and-event-sourcing-with-prooph-and-zf2-zf3
voterbreezin
weight10000 (100.00%)
Transaction InfoBlock #8465663/Trx 32183ed140d588e3753c917464d2bb042ab1b6ce
View Raw JSON Data
{
  "block": 8465663,
  "op": [
    "vote",
    {
      "author": "prolic",
      "permlink": "authorization-and-event-sourcing-with-prooph-and-zf2-zf3",
      "voter": "breezin",
      "weight": 10000
    }
  ],
  "op_in_trx": 0,
  "timestamp": "2017-01-14T09:39:30",
  "trx_id": "32183ed140d588e3753c917464d2bb042ab1b6ce",
  "trx_in_block": 0,
  "virtual_op": 0
}

Account Metadata

POSTING JSON METADATA
profile{"profile_image":"https://avatars2.githubusercontent.com/u/394428?v=3&s=460","about":"Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist","location":"Philippines","website":"http://www.sasaprolic.com/"}
JSON METADATA
profile{"profile_image":"https://avatars2.githubusercontent.com/u/394428?v=3&s=460","about":"Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist","location":"Philippines","website":"http://www.sasaprolic.com/"}
{
  "posting_json_metadata": {
    "profile": {
      "profile_image": "https://avatars2.githubusercontent.com/u/394428?v=3&s=460",
      "about": "Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist",
      "location": "Philippines",
      "website": "http://www.sasaprolic.com/"
    }
  },
  "json_metadata": {
    "profile": {
      "profile_image": "https://avatars2.githubusercontent.com/u/394428?v=3&s=460",
      "about": "Open Source Software Developer, Prooph Maintainer and Anarcho-Capitalist",
      "location": "Philippines",
      "website": "http://www.sasaprolic.com/"
    }
  }
}

Auth Keys

Owner
Single Signature
Public Keys
STM79AAYqqzwugCoMzfP6FZ75nfP453BgpeFJ9pQPLm36jP6sK1Fy1/1
Active
Single Signature
Public Keys
STM51ryKkUn9KHP7Y5E1ag686vTtqH9hnPxmq5wssuMvLgsQKiQnx1/1
Posting
Single Signature
Public Keys
STM5rmSzdA38vQCajTEpzfCDAXpwzPAEPh4rmDLa7PaUT7DtWKgg61/1
App Permissions
Memo
STM6HFc88q1yLFkY5bPjjNW1QBAJyXrLpD3Ash3RKbSfLo1F1mvP1
{
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM79AAYqqzwugCoMzfP6FZ75nfP453BgpeFJ9pQPLm36jP6sK1Fy",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM51ryKkUn9KHP7Y5E1ag686vTtqH9hnPxmq5wssuMvLgsQKiQnx",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting": {
    "account_auths": [
      [
        "dtube.app",
        1
      ]
    ],
    "key_auths": [
      [
        "STM5rmSzdA38vQCajTEpzfCDAXpwzPAEPh4rmDLa7PaUT7DtWKgg6",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "memo": "STM6HFc88q1yLFkY5bPjjNW1QBAJyXrLpD3Ash3RKbSfLo1F1mvP1"
}

Witness Votes

0 / 30
No active witness votes.
[]