Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS0.00%
Net Worth
0.037USD
STEEM
0.000STEEM
SBD
0.000SBD
Effective Power
5.008SP
├── Own SP
0.631SP
└── Incoming Deleg
+4.377SP

Detailed Balance

STEEM
balance
0.000STEEM
market_balance
0.000STEEM
savings_balance
0.000STEEM
reward_steem_balance
0.000STEEM
STEEM POWER
Own SP
0.631SP
Delegated Out
0.000SP
Delegation In
4.377SP
Effective Power
5.008SP
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.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "reward_steem_balance": "0.000 STEEM",
  "vesting_shares": "1026.543464 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7117.116342 VESTS",
  "sbd_balance": "0.000 SBD",
  "savings_sbd_balance": "0.000 SBD",
  "reward_sbd_balance": "0.000 SBD",
  "conversions": []
}

Account Info

namelowesyang
id461411
rank809,607
reputation154544082
created2017-11-24T02:53:24
recovery_accountsteem
proxyNone
post_count5
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2017-12-08T03:06:09
last_root_post2017-11-24T05:41:33
last_vote_time2017-11-27T07:28:57
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance0.000 STEEM
savings_balance0.000 STEEM
sbd_balance0.000 SBD
savings_sbd_balance0.000 SBD
vesting_shares1026.543464 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares7117.116342 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_update1970-01-01T00:00:00
minedNo
sbd_seconds0
sbd_last_interest_payment1970-01-01T00:00:00
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "id": 461411,
  "name": "lowesyang",
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6ErqstANfeKTh6D9adn69yszEjKyrszAicQJf6izjN9KxtJvuj",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8CLeW6rRRXcHxRMiW4wJ5hvwtKuYmyAbnT28LP7RDjVdui4gEg",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6SHNxtvLADqqQU7cafQwtoTeHUzbQbncHs3aHFrDZkvrMFdo6k",
        1
      ]
    ]
  },
  "memo_key": "STM6gAuEJYpKY2jobBNBgbhHrUABn3M1Sx3LHYh1EiSnw91Jo4FPr",
  "json_metadata": "",
  "posting_json_metadata": "",
  "proxy": "",
  "last_owner_update": "1970-01-01T00:00:00",
  "last_account_update": "1970-01-01T00:00:00",
  "created": "2017-11-24T02:53:24",
  "mined": false,
  "recovery_account": "steem",
  "last_account_recovery": "1970-01-01T00:00:00",
  "reset_account": "null",
  "comment_count": 0,
  "lifetime_vote_count": 0,
  "post_count": 5,
  "can_vote": true,
  "voting_manabar": {
    "current_mana": "8143659806",
    "last_update_time": 1779073599
  },
  "downvote_manabar": {
    "current_mana": 2035914951,
    "last_update_time": 1779073599
  },
  "voting_power": 0,
  "balance": "0.000 STEEM",
  "savings_balance": "0.000 STEEM",
  "sbd_balance": "0.000 SBD",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "1970-01-01T00:00:00",
  "sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "vesting_shares": "1026.543464 VESTS",
  "delegated_vesting_shares": "0.000000 VESTS",
  "received_vesting_shares": "7117.116342 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "withdrawn": 0,
  "to_withdraw": 0,
  "withdraw_routes": 0,
  "curation_rewards": 0,
  "posting_rewards": 0,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "witnesses_voted_for": 0,
  "last_post": "2017-12-08T03:06:09",
  "last_root_post": "2017-11-24T05:41:33",
  "last_vote_time": "2017-11-27T07:28:57",
  "post_bandwidth": 0,
  "pending_claimed_accounts": 0,
  "vesting_balance": "0.000 STEEM",
  "reputation": 154544082,
  "transfer_history": [],
  "market_history": [],
  "post_history": [],
  "vote_history": [],
  "other_history": [],
  "witness_votes": [],
  "tags_usage": [],
  "guest_bloggers": [],
  "rank": 809607
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
steemdelegated 4.377 SP to @lowesyang
2026/05/18 03:06:39
delegatorsteem
delegateelowesyang
vesting shares7117.116342 VESTS
Transaction InfoBlock #106146859/Trx 020ef5700516c366f83a858c21263e7646d8bc31
View Raw JSON Data
{
  "trx_id": "020ef5700516c366f83a858c21263e7646d8bc31",
  "block": 106146859,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-18T03:06:39",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "7117.116342 VESTS"
    }
  ]
}
steemdelegated 2.709 SP to @lowesyang
2026/05/12 15:23:57
delegatorsteem
delegateelowesyang
vesting shares4404.905937 VESTS
Transaction InfoBlock #105989550/Trx bbf7043fcfcd53bd8b8d8245e0ebd61a32b28e94
View Raw JSON Data
{
  "trx_id": "bbf7043fcfcd53bd8b8d8245e0ebd61a32b28e94",
  "block": 105989550,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-12T15:23:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "4404.905937 VESTS"
    }
  ]
}
steemdelegated 4.385 SP to @lowesyang
2026/04/26 02:23:09
delegatorsteem
delegateelowesyang
vesting shares7129.632098 VESTS
Transaction InfoBlock #105514432/Trx 1e9a4057b0de36a8af38deeb3158e4a49e498009
View Raw JSON Data
{
  "trx_id": "1e9a4057b0de36a8af38deeb3158e4a49e498009",
  "block": 105514432,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-04-26T02:23:09",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "7129.632098 VESTS"
    }
  ]
}
steemdelegated 2.734 SP to @lowesyang
2026/01/23 15:26:27
delegatorsteem
delegateelowesyang
vesting shares4446.452756 VESTS
Transaction InfoBlock #102860966/Trx b92ff921cfd7ae94cfb45bf9b0a6fa823c7c6c31
View Raw JSON Data
{
  "trx_id": "b92ff921cfd7ae94cfb45bf9b0a6fa823c7c6c31",
  "block": 102860966,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-01-23T15:26:27",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "4446.452756 VESTS"
    }
  ]
}
steemdelegated 2.835 SP to @lowesyang
2024/12/17 10:40:30
delegatorsteem
delegateelowesyang
vesting shares4610.671953 VESTS
Transaction InfoBlock #91307258/Trx ce4e5492e21406ee1e2f57d631372298c2e01d45
View Raw JSON Data
{
  "trx_id": "ce4e5492e21406ee1e2f57d631372298c2e01d45",
  "block": 91307258,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-12-17T10:40:30",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "4610.671953 VESTS"
    }
  ]
}
steemdelegated 2.939 SP to @lowesyang
2023/11/14 02:22:42
delegatorsteem
delegateelowesyang
vesting shares4779.805485 VESTS
Transaction InfoBlock #79861441/Trx 2a0faf9ba1fb4ff8b8ed1f046517885c814fc975
View Raw JSON Data
{
  "trx_id": "2a0faf9ba1fb4ff8b8ed1f046517885c814fc975",
  "block": 79861441,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-11-14T02:22:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "4779.805485 VESTS"
    }
  ]
}
steemdelegated 4.746 SP to @lowesyang
2023/09/22 01:11:00
delegatorsteem
delegateelowesyang
vesting shares7717.084271 VESTS
Transaction InfoBlock #78351843/Trx 3409f369f9d78cec453a98191bb770b011f6d3ba
View Raw JSON Data
{
  "trx_id": "3409f369f9d78cec453a98191bb770b011f6d3ba",
  "block": 78351843,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-22T01:11:00",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "7717.084271 VESTS"
    }
  ]
}
steemdelegated 4.882 SP to @lowesyang
2022/11/03 14:33:57
delegatorsteem
delegateelowesyang
vesting shares7938.765709 VESTS
Transaction InfoBlock #69116678/Trx eecf54b579d14edefc54b1571aec113ee0bf81a1
View Raw JSON Data
{
  "trx_id": "eecf54b579d14edefc54b1571aec113ee0bf81a1",
  "block": 69116678,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-11-03T14:33:57",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "7938.765709 VESTS"
    }
  ]
}
steemdelegated 5.018 SP to @lowesyang
2022/01/17 17:51:15
delegatorsteem
delegateelowesyang
vesting shares8159.000845 VESTS
Transaction InfoBlock #60817651/Trx 8057fe1c8b74c3f09e3258d014488a8c1ebc2d7f
View Raw JSON Data
{
  "trx_id": "8057fe1c8b74c3f09e3258d014488a8c1ebc2d7f",
  "block": 60817651,
  "trx_in_block": 67,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-01-17T17:51:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "8159.000845 VESTS"
    }
  ]
}
steemdelegated 5.131 SP to @lowesyang
2021/06/14 03:23:33
delegatorsteem
delegateelowesyang
vesting shares8343.067598 VESTS
Transaction InfoBlock #54610798/Trx 14e2992567ddf6ba7465f091c12c81e6ca6d212e
View Raw JSON Data
{
  "trx_id": "14e2992567ddf6ba7465f091c12c81e6ca6d212e",
  "block": 54610798,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2021-06-14T03:23:33",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "8343.067598 VESTS"
    }
  ]
}
steemdelegated 5.246 SP to @lowesyang
2020/12/11 13:39:18
delegatorsteem
delegateelowesyang
vesting shares8530.489572 VESTS
Transaction InfoBlock #49358164/Trx e61f82d07a67f97b4ca099f926acd46238070172
View Raw JSON Data
{
  "trx_id": "e61f82d07a67f97b4ca099f926acd46238070172",
  "block": 49358164,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-11T13:39:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "8530.489572 VESTS"
    }
  ]
}
steemdelegated 1.176 SP to @lowesyang
2020/12/06 07:15:36
delegatorsteem
delegateelowesyang
vesting shares1912.543513 VESTS
Transaction InfoBlock #49209703/Trx 1c0085d9517cedd1d749c7ace8d61139f15965d4
View Raw JSON Data
{
  "trx_id": "1c0085d9517cedd1d749c7ace8d61139f15965d4",
  "block": 49209703,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-06T07:15:36",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "1912.543513 VESTS"
    }
  ]
}
steemdelegated 5.250 SP to @lowesyang
2020/12/05 17:17:12
delegatorsteem
delegateelowesyang
vesting shares8536.697426 VESTS
Transaction InfoBlock #49193252/Trx 01d1d70872e5f9516d50585da31498f88998673f
View Raw JSON Data
{
  "trx_id": "01d1d70872e5f9516d50585da31498f88998673f",
  "block": 49193252,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-12-05T17:17:12",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "8536.697426 VESTS"
    }
  ]
}
steemdelegated 1.181 SP to @lowesyang
2020/11/02 20:52:03
delegatorsteem
delegateelowesyang
vesting shares1920.017158 VESTS
Transaction InfoBlock #48263960/Trx 0e1c74ad259a09ac2e76b43aac5c5bdd86653220
View Raw JSON Data
{
  "trx_id": "0e1c74ad259a09ac2e76b43aac5c5bdd86653220",
  "block": 48263960,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-11-02T20:52:03",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "1920.017158 VESTS"
    }
  ]
}
steemdelegated 5.375 SP to @lowesyang
2020/05/09 08:15:51
delegatorsteem
delegateelowesyang
vesting shares8739.502785 VESTS
Transaction InfoBlock #43219991/Trx cd44e01c124d86fa3bcb9afcf45ab354bc22022f
View Raw JSON Data
{
  "trx_id": "cd44e01c124d86fa3bcb9afcf45ab354bc22022f",
  "block": 43219991,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-09T08:15:51",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "8739.502785 VESTS"
    }
  ]
}
steemdelegated 1.201 SP to @lowesyang
2020/05/08 12:14:45
delegatorsteem
delegateelowesyang
vesting shares1953.311140 VESTS
Transaction InfoBlock #43196536/Trx 4967cbe3b38602fc3dc0d146723bec070d0c3ef4
View Raw JSON Data
{
  "trx_id": "4967cbe3b38602fc3dc0d146723bec070d0c3ef4",
  "block": 43196536,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-05-08T12:14:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "1953.311140 VESTS"
    }
  ]
}
steemdelegated 5.382 SP to @lowesyang
2020/04/16 01:30:42
delegatorsteem
delegateelowesyang
vesting shares8752.390233 VESTS
Transaction InfoBlock #42567083/Trx b930c2b5631f5d9cb1cd4ba2a133c2d084a428f2
View Raw JSON Data
{
  "trx_id": "b930c2b5631f5d9cb1cd4ba2a133c2d084a428f2",
  "block": 42567083,
  "trx_in_block": 24,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2020-04-16T01:30:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "8752.390233 VESTS"
    }
  ]
}
2019/11/24 03:53:42
parent authorlowesyang
parent permlinkipfs
authorsteemitboard
permlinksteemitboard-notify-lowesyang-20191124t035341000z
title
bodyCongratulations @lowesyang! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@lowesyang/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table> <sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@lowesyang) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=lowesyang)_</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"]}
Transaction InfoBlock #38444586/Trx 6f60389cfdafce6634565854b8d055c21a45a91f
View Raw JSON Data
{
  "trx_id": "6f60389cfdafce6634565854b8d055c21a45a91f",
  "block": 38444586,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-11-24T03:53:42",
  "op": [
    "comment",
    {
      "parent_author": "lowesyang",
      "parent_permlink": "ipfs",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-lowesyang-20191124t035341000z",
      "title": "",
      "body": "Congratulations @lowesyang! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@lowesyang/birthday2.png</td><td>Happy Birthday! - You are on the Steem blockchain for 2 years!</td></tr></table>\n\n<sub>_You can view [your badges on your Steem Board](https://steemitboard.com/@lowesyang) and compare to others on the [Steem Ranking](https://steemitboard.com/ranking/index.php?name=lowesyang)_</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\"]}"
    }
  ]
}
steemdelegated 5.503 SP to @lowesyang
2019/05/12 18:36:45
delegatorsteem
delegateelowesyang
vesting shares8948.007046 VESTS
Transaction InfoBlock #32849937/Trx b683d560f15a46aa98b71ddd92c12b5f94dc9a18
View Raw JSON Data
{
  "trx_id": "b683d560f15a46aa98b71ddd92c12b5f94dc9a18",
  "block": 32849937,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2019-05-12T18:36:45",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "8948.007046 VESTS"
    }
  ]
}
2018/11/24 04:09:06
parent authorlowesyang
parent permlinkipfs
authorsteemitboard
permlinksteemitboard-notify-lowesyang-20181124t040905000z
title
bodyCongratulations @lowesyang! You received a personal award! <table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@lowesyang/birthday1.png</td><td>1 Year on Steemit</td></tr></table> <sub>_[Click here to view your Board of Honor](https://steemitboard.com/@lowesyang)_</sub> **Do not miss the last post from @steemitboard:** <table><tr><td><a href="https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-the-results-the-winners-and-the-prizes"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeLukvNFRsa7RURqsFpiLGEZZD49MiU52JtWmjS5S2wtW/image.png"></a></td><td><a href="https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-the-results-the-winners-and-the-prizes">Meet the Steemians Contest - The results, the winners and the prizes</a></td></tr><tr><td><a href="https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-special-attendees-revealed"><img src="https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeLukvNFRsa7RURqsFpiLGEZZD49MiU52JtWmjS5S2wtW/image.png"></a></td><td><a href="https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-special-attendees-revealed">Meet the Steemians Contest - Special attendees revealed</a></td></tr></table> > 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"]}
Transaction InfoBlock #27970368/Trx 83a32a354c7dd09cbfdb4804b7f28859a775061a
View Raw JSON Data
{
  "trx_id": "83a32a354c7dd09cbfdb4804b7f28859a775061a",
  "block": 27970368,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-11-24T04:09:06",
  "op": [
    "comment",
    {
      "parent_author": "lowesyang",
      "parent_permlink": "ipfs",
      "author": "steemitboard",
      "permlink": "steemitboard-notify-lowesyang-20181124t040905000z",
      "title": "",
      "body": "Congratulations @lowesyang! You received a personal award!\n\n<table><tr><td>https://steemitimages.com/70x70/http://steemitboard.com/@lowesyang/birthday1.png</td><td>1 Year on Steemit</td></tr></table>\n\n<sub>_[Click here to view your Board of Honor](https://steemitboard.com/@lowesyang)_</sub>\n\n\n**Do not miss the last post from @steemitboard:**\n<table><tr><td><a href=\"https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-the-results-the-winners-and-the-prizes\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeLukvNFRsa7RURqsFpiLGEZZD49MiU52JtWmjS5S2wtW/image.png\"></a></td><td><a href=\"https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-the-results-the-winners-and-the-prizes\">Meet the Steemians Contest - The results, the winners and the prizes</a></td></tr><tr><td><a href=\"https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-special-attendees-revealed\"><img src=\"https://steemitimages.com/64x128/https://cdn.steemitimages.com/DQmeLukvNFRsa7RURqsFpiLGEZZD49MiU52JtWmjS5S2wtW/image.png\"></a></td><td><a href=\"https://steemit.com/steemfest/@steemitboard/meet-the-steemians-contest-special-attendees-revealed\">Meet the Steemians Contest - Special attendees revealed</a></td></tr></table>\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\"]}"
    }
  ]
}
steemdelegated 5.626 SP to @lowesyang
2018/05/16 22:38:24
delegatorsteem
delegateelowesyang
vesting shares9147.617914 VESTS
Transaction InfoBlock #22492669/Trx a8dba0c3ff6ee378ba717bfdd76c3bfa23766265
View Raw JSON Data
{
  "trx_id": "a8dba0c3ff6ee378ba717bfdd76c3bfa23766265",
  "block": 22492669,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-05-16T22:38:24",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "9147.617914 VESTS"
    }
  ]
}
steemdelegated 18.164 SP to @lowesyang
2018/04/21 20:47:15
delegatorsteem
delegateelowesyang
vesting shares29535.624484 VESTS
Transaction InfoBlock #21771233/Trx 4e3ca9a81877d955074c1636dac48bc4adf3ea9b
View Raw JSON Data
{
  "trx_id": "4e3ca9a81877d955074c1636dac48bc4adf3ea9b",
  "block": 21771233,
  "trx_in_block": 43,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-04-21T20:47:15",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "29535.624484 VESTS"
    }
  ]
}
brucelupvoted (100.00%) @lowesyang / ipfs
2018/03/17 11:18:48
voterbrucel
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #20752876/Trx c03330cdbb38bc02a1889386967b69e9cf913c2e
View Raw JSON Data
{
  "trx_id": "c03330cdbb38bc02a1889386967b69e9cf913c2e",
  "block": 20752876,
  "trx_in_block": 58,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2018-03-17T11:18:48",
  "op": [
    "vote",
    {
      "voter": "brucel",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
steemdelegated 18.289 SP to @lowesyang
2017/12/12 22:19:42
delegatorsteem
delegateelowesyang
vesting shares29739.456536 VESTS
Transaction InfoBlock #18032577/Trx 95f3917a5164156d309db9191d602f21aae9138e
View Raw JSON Data
{
  "trx_id": "95f3917a5164156d309db9191d602f21aae9138e",
  "block": 18032577,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-12-12T22:19:42",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "steem",
      "delegatee": "lowesyang",
      "vesting_shares": "29739.456536 VESTS"
    }
  ]
}
2017/12/08 03:06:09
parent authoritsolutions
parent permlinkre-mammasitta-re-steeminator3000-re-acidyo-some-small-progress-on-the-subreddit-20171207t051251189z
authorlowesyang
permlinkre-itsolutions-re-mammasitta-re-steeminator3000-re-acidyo-some-small-progress-on-the-subreddit-20171208t030422009z
title
bodyhi
json metadata{"tags":["subreddit"],"app":"steemit/0.1"}
Transaction InfoBlock #17894376/Trx c47d42c14e54d6ee02bfc459fa5c42d3bb3b06a2
View Raw JSON Data
{
  "trx_id": "c47d42c14e54d6ee02bfc459fa5c42d3bb3b06a2",
  "block": 17894376,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-12-08T03:06:09",
  "op": [
    "comment",
    {
      "parent_author": "itsolutions",
      "parent_permlink": "re-mammasitta-re-steeminator3000-re-acidyo-some-small-progress-on-the-subreddit-20171207t051251189z",
      "author": "lowesyang",
      "permlink": "re-itsolutions-re-mammasitta-re-steeminator3000-re-acidyo-some-small-progress-on-the-subreddit-20171208t030422009z",
      "title": "",
      "body": "hi",
      "json_metadata": "{\"tags\":[\"subreddit\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
lowesyangupvoted (100.00%) @lowesyang / ipfs
2017/11/27 07:28:57
voterlowesyang
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #17582992/Trx 3df5834ac4fae088c71bf6c644b4f4589a212913
View Raw JSON Data
{
  "trx_id": "3df5834ac4fae088c71bf6c644b4f4589a212913",
  "block": 17582992,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T07:28:57",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
lowesyangremoved vote from (0.00%) @lowesyang / ipfs
2017/11/27 07:28:42
voterlowesyang
authorlowesyang
permlinkipfs
weight0 (0.00%)
Transaction InfoBlock #17582987/Trx 162d764da26f0956327daaf048200cfdfe4542b0
View Raw JSON Data
{
  "trx_id": "162d764da26f0956327daaf048200cfdfe4542b0",
  "block": 17582987,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T07:28:42",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 0
    }
  ]
}
2017/11/27 07:19:12
voterlowesyang
authorgavvet
permlinkthe-evolution-of-adam-work-work-and-more-work-did-i-say-work
weight10000 (100.00%)
Transaction InfoBlock #17582797/Trx deb49d3af4b45ad711cd2212e67a27cd7445845b
View Raw JSON Data
{
  "trx_id": "deb49d3af4b45ad711cd2212e67a27cd7445845b",
  "block": 17582797,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T07:19:12",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "gavvet",
      "permlink": "the-evolution-of-adam-work-work-and-more-work-did-i-say-work",
      "weight": 10000
    }
  ]
}
2017/11/27 07:08:57
required auths[]
required posting auths["lowesyang"]
idfollow
json["follow",{"follower":"lowesyang","following":"a-blockchain","what":["blog"]}]
Transaction InfoBlock #17582593/Trx e4999a5352ab9ed5cbe8bd8973a67b302d516aa9
View Raw JSON Data
{
  "trx_id": "e4999a5352ab9ed5cbe8bd8973a67b302d516aa9",
  "block": 17582593,
  "trx_in_block": 8,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T07:08:57",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "lowesyang"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"lowesyang\",\"following\":\"a-blockchain\",\"what\":[\"blog\"]}]"
    }
  ]
}
2017/11/27 06:41:21
voterlowesyang
authorelizahfhaye
permlinkthe-world-of-cryptocurrency-jamie-dimon
weight10000 (100.00%)
Transaction InfoBlock #17582041/Trx 609c1dd73ca9285e8b66a891aa02ef184696f952
View Raw JSON Data
{
  "trx_id": "609c1dd73ca9285e8b66a891aa02ef184696f952",
  "block": 17582041,
  "trx_in_block": 16,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T06:41:21",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "elizahfhaye",
      "permlink": "the-world-of-cryptocurrency-jamie-dimon",
      "weight": 10000
    }
  ]
}
2017/11/27 06:41:12
voterlowesyang
authorheimindanger
permlinkd-tube-0-5-big-optimizations
weight10000 (100.00%)
Transaction InfoBlock #17582038/Trx 647acd1599814b522c01fb3708ddc120528f9f34
View Raw JSON Data
{
  "trx_id": "647acd1599814b522c01fb3708ddc120528f9f34",
  "block": 17582038,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T06:41:12",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "heimindanger",
      "permlink": "d-tube-0-5-big-optimizations",
      "weight": 10000
    }
  ]
}
2017/11/27 03:41:42
parent authora-blockchain
parent permlinkre-lowesyang-2jukq9-20171124t070440152z
authorlowesyang
permlinkre-a-blockchain-re-lowesyang-2jukq9-20171127t034141373z
title
bodyThank you!
json metadata{"tags":["bitcoin"],"app":"steemit/0.1"}
Transaction InfoBlock #17578451/Trx e2431710638796f9d28e9d2af695170b0705e847
View Raw JSON Data
{
  "trx_id": "e2431710638796f9d28e9d2af695170b0705e847",
  "block": 17578451,
  "trx_in_block": 18,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-27T03:41:42",
  "op": [
    "comment",
    {
      "parent_author": "a-blockchain",
      "parent_permlink": "re-lowesyang-2jukq9-20171124t070440152z",
      "author": "lowesyang",
      "permlink": "re-a-blockchain-re-lowesyang-2jukq9-20171127t034141373z",
      "title": "",
      "body": "Thank you!",
      "json_metadata": "{\"tags\":[\"bitcoin\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
lowesyangcustom json: follow
2017/11/24 11:57:15
required auths[]
required posting auths["lowesyang"]
idfollow
json["reblog",{"account":"lowesyang","author":"sweetsssj","permlink":"travel-with-me-97-the-national-palace-museum-in-taipei-taiwan"}]
Transaction InfoBlock #17501967/Trx 69c85d940a961eafaa3ef5419edb7144236a7656
View Raw JSON Data
{
  "trx_id": "69c85d940a961eafaa3ef5419edb7144236a7656",
  "block": 17501967,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T11:57:15",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "lowesyang"
      ],
      "id": "follow",
      "json": "[\"reblog\",{\"account\":\"lowesyang\",\"author\":\"sweetsssj\",\"permlink\":\"travel-with-me-97-the-national-palace-museum-in-taipei-taiwan\"}]"
    }
  ]
}
pugaloupvoted (100.00%) @lowesyang / ipfs
2017/11/24 08:27:45
voterpugalo
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #17497778/Trx fb8b12e7d62870bfb13d658711bfdb68b3d08159
View Raw JSON Data
{
  "trx_id": "fb8b12e7d62870bfb13d658711bfdb68b3d08159",
  "block": 17497778,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:27:45",
  "op": [
    "vote",
    {
      "voter": "pugalo",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
dmitryparlowupvoted (100.00%) @lowesyang / ipfs
2017/11/24 08:27:42
voterdmitryparlow
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #17497777/Trx 00f06e5c2a5041a1131bee5b9d824ef62a0a3809
View Raw JSON Data
{
  "trx_id": "00f06e5c2a5041a1131bee5b9d824ef62a0a3809",
  "block": 17497777,
  "trx_in_block": 14,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:27:42",
  "op": [
    "vote",
    {
      "voter": "dmitryparlow",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
nedovezupvoted (100.00%) @lowesyang / ipfs
2017/11/24 08:27:42
voternedovez
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #17497777/Trx 01f367a6f5bc05da8568a92c0a2ac00a4928ed5a
View Raw JSON Data
{
  "trx_id": "01f367a6f5bc05da8568a92c0a2ac00a4928ed5a",
  "block": 17497777,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:27:42",
  "op": [
    "vote",
    {
      "voter": "nedovez",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
zatepanechupvoted (100.00%) @lowesyang / ipfs
2017/11/24 08:25:57
voterzatepanech
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #17497742/Trx 39e61efaa03b2360464d9c946d0204c38470b8d6
View Raw JSON Data
{
  "trx_id": "39e61efaa03b2360464d9c946d0204c38470b8d6",
  "block": 17497742,
  "trx_in_block": 22,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:25:57",
  "op": [
    "vote",
    {
      "voter": "zatepanech",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
gevorfupvoted (100.00%) @lowesyang / ipfs
2017/11/24 08:25:57
votergevorf
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #17497742/Trx c21ca68589f710fd073d5c7c26b4af2cb6472502
View Raw JSON Data
{
  "trx_id": "c21ca68589f710fd073d5c7c26b4af2cb6472502",
  "block": 17497742,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:25:57",
  "op": [
    "vote",
    {
      "voter": "gevorf",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
lasnewupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:21:24
voterlasnew
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497652/Trx 591725cbdefa4289e1a24f85acbe2db1f0f3e96f
View Raw JSON Data
{
  "trx_id": "591725cbdefa4289e1a24f85acbe2db1f0f3e96f",
  "block": 17497652,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:21:24",
  "op": [
    "vote",
    {
      "voter": "lasnew",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
emiliyaskazupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:21:24
voteremiliyaskaz
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497652/Trx 651a86f4604863dd39b8a958a5304369e45943d9
View Raw JSON Data
{
  "trx_id": "651a86f4604863dd39b8a958a5304369e45943d9",
  "block": 17497652,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:21:24",
  "op": [
    "vote",
    {
      "voter": "emiliyaskaz",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
lisenkovadim185upvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:21:21
voterlisenkovadim185
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497651/Trx e709a5ae99966d66493fd608f6c9f9e244d1ff16
View Raw JSON Data
{
  "trx_id": "e709a5ae99966d66493fd608f6c9f9e244d1ff16",
  "block": 17497651,
  "trx_in_block": 25,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:21:21",
  "op": [
    "vote",
    {
      "voter": "lisenkovadim185",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
nafkaupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:21:21
voternafka
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497651/Trx 21908e65e0ac8bf06d1327d7e27fec4d796cd06c
View Raw JSON Data
{
  "trx_id": "21908e65e0ac8bf06d1327d7e27fec4d796cd06c",
  "block": 17497651,
  "trx_in_block": 17,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:21:21",
  "op": [
    "vote",
    {
      "voter": "nafka",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
janovlinaupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:21:21
voterjanovlina
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497651/Trx 5fdccd4fe5e0c2643714ed854fc861c3aafea5ba
View Raw JSON Data
{
  "trx_id": "5fdccd4fe5e0c2643714ed854fc861c3aafea5ba",
  "block": 17497651,
  "trx_in_block": 12,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:21:21",
  "op": [
    "vote",
    {
      "voter": "janovlina",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
singer09upvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:21:21
votersinger09
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497651/Trx bce91678a1d8e4e26e587f02158a1f206e138abd
View Raw JSON Data
{
  "trx_id": "bce91678a1d8e4e26e587f02158a1f206e138abd",
  "block": 17497651,
  "trx_in_block": 6,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:21:21",
  "op": [
    "vote",
    {
      "voter": "singer09",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
eitgaueupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:19:33
votereitgaue
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497615/Trx 7000473cf892f246f4af54eef58b287200835d79
View Raw JSON Data
{
  "trx_id": "7000473cf892f246f4af54eef58b287200835d79",
  "block": 17497615,
  "trx_in_block": 29,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:19:33",
  "op": [
    "vote",
    {
      "voter": "eitgaue",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
simonovaupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:19:33
votersimonova
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497615/Trx ffdb93db072660d8b35e7e72100e0ab8a289167b
View Raw JSON Data
{
  "trx_id": "ffdb93db072660d8b35e7e72100e0ab8a289167b",
  "block": 17497615,
  "trx_in_block": 11,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:19:33",
  "op": [
    "vote",
    {
      "voter": "simonova",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
yarozdyachupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 08:19:30
voteryarozdyach
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17497614/Trx e5c49aafbf1c5ff83dc65a77bf359c624118ad7f
View Raw JSON Data
{
  "trx_id": "e5c49aafbf1c5ff83dc65a77bf359c624118ad7f",
  "block": 17497614,
  "trx_in_block": 19,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T08:19:30",
  "op": [
    "vote",
    {
      "voter": "yarozdyach",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
2017/11/24 07:04:42
parent authorlowesyang
parent permlink2jukq9
authora-blockchain
permlinkre-lowesyang-2jukq9-20171124t070440152z
title
body**Welcome to steemit** @lowesyang * I know that steemit may seem very overwhelming to you right now but don't worry. There's a learning curve to everything so just be patient and you'll be churning out posts and becoming a part of something great in no time! https://steemitimages.com/DQmaBi37A5oTnQ9NBLH8YU4jpvhhmFauyvgg3YRrEJwskM9/ezgif.com-resize.gif **_Also if there are any questions that you may have, then just ask your questions on any of my blog posts or in a reply below and I'll be more than happy to assist you with whatever questions you may have! I will also be creating a basic starting out guide for all minnows and newcomers on my blog so do give it a read as that might help answer many of your questions!_** _Have fun and I wish you LOADS of success on here! :)_ _Also. you can call upon originalworks whenever something you post is your own content like this: @originalworks_ **any question related to blockchain,bitcoin,crypto,mining ... please ask [me](@a-blockchain)** * **[Best regards](https://steemit.com/@a-blockchain), @a-blockchain**
json metadata{"tags":["bitcoin"],"users":["lowesyang","originalworks","a-blockchain"],"image":["https://steemitimages.com/DQmaBi37A5oTnQ9NBLH8YU4jpvhhmFauyvgg3YRrEJwskM9/ezgif.com-resize.gif"],"links":["@a-blockchain","https://steemit.com/@a-blockchain"],"app":"steemit/0.1"}
Transaction InfoBlock #17496118/Trx a86cbc322595b037d6c281676ff3aa97b1450c05
View Raw JSON Data
{
  "trx_id": "a86cbc322595b037d6c281676ff3aa97b1450c05",
  "block": 17496118,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T07:04:42",
  "op": [
    "comment",
    {
      "parent_author": "lowesyang",
      "parent_permlink": "2jukq9",
      "author": "a-blockchain",
      "permlink": "re-lowesyang-2jukq9-20171124t070440152z",
      "title": "",
      "body": "**Welcome to steemit** @lowesyang\n* I know that steemit may seem very overwhelming to you right now but don't worry. There's a learning curve to everything so just be patient and you'll be churning out posts and becoming a part of something great in no time!\nhttps://steemitimages.com/DQmaBi37A5oTnQ9NBLH8YU4jpvhhmFauyvgg3YRrEJwskM9/ezgif.com-resize.gif\n**_Also if there are any questions that you may have, then just ask your questions on any of my blog posts or in a reply below and I'll be more than happy to assist you with whatever questions you may have! I will also be creating a basic starting out guide for all minnows and newcomers on my blog so do give it a read as that might help answer many of your questions!_**\n\n_Have fun and I wish you LOADS of success on here! :)_\n\n_Also. you can call upon originalworks whenever something you post is your own content like this: @originalworks_\n\n**any question related to blockchain,bitcoin,crypto,mining ... please ask [me](@a-blockchain)**\n * **[Best regards](https://steemit.com/@a-blockchain), @a-blockchain**",
      "json_metadata": "{\"tags\":[\"bitcoin\"],\"users\":[\"lowesyang\",\"originalworks\",\"a-blockchain\"],\"image\":[\"https://steemitimages.com/DQmaBi37A5oTnQ9NBLH8YU4jpvhhmFauyvgg3YRrEJwskM9/ezgif.com-resize.gif\"],\"links\":[\"@a-blockchain\",\"https://steemit.com/@a-blockchain\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
2017/11/24 05:55:54
voterlowesyang
authorbluerocktalk
permlinkcore-steps-to-get-into-the-crypto-world-from-stan-larimer
weight10000 (100.00%)
Transaction InfoBlock #17494742/Trx dfd1ded062454dc98c829cabf1bae2656259afcd
View Raw JSON Data
{
  "trx_id": "dfd1ded062454dc98c829cabf1bae2656259afcd",
  "block": 17494742,
  "trx_in_block": 23,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:55:54",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "bluerocktalk",
      "permlink": "core-steps-to-get-into-the-crypto-world-from-stan-larimer",
      "weight": 10000
    }
  ]
}
2017/11/24 05:44:03
required auths[]
required posting auths["lowesyang"]
idfollow
json["follow",{"follower":"lowesyang","following":"cheetah","what":["blog"]}]
Transaction InfoBlock #17494505/Trx ede2c42ff7b75ce5d0eca3a4a709e161d477c6a0
View Raw JSON Data
{
  "trx_id": "ede2c42ff7b75ce5d0eca3a4a709e161d477c6a0",
  "block": 17494505,
  "trx_in_block": 9,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:44:03",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "lowesyang"
      ],
      "id": "follow",
      "json": "[\"follow\",{\"follower\":\"lowesyang\",\"following\":\"cheetah\",\"what\":[\"blog\"]}]"
    }
  ]
}
lowesyangupvoted (100.00%) @lowesyang / ipfs
2017/11/24 05:41:33
voterlowesyang
authorlowesyang
permlinkipfs
weight10000 (100.00%)
Transaction InfoBlock #17494455/Trx e08f2303813f2713b478e738a9923419d2c2a362
View Raw JSON Data
{
  "trx_id": "e08f2303813f2713b478e738a9923419d2c2a362",
  "block": 17494455,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:41:33",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "lowesyang",
      "permlink": "ipfs",
      "weight": 10000
    }
  ]
}
lowesyangupdated options for ipfs
2017/11/24 05:41:33
authorlowesyang
permlinkipfs
max accepted payout1000000.000 SBD
percent steem dollars0
allow votestrue
allow curation rewardstrue
extensions[]
Transaction InfoBlock #17494455/Trx e08f2303813f2713b478e738a9923419d2c2a362
View Raw JSON Data
{
  "trx_id": "e08f2303813f2713b478e738a9923419d2c2a362",
  "block": 17494455,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:41:33",
  "op": [
    "comment_options",
    {
      "author": "lowesyang",
      "permlink": "ipfs",
      "max_accepted_payout": "1000000.000 SBD",
      "percent_steem_dollars": 0,
      "allow_votes": true,
      "allow_curation_rewards": true,
      "extensions": []
    }
  ]
}
lowesyangpublished a new post: ipfs
2017/11/24 05:41:33
parent author
parent permlinkblockchain
authorlowesyang
permlinkipfs
title区块链给我们带来什么(二)IPFS协议——分布式文件系统
body<html> <p>星际文件系统IPFS(InterPlanetary File System)是一个面向全球的、点对点的分布式版本文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。</p> <p>IPFS想要实现的是一个去中心化的分布式web网络。内容不再通过中心服务器响应,而是以P2P的方式从邻近的对等节点拉取;同时全网维护一个统一的路由表,每个节点作自我调整,以保证节点与数据的动态增删、完整性、去冗余等细节问题。</p> <h2>为什么需要IPFS</h2> <p>根据<a href="https://ipfs.io/#why">官方网站</a>的介绍,传统的HTTP协议具有以下不足之处:</p> <ol> <li><strong>HTTP的效率低下,并且服务器昂贵。</strong>使用HTTP协议从中心化的服务器集群中一次需要下载一个完整文件,而P2P的方式可以从许多peers(对等节点)中下载不同的数据块,经研究可以节省60%的带宽成本。</li> <li><strong>历史文件被删除。</strong>网页的平均寿命是100天,部分网站数据不能得到永久保存。这也是受限于中心化服务器的高存储成本。</li> <li><strong>HTTP的中心化限制了发展机会。</strong>如下图,全球互联网的域名解析服务,根源上是由13个根服务器所提供。同时主要的云服务也由几家重要的云服务商所提供。政府和机构可以在这些中心化集群前截取HTTP消息包,窥探和监控网民的生活;黑客们也可以通过DDOS等手段攻击中心化的服务器集群,网络瘫痪的案例屡见不鲜。</li> <li><strong>网络应用过于依赖主干网。</strong>当主干网因为不可抗力因素造成拥塞或宕机等,无法继续服务时,应用也会受到影响。</li> </ol> <p>HTTP协议诞生20年来,协议也从1.0到2.0,但web应用本质上还是基于B/S架构的模式,它的根本劣势仍然无法得到很好的改进。</p> <h2>IPFS的工作原理</h2> <p>IPFS的出现,则是为了解决中心化web的这些问题。它从本质上改变了<strong>网络数据的分发机制</strong>。</p> <ul> <li>每个文件及其其包含的所有数据块,都会转换为一个散列字符串,称为<strong>哈希指纹</strong>。</li> <li>每个节点维护一张DHT(分布式哈希表),包含相应数据块与目标节点的对应映射关系。整个哈希表被组织成二叉树,平均查询联系节点的复杂度是O(log2N)。例如要查询10000万节点只需20跳。</li> <li><strong>基于内容寻址而非域名寻址</strong>。只需要通过文件或数据块的哈希值,IPFS便可自动在全网节点中找到拥有这些数据块的节点,并从节点上拉去数据。</li> <li>IPFS使用一个叫IPNS的分布式命名系统,将难于记忆的数据哈希值映射为易于记忆的字符串。这可以类比于域名与IP地址的映射关系。</li> </ul> <p>IPFS具有如下一些特性:</p> <ul> <li>相同数据内容被赋予唯一的哈希指纹,通过哈希指纹的对比即可判断数据块是否一致。</li> <li>节点本身使用类似git的版本控制系统,来管理本地文件与数据块。这既保证了数据块的去冗余,又提供了可追溯的历史版本。</li> <li>IPFS节点在维护哈希路由表、账本一致性方面,需使用区块链技术,一方面是在动态增减内容、节点方面与全网达成共识;另一方面是为激励机制中代币发行与账本管理建设基础平台。</li> <li>通过发行代币来激励节点存储稀有的数据块。可参考<a href="http://filecoin.io/">filecoin.io</a>。</li> <li>节点不仅可从其他节点拉取所需数据,同时也可将该新数据存储在自己节点,供其他节点下载。</li> </ul> <h2>一个剧情</h2> <p>小明想要观看一部xxx.avi的视频</p> <ol> <li>小红和小刚以前看过该视频,于是他们将视频文件加入IPFS网络,得到相同的哈希指纹B。(现实中,若该视频在周边好几个节点都持有,IPFS会把文件分块去重,节省节点的存储成本)</li> <li>小明在本地通过哈希指纹B(形如 /ipfs/B 的路径名),试图从IPFS网络拉取该视频。小明不关心最终的视频数据来自哪些节点。</li> <li>小明的节点<strong>索引DHT中的哈希值所对应的节点列表,并行地从这些节点下载部分数据块</strong>。(注意这里是部分,IPFS网络会自动从各节点下载部分数据块,再由本地的manager拼成完整的文件)</li> <li>小明的节点获得了这个视频,不仅自己可以观看,还可以为其他人提供资源。</li> </ol> <h2>技术白皮书</h2> <blockquote>以下是对<a href="https://github.com/ipfs/papers/blob/master/ipfs-cap2pfs/ipfs-p2p-file-system.pdf">技术白皮书</a>的一些梳理,不感兴趣的读者可直接跳过。</blockquote> <h2>身份信息的生成与验证</h2> <p>节点通过NodeId唯一标识。它通常是使用S/kademlia的静态加密难题所创建的公钥。节点会存储它的公私钥对,用户可以在每次初始化时注册成为一个“新”节点,但这导致损失积累的网络收益。</p> <pre><code>type NodeId Multihash<br> type Multihash []byte &nbsp;// 自描述加密哈希摘要<br> type PublicKey []byte<br> type PrivateKey []byte // 自描述的私钥<br> type Node struct {<br> &nbsp;&nbsp;&nbsp;NodeId NodeID<br> &nbsp;&nbsp;&nbsp;PubKey PublicKey<br> &nbsp;&nbsp;&nbsp;PriKey PrivateKey<br> }<br> //基于S / Kademlia的IPFS身份生成:<br> difficulty = &lt;integer parameter&gt;<br> n = Node{}<br> do {<br> &nbsp;&nbsp;&nbsp;n.PubKey, n.PrivKey = PKI.genKeyPair()<br> &nbsp;&nbsp;&nbsp;n.NodeId = hash(n.PubKey)<br> &nbsp;&nbsp;&nbsp;p = count_preceding_zero_bits(hash(n.NodeId))<br> } while (p &lt; difficulty)</code></pre> <p>第一次连接时,对等节点交换公钥并检查:<strong>对方的NodeId是否等于公钥的哈希值</strong>。若否,则终止连接。<br> </p> <h2>网络</h2> <p>IPFS可使用任何网络,但不承担对IP的获取也不依赖于IP层。它有如下几点特性:</p> <ul> <li>传输方面(Transport):可用任意传输层的协议,甚至包含WebRTC与uTP。</li> <li>可靠性(Reliability):在下层设施无法保证可靠性时,使用uTP和SCTP来提供可靠性。</li> <li>连接(Connectivity):使用ICE NET穿透技术。</li> <li>完整性(Integrity):可使用哈希校验完整性。</li> <li>可验证性(Authenticity):使用发送者的公钥集合HMAC算法来检查消息的真实性。</li> </ul> <h2>路由</h2> <p>IPFS的路由表使用基于S/Kademlia和Coral的分布式松散哈希表(DSHT)。接口如下:</p> <pre><code>type IPFSRouting interface {<br> &nbsp;&nbsp;&nbsp;FindPeer(node NodeId) // 获取特定NodeId的网络地址。<br> &nbsp;&nbsp;&nbsp;SetValue(key []bytes, value []bytes) // 往DHT存储一个小的元数据。<br> &nbsp;&nbsp;&nbsp;GetValue(key []bytes) // 从DHT获取元数据。<br> &nbsp;&nbsp;&nbsp;ProvideValue(key Multihash) // 声明这个节点可提供一个大的数据。<br> &nbsp;&nbsp;&nbsp;FindValuePeers(key Multihash, min int) // 获取服务于该大数据的节点。<br> }</code></pre> <p>注意:不同的用例将要求基本不同的路由系统(例如广域网中使用DHT,局域网中使用静态HT)。因此,IPFS路由系统可以根据用户的需求替换的。只要使用上面的接口就可以了,系统都能继续正常运行。<br> </p> <h2>块的交换——BitSwap协议</h2> <p>IPFS 中的BitSwap协议受到BitTorrent 的启发,通过对等节点间交换数据块来分发数据的。与BT类似, 每个节点寻找自己需要的数据块集合(wangt_list),同时也提供已有的数据块集合作交换(have_list)。但与BT不同的是,BitSwap不局限于一个torrent中的数据块。BitSwap协议中存在一个永久市场,这个市场包含各个节点所拥有的所有块数据,而<strong>不管这些数据块来自于哪个文件。</strong>在基本情况下,BitSwap节点必须以块的形式彼此提供直接的值。只有当跨节点的块的分布是互补的,即各取所需的时候,才会获得最好的效果。 通常情况并非如此,在某些情况下,节点必须为自己的块而工作。 在节点没有其对等节点所需的(或根本没有的)情况下,<strong>它会以更低的优先级去寻找对等节点想要的块(节点可能无法通过提供数据块而受益)</strong>。这会激励节点去缓存和传播稀有片段, 即使节点对这些片段不感兴趣。BitSwap协议包含以下关键部分:<strong>BitSwap 信用</strong>协议必须带有激励机制,去激励节点去seed 其他节点所需要的块,而它们本身是不需要这些块的。因此,BitSwap的节点很积极去给对端节点发送块,并期待获得报酬。但必须防止水蛭攻击(空负载节点从不共享块)。一个简单的类信用系统需要解决以下问题:</p> <ul> <li>对等节点间通过字节认证的方式追踪平衡,即确保数据块尽量均衡地分散在各节点,而非大量集中在某一两个节点中。</li> <li>对等节点以一定的概率向债务方节点发送数据块,这个概率随着债务的增加而降低。</li> </ul> <p><strong>BitSwap 策略</strong>BitSwap 对等节点采用很多不同的策略,这些策略对整个数据块的交换执行力产生了不同的巨大影响。功能策略的选择应该致力于达成以下目标:</p> <ul> <li>最大化节点及块交换的交易性能。</li> <li>防止空负载节点利用和损坏交易。</li> <li>有效抵抗其他未知策略。</li> <li>对守信任的节点放宽限制。</li> </ul> <p>有一个实践的例子是使用sigmoid函数,根据债务比例(debt retio)进行放缩:r=\frac{bytesSent}{bytesRecv+1} 根据r计算发送到负债节点的概率:p(send | r)=1-\frac{1}{1+exp(6-3r)} 负债比是信任的衡量标准。对应之前成功交换过很多数据的节点会更宽容,而对不受信任或不了解的节点会严格许多。这么做可以:</p> <ul> <li>抵御那些创造大量新节点的攻击者。</li> <li>保护之前成功的交易关系,即使某个节点暂时无法提供数据。</li> <li>阻塞已经恶化的交易关系中节点间的通信,直到被再次证明。</li> </ul> <p><strong>BitSwap 账本</strong>BitSwap节点保存了一个记录与所有其他节点之间交易的账本。这可以让节点追踪历史记录以及避免被篡改。当激活了一个链接,BitSwap节点就会互换它们账本信息。如果这些账本信息并不完全相同,<strong>账本将会重新初始化</strong>,那些应计信贷和债务会丢失。恶意节点会有意去抹去“这些“账本,从而期望清除自己的债务。节点是不太可能在失去了应计信用的情况下还能累积足够的债务去授权认证。而伙伴节点可以自由地将其视为不当行为, 拒绝交易。账本的数据结构:</p> <pre><code>type Ledger struct {<br> &nbsp;&nbsp;&nbsp;owner NodeId &nbsp;&nbsp;&nbsp;&nbsp;//节点id<br> &nbsp;&nbsp;&nbsp;partner NodeId &nbsp;&nbsp;//伙伴节点id<br> &nbsp;&nbsp;&nbsp;bytes_sent int &nbsp;&nbsp;//发送字节总量<br> &nbsp;&nbsp;&nbsp;bytes_recv int &nbsp;&nbsp;//收到字节总量<br> &nbsp;&nbsp;&nbsp;timestamp Timestamp<br> }</code></pre> <p><strong>BitSwap 协议详解</strong>数据结构如下:</p> <pre><code>// Additional state kept<br> type BitSwap struct {<br> &nbsp;&nbsp;ledgers map[NodeId]Ledger // Ledgers known to this node, inc inactive<br> &nbsp;&nbsp;active map[NodeId]Peer // currently open connections to other nodes<br> &nbsp;&nbsp;need_list []Multihash // checksums of blocks this node needs<br> &nbsp;&nbsp;have_list []Multihash // checksums of blocks this node has<br> }<br> type Peer struct {<br> &nbsp;&nbsp;nodeid NodeId<br> &nbsp;&nbsp;ledger Ledger // Ledger between the node and this peer<br> &nbsp;&nbsp;last_seen Timestamp // timestamp of last received message<br> &nbsp;&nbsp;want_list []Multihash // checksums of all blocks wanted by peer <br> &nbsp;&nbsp;// includes blocks wanted by peer's peers<br> }<br> // Protocol interface:<br> interface Peer {<br> &nbsp;&nbsp;open (nodeid : NodeId, ledger : Ledger);<br> &nbsp;&nbsp;send_want_list (want_list : WantList);<br> &nbsp;&nbsp;send_block(block: Block) -&gt; (complete:Bool);<br> &nbsp;&nbsp;close(final: Bool);<br> }</code></pre> <p>对等连接的生命周期:</p> <ul> <li>Open:对等节点间发送ledgers直到他们达成一致。</li> <li>Sending:对等节点间交换want_lists和数据块。</li> <li>Close:对等节点断开连接。</li> <li>Ignored:如果节点采取了不发送的策略,则其对等体被忽略(在一段预设的超时时间段内)</li> </ul> <p>相关API:</p> <ul> <li>Peer.open(NodeId,Ledger)</li> <li>Peer.send_want_list(WantList)</li> <li>Peer.send_block(Block)</li> <li>Peer.close(Bool)</li> </ul> <h2>Merkle DAG 对象</h2> <p>IPFS建造了一个Merkle DAG(无回路有向图),对象之间的links都是hash加密嵌入在源目标中。这是Git数据结构的一种推广。它给IPFS提供了很多有用的属性:</p> <ul> <li><strong>内容地址化</strong>:所有内容都是被多重hash校验和来唯一标识,<strong>包括links。</strong></li> <li><strong>防止篡改</strong>:所有内容用它的校验和来验证。如果数据被篡改或损坏,则校验和会发生变化。</li> <li><strong>去冗余</strong>:所有拥有相同内容的对象<strong>只被存储一次</strong>。这里借鉴了git的tree和commits的原理,详细请看 <a href="http://blog.jobbole.com/26209/">Git内部原理</a> 。</li> </ul> <p>IPFS对象的数据结构:</p> <pre><code>type IPFSLink struct {<br> &nbsp;&nbsp;&nbsp;Name string &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 此link的别名<br> &nbsp;&nbsp;&nbsp;Hash Multihash &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 目标的加密hash<br> &nbsp;&nbsp;&nbsp;Size int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 目标总大小<br> }<br> type IPFSObject struct {<br> &nbsp;&nbsp;&nbsp;links []IPFSLink &nbsp;&nbsp;&nbsp;&nbsp;//links数组<br> &nbsp;&nbsp;&nbsp;data []byte &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不透明内容数据<br> }</code></pre> <p><strong>路径</strong>IPFS中对象所采用的路径格式是:</p> <pre><code># format<br> /ipfs/&lt;hash-of-object&gt;/&lt;name-path-to-object&gt;<br> # example<br> /ipfs/XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x/foo.txt</code></pre> <h2>文件</h2> <p>IPFS为模型化版本系统定义了一组对象模型,与Git很类似:</p> <ol> <li>block:一个可变大小的数据块。</li> <li>list:块或其他链表的集合。</li> <li>tree:块、链表和其他树的集合。</li> <li>commit:当前文件数在版本历史记录中的一个快照。</li> </ol> <p><strong>Blob</strong>Blob对象代表一个文件,并且包含一个可寻址的数据单元。<strong>IPFS文件可以使用lists或者blobs来表示。</strong>要注意的是,Blob没有链接。</p> <pre><code>{<br> &nbsp;&nbsp;&nbsp;"data": "some data here",<br> &nbsp;&nbsp;&nbsp;// blobs have no links<br> }</code></pre> <p><strong>List</strong>List对象包含一个有序的队列,该队列由blob或list对象组成。</p> <pre><code>{<br> &nbsp;&nbsp;&nbsp;"data": ["blob", "list", "blob"],<br> &nbsp;&nbsp;&nbsp;// lists have an array of object types as data<br> &nbsp;&nbsp;&nbsp;"links": [<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x","size": 189458 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5","size": 19441 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z","size": 5286 }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// lists have no names in links<br> &nbsp;&nbsp;&nbsp;]<br> }</code></pre> <p><strong>Tree</strong>在IPFS中,Tree对象与Git的tree类似:它代表一个目录,或者一个名字到哈希值的映射表。哈希值表示blobs,lists,其他的trees,或commits。</p> <pre><code>{<br> &nbsp;&nbsp;&nbsp;"data": ["blob", "list", "blob"],<br> &nbsp;&nbsp;&nbsp;// trees have an array of object types as data<br> &nbsp;&nbsp;&nbsp;"links": [<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x","name": "less", "size": 189458 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5","name": "script", "size": 19441 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z","name": "template", "size": 5286 }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// trees do have names<br> &nbsp;&nbsp;&nbsp;]<br> }</code></pre> <p><strong>Commit</strong>在IPFS中,commit对象代表任何对象在版本历史记录中的一个快照。它与Git的commit也非常类似,但它可以指向任何类型的对象(Git中只能指向tree或其他commit)。</p> <pre><code>&gt; ipfs file-cat &lt;ccc111-hash&gt; --json<br> {<br> &nbsp;&nbsp;&nbsp;"data": {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"type": "tree",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"date": "2014-09-20 12:44:06Z",<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"message": "This is a commit message."<br> &nbsp;&nbsp;&nbsp;},<br> &nbsp;&nbsp;&nbsp;"links": [<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "&lt;ccc000-hash&gt;","name": "parent", "size": 25309 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "&lt;ttt111-hash&gt;","name": "object", "size": 5198 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "&lt;aaa111-hash&gt;","name": "author", "size": 109 }<br> &nbsp;&nbsp;&nbsp;]<br> }<br> &gt; ipfs file-cat &lt;ttt111-hash&gt; --json<br> {<br> &nbsp;&nbsp;&nbsp;"data": ["tree", "tree", "blob"],<br> &nbsp;&nbsp;&nbsp;"links": [<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "&lt;ttt222-hash&gt;","name": "ttt222-name", "size": 1234 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "&lt;ttt333-hash&gt;","name": "ttt333-name", "size": 3456 },<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ "hash": "&lt;bbb222-hash&gt;","name": "bbb222-name", "size": 22 }<br> &nbsp;&nbsp;&nbsp;]<br> }<br> &gt; ipfs file-cat &lt;bbb222-hash&gt; --json<br> {<br> &nbsp;&nbsp;&nbsp;"data": "blob222 data",<br> &nbsp;&nbsp;&nbsp;"links": []<br> }</code></pre> <p><strong>将文件分割成lists和blobs</strong>IPFS提供了以下几个可选的选择:</p> <ul> <li>使用Rabin Fingerprints来选取合适的块边界。</li> <li>使用rsync rolling-checksum算法来检测块在版本之间的改变。</li> <li>允许用户指定一个可为特定文件而调整的块分割函数。</li> </ul> <h2>IPNS:命名以及易变状态</h2> <p>目前为止,IPFS桟形成了一个由对等块交换构建的内容可寻址的DAG对象。这提供了发布和获取不可变对象的服务,甚至可以追踪这些对象的版本历史。然而,我们还缺少一个关键部分:<strong>易变命名(mutable naming)</strong>。我们希望有类似域名与IP的多对一映射的关系,采用可变的命名映射到不可变的哈希值上。IPFS提供了如下几种方案:<strong>1. 自验证的命名系统</strong>使用SFS(Self-Certified Filesystems)中的命名方案,我们可以在指定加密命名空间下构建可自验证的名称。</p> <ol> <li>NodeId=hash(node.PubKey)&nbsp;</li> <li>为每位用户分配一个可变的命名空间,例如 /ipns/&lt;NodeId&gt;。</li> <li>一个用户可以在此路径下发布一个由自己私钥签名的对象,例如路径 /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/。</li> <li>当其他用户获取该对象时,使用公钥进行验签,即验证所用的公钥是否与NodeId匹配。这验证了用户发布对象的真实性,同时也获取到了可变状态。</li> </ol> <p>发布对象中任何links均可以在命名空间中充当子名称:</p> <pre><code>/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/<br> /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/docs<br> /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/docs/ipfs</code></pre> <p><strong>2. 人类友好名称</strong>IPNS使用很长的哈希值作为名称,很难被记住,对人类这种物种来说极不友好。因此我们需要采取一些改进措施,使得路径名称变得易于记忆:<strong>Peer Links</strong>即用户可以直接将其他用户的对象link到自己的对象上(命名空间、主目录等)。例如:</p> <pre><code># Alice links 到Bob上<br> ipfs link /&lt;alice-pk-hash&gt;/friends/bob /&lt;bob-pk-hash&gt;<br> # Eve links 到Alice上<br> ipfs link /&lt;eve-pk-hash/friends/alice /&lt;alice-pk-hash&gt;<br> # Eve 也可以访问Bob<br> /&lt;eve-pk-hash/friends/alice/friends/bob<br> # 访问Verisign 认证域<br> /&lt;verisign-pk-hash&gt;/foo.com</code></pre> <p><strong>DNS TXT IPNS记录</strong>如果/ipns/是一个有效的域名,则会在DNS TXT记录中查找到相应的记录。<strong>本质上是为哈希值起了一个别名。</strong></p> <pre><code># this DNS TXT record<br> ipfs.benet.ai. TXT "ipfs=XLF2ipQ4jD3U ..."<br> # behaves as symlink<br> ln -s /ipns/XLF2ipQ4jD3U /ipns/fs.benet.ai</code></pre> <p><strong>可读的标识符</strong>IPFS支持将哈希地址译成可发音的单词:</p> <pre><code># proquint语句<br> /ipns/dahih-dolij-sozuk-vosah-luvar-fuluh<br> # 将解析成<br> /ipns/KhAwNprxYVxKqpDZ</code></pre> <p><strong>缩短名称服务</strong>这种方案跟我们今天的DNS和Web URL较为类似。直接上例子:</p> <pre><code># 用户可以从下面获取一个link<br> /ipns/shorten.er/foobar<br> # 然后放到自己的命名空间<br> /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm</code></pre> <h2>小结</h2> <p>一种新的技术想要替代旧的技术,无非是从两方面着手:</p> <ol> <li>提升效率</li> <li>降低成本</li> </ol> <p>IPFS综合了先前P2P系统的优点,包括DHT、BitTorrent、Git和SFS等。它把P2P的格局放到了全网,更好地实现了从多个资源节点获取内容,不依赖主干网,也不局限于一个Torrent,提升了资源响应速度与可靠性;同时基于IPFS,我们可以实现一种更廉价、带奖励机制的分布式存储方案(如<a href="http://chainx.org/paper/index/index/id/13.html">FileCoin</a>),这为IPFS生态的发展提供了十足的想象空间。IPFS的实现得益于区块链技术的发展。在区块链诞生之前,对于IPFS的实现存在两个问题:</p> <ol> <li>节点网络在维护路由表的一致性,特别是涉及到节点、资源的动态增删,节点的信用以及防欺骗和防free loader等方面,往往不得不采用一些中心化的解决方案(例如迅雷下载P2P加速),而这又违背了去中心的理念。</li> <li>对节点实行奖惩机制,涉及到账本、信用管理,代币发行以及交易事务处理等等,在分布式架构下难以保证高可靠、高可用和安全防篡改。过去的解决方案也是引入一个中心化的机构作背书。</li> </ol> <p>这些问题在今天来看,使用区块链技术,综合效率和成本两方面,是再合适不过的。在接下来的10年,我们一定会看到IPFS在分布式应用方面大行其道。基于区块链技术的杀手级应用,很可能也会因此到来。</p> </html>
json metadata{"tags":["blockchain","ipfs","distribution"],"links":["https://ipfs.io/#why","http://filecoin.io/","https://github.com/ipfs/papers/blob/master/ipfs-cap2pfs/ipfs-p2p-file-system.pdf","http://blog.jobbole.com/26209/","http://chainx.org/paper/index/index/id/13.html"],"app":"steemit/0.1","format":"html"}
Transaction InfoBlock #17494455/Trx e08f2303813f2713b478e738a9923419d2c2a362
View Raw JSON Data
{
  "trx_id": "e08f2303813f2713b478e738a9923419d2c2a362",
  "block": 17494455,
  "trx_in_block": 10,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:41:33",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "blockchain",
      "author": "lowesyang",
      "permlink": "ipfs",
      "title": "区块链给我们带来什么(二)IPFS协议——分布式文件系统",
      "body": "<html>\n<p>星际文件系统IPFS(InterPlanetary File System)是一个面向全球的、点对点的分布式版本文件系统,目标是为了补充(甚至是取代)目前统治互联网的超文本传输协议(HTTP),将所有具有相同文件系统的计算设备连接在一起。</p>\n<p>IPFS想要实现的是一个去中心化的分布式web网络。内容不再通过中心服务器响应,而是以P2P的方式从邻近的对等节点拉取;同时全网维护一个统一的路由表,每个节点作自我调整,以保证节点与数据的动态增删、完整性、去冗余等细节问题。</p>\n<h2>为什么需要IPFS</h2>\n<p>根据<a href=\"https://ipfs.io/#why\">官方网站</a>的介绍,传统的HTTP协议具有以下不足之处:</p>\n<ol>\n  <li><strong>HTTP的效率低下,并且服务器昂贵。</strong>使用HTTP协议从中心化的服务器集群中一次需要下载一个完整文件,而P2P的方式可以从许多peers(对等节点)中下载不同的数据块,经研究可以节省60%的带宽成本。</li>\n  <li><strong>历史文件被删除。</strong>网页的平均寿命是100天,部分网站数据不能得到永久保存。这也是受限于中心化服务器的高存储成本。</li>\n  <li><strong>HTTP的中心化限制了发展机会。</strong>如下图,全球互联网的域名解析服务,根源上是由13个根服务器所提供。同时主要的云服务也由几家重要的云服务商所提供。政府和机构可以在这些中心化集群前截取HTTP消息包,窥探和监控网民的生活;黑客们也可以通过DDOS等手段攻击中心化的服务器集群,网络瘫痪的案例屡见不鲜。</li>\n  <li><strong>网络应用过于依赖主干网。</strong>当主干网因为不可抗力因素造成拥塞或宕机等,无法继续服务时,应用也会受到影响。</li>\n</ol>\n<p>HTTP协议诞生20年来,协议也从1.0到2.0,但web应用本质上还是基于B/S架构的模式,它的根本劣势仍然无法得到很好的改进。</p>\n<h2>IPFS的工作原理</h2>\n<p>IPFS的出现,则是为了解决中心化web的这些问题。它从本质上改变了<strong>网络数据的分发机制</strong>。</p>\n<ul>\n  <li>每个文件及其其包含的所有数据块,都会转换为一个散列字符串,称为<strong>哈希指纹</strong>。</li>\n  <li>每个节点维护一张DHT(分布式哈希表),包含相应数据块与目标节点的对应映射关系。整个哈希表被组织成二叉树,平均查询联系节点的复杂度是O(log2N)。例如要查询10000万节点只需20跳。</li>\n  <li><strong>基于内容寻址而非域名寻址</strong>。只需要通过文件或数据块的哈希值,IPFS便可自动在全网节点中找到拥有这些数据块的节点,并从节点上拉去数据。</li>\n  <li>IPFS使用一个叫IPNS的分布式命名系统,将难于记忆的数据哈希值映射为易于记忆的字符串。这可以类比于域名与IP地址的映射关系。</li>\n</ul>\n<p>IPFS具有如下一些特性:</p>\n<ul>\n  <li>相同数据内容被赋予唯一的哈希指纹,通过哈希指纹的对比即可判断数据块是否一致。</li>\n  <li>节点本身使用类似git的版本控制系统,来管理本地文件与数据块。这既保证了数据块的去冗余,又提供了可追溯的历史版本。</li>\n  <li>IPFS节点在维护哈希路由表、账本一致性方面,需使用区块链技术,一方面是在动态增减内容、节点方面与全网达成共识;另一方面是为激励机制中代币发行与账本管理建设基础平台。</li>\n  <li>通过发行代币来激励节点存储稀有的数据块。可参考<a href=\"http://filecoin.io/\">filecoin.io</a>。</li>\n  <li>节点不仅可从其他节点拉取所需数据,同时也可将该新数据存储在自己节点,供其他节点下载。</li>\n</ul>\n<h2>一个剧情</h2>\n<p>小明想要观看一部xxx.avi的视频</p>\n<ol>\n  <li>小红和小刚以前看过该视频,于是他们将视频文件加入IPFS网络,得到相同的哈希指纹B。(现实中,若该视频在周边好几个节点都持有,IPFS会把文件分块去重,节省节点的存储成本)</li>\n  <li>小明在本地通过哈希指纹B(形如 /ipfs/B 的路径名),试图从IPFS网络拉取该视频。小明不关心最终的视频数据来自哪些节点。</li>\n  <li>小明的节点<strong>索引DHT中的哈希值所对应的节点列表,并行地从这些节点下载部分数据块</strong>。(注意这里是部分,IPFS网络会自动从各节点下载部分数据块,再由本地的manager拼成完整的文件)</li>\n  <li>小明的节点获得了这个视频,不仅自己可以观看,还可以为其他人提供资源。</li>\n</ol>\n<h2>技术白皮书</h2>\n<blockquote>以下是对<a href=\"https://github.com/ipfs/papers/blob/master/ipfs-cap2pfs/ipfs-p2p-file-system.pdf\">技术白皮书</a>的一些梳理,不感兴趣的读者可直接跳过。</blockquote>\n<h2>身份信息的生成与验证</h2>\n<p>节点通过NodeId唯一标识。它通常是使用S/kademlia的静态加密难题所创建的公钥。节点会存储它的公私钥对,用户可以在每次初始化时注册成为一个“新”节点,但这导致损失积累的网络收益。</p>\n<pre><code>type NodeId Multihash<br>\ntype Multihash []byte &nbsp;// 自描述加密哈希摘要<br>\ntype PublicKey []byte<br>\ntype PrivateKey []byte // 自描述的私钥<br>\ntype Node struct {<br>\n &nbsp;&nbsp;&nbsp;NodeId NodeID<br>\n &nbsp;&nbsp;&nbsp;PubKey PublicKey<br>\n &nbsp;&nbsp;&nbsp;PriKey PrivateKey<br>\n}<br>\n//基于S / Kademlia的IPFS身份生成:<br>\ndifficulty = &lt;integer parameter&gt;<br>\nn = Node{}<br>\ndo {<br>\n &nbsp;&nbsp;&nbsp;n.PubKey, n.PrivKey = PKI.genKeyPair()<br>\n &nbsp;&nbsp;&nbsp;n.NodeId = hash(n.PubKey)<br>\n &nbsp;&nbsp;&nbsp;p = count_preceding_zero_bits(hash(n.NodeId))<br>\n} while (p &lt; difficulty)</code></pre>\n<p>第一次连接时,对等节点交换公钥并检查:<strong>对方的NodeId是否等于公钥的哈希值</strong>。若否,则终止连接。<br>\n</p>\n<h2>网络</h2>\n<p>IPFS可使用任何网络,但不承担对IP的获取也不依赖于IP层。它有如下几点特性:</p>\n<ul>\n  <li>传输方面(Transport):可用任意传输层的协议,甚至包含WebRTC与uTP。</li>\n  <li>可靠性(Reliability):在下层设施无法保证可靠性时,使用uTP和SCTP来提供可靠性。</li>\n  <li>连接(Connectivity):使用ICE NET穿透技术。</li>\n  <li>完整性(Integrity):可使用哈希校验完整性。</li>\n  <li>可验证性(Authenticity):使用发送者的公钥集合HMAC算法来检查消息的真实性。</li>\n</ul>\n<h2>路由</h2>\n<p>IPFS的路由表使用基于S/Kademlia和Coral的分布式松散哈希表(DSHT)。接口如下:</p>\n<pre><code>type IPFSRouting interface {<br>\n &nbsp;&nbsp;&nbsp;FindPeer(node NodeId) // 获取特定NodeId的网络地址。<br>\n &nbsp;&nbsp;&nbsp;SetValue(key []bytes, value []bytes) // 往DHT存储一个小的元数据。<br>\n &nbsp;&nbsp;&nbsp;GetValue(key []bytes) // 从DHT获取元数据。<br>\n &nbsp;&nbsp;&nbsp;ProvideValue(key Multihash) // 声明这个节点可提供一个大的数据。<br>\n &nbsp;&nbsp;&nbsp;FindValuePeers(key Multihash, min int) // 获取服务于该大数据的节点。<br>\n}</code></pre>\n<p>注意:不同的用例将要求基本不同的路由系统(例如广域网中使用DHT,局域网中使用静态HT)。因此,IPFS路由系统可以根据用户的需求替换的。只要使用上面的接口就可以了,系统都能继续正常运行。<br>\n</p>\n<h2>块的交换——BitSwap协议</h2>\n<p>IPFS 中的BitSwap协议受到BitTorrent 的启发,通过对等节点间交换数据块来分发数据的。与BT类似, 每个节点寻找自己需要的数据块集合(wangt_list),同时也提供已有的数据块集合作交换(have_list)。但与BT不同的是,BitSwap不局限于一个torrent中的数据块。BitSwap协议中存在一个永久市场,这个市场包含各个节点所拥有的所有块数据,而<strong>不管这些数据块来自于哪个文件。</strong>在基本情况下,BitSwap节点必须以块的形式彼此提供直接的值。只有当跨节点的块的分布是互补的,即各取所需的时候,才会获得最好的效果。 通常情况并非如此,在某些情况下,节点必须为自己的块而工作。 在节点没有其对等节点所需的(或根本没有的)情况下,<strong>它会以更低的优先级去寻找对等节点想要的块(节点可能无法通过提供数据块而受益)</strong>。这会激励节点去缓存和传播稀有片段, 即使节点对这些片段不感兴趣。BitSwap协议包含以下关键部分:<strong>BitSwap 信用</strong>协议必须带有激励机制,去激励节点去seed 其他节点所需要的块,而它们本身是不需要这些块的。因此,BitSwap的节点很积极去给对端节点发送块,并期待获得报酬。但必须防止水蛭攻击(空负载节点从不共享块)。一个简单的类信用系统需要解决以下问题:</p>\n<ul>\n  <li>对等节点间通过字节认证的方式追踪平衡,即确保数据块尽量均衡地分散在各节点,而非大量集中在某一两个节点中。</li>\n  <li>对等节点以一定的概率向债务方节点发送数据块,这个概率随着债务的增加而降低。</li>\n</ul>\n<p><strong>BitSwap 策略</strong>BitSwap 对等节点采用很多不同的策略,这些策略对整个数据块的交换执行力产生了不同的巨大影响。功能策略的选择应该致力于达成以下目标:</p>\n<ul>\n  <li>最大化节点及块交换的交易性能。</li>\n  <li>防止空负载节点利用和损坏交易。</li>\n  <li>有效抵抗其他未知策略。</li>\n  <li>对守信任的节点放宽限制。</li>\n</ul>\n<p>有一个实践的例子是使用sigmoid函数,根据债务比例(debt retio)进行放缩:r=\\frac{bytesSent}{bytesRecv+1} 根据r计算发送到负债节点的概率:p(send | r)=1-\\frac{1}{1+exp(6-3r)} 负债比是信任的衡量标准。对应之前成功交换过很多数据的节点会更宽容,而对不受信任或不了解的节点会严格许多。这么做可以:</p>\n<ul>\n  <li>抵御那些创造大量新节点的攻击者。</li>\n  <li>保护之前成功的交易关系,即使某个节点暂时无法提供数据。</li>\n  <li>阻塞已经恶化的交易关系中节点间的通信,直到被再次证明。</li>\n</ul>\n<p><strong>BitSwap 账本</strong>BitSwap节点保存了一个记录与所有其他节点之间交易的账本。这可以让节点追踪历史记录以及避免被篡改。当激活了一个链接,BitSwap节点就会互换它们账本信息。如果这些账本信息并不完全相同,<strong>账本将会重新初始化</strong>,那些应计信贷和债务会丢失。恶意节点会有意去抹去“这些“账本,从而期望清除自己的债务。节点是不太可能在失去了应计信用的情况下还能累积足够的债务去授权认证。而伙伴节点可以自由地将其视为不当行为, 拒绝交易。账本的数据结构:</p>\n<pre><code>type Ledger struct {<br>\n &nbsp;&nbsp;&nbsp;owner NodeId &nbsp;&nbsp;&nbsp;&nbsp;//节点id<br>\n &nbsp;&nbsp;&nbsp;partner NodeId &nbsp;&nbsp;//伙伴节点id<br>\n &nbsp;&nbsp;&nbsp;bytes_sent int &nbsp;&nbsp;//发送字节总量<br>\n &nbsp;&nbsp;&nbsp;bytes_recv int &nbsp;&nbsp;//收到字节总量<br>\n &nbsp;&nbsp;&nbsp;timestamp Timestamp<br>\n}</code></pre>\n<p><strong>BitSwap 协议详解</strong>数据结构如下:</p>\n<pre><code>// Additional state kept<br>\ntype BitSwap struct {<br>\n &nbsp;&nbsp;ledgers map[NodeId]Ledger // Ledgers known to this node, inc inactive<br>\n &nbsp;&nbsp;active map[NodeId]Peer // currently open connections to other nodes<br>\n &nbsp;&nbsp;need_list []Multihash // checksums of blocks this node needs<br>\n &nbsp;&nbsp;have_list []Multihash // checksums of blocks this node has<br>\n}<br>\ntype Peer struct {<br>\n &nbsp;&nbsp;nodeid NodeId<br>\n &nbsp;&nbsp;ledger Ledger // Ledger between the node and this peer<br>\n &nbsp;&nbsp;last_seen Timestamp // timestamp of last received message<br>\n &nbsp;&nbsp;want_list []Multihash // checksums of all blocks wanted by peer <br>\n &nbsp;&nbsp;// includes blocks wanted by peer's peers<br>\n}<br>\n// Protocol interface:<br>\ninterface Peer {<br>\n &nbsp;&nbsp;open (nodeid : NodeId, ledger : Ledger);<br>\n &nbsp;&nbsp;send_want_list (want_list : WantList);<br>\n &nbsp;&nbsp;send_block(block: Block) -&gt; (complete:Bool);<br>\n &nbsp;&nbsp;close(final: Bool);<br>\n}</code></pre>\n<p>对等连接的生命周期:</p>\n<ul>\n  <li>Open:对等节点间发送ledgers直到他们达成一致。</li>\n  <li>Sending:对等节点间交换want_lists和数据块。</li>\n  <li>Close:对等节点断开连接。</li>\n  <li>Ignored:如果节点采取了不发送的策略,则其对等体被忽略(在一段预设的超时时间段内)</li>\n</ul>\n<p>相关API:</p>\n<ul>\n  <li>Peer.open(NodeId,Ledger)</li>\n  <li>Peer.send_want_list(WantList)</li>\n  <li>Peer.send_block(Block)</li>\n  <li>Peer.close(Bool)</li>\n</ul>\n<h2>Merkle DAG 对象</h2>\n<p>IPFS建造了一个Merkle DAG(无回路有向图),对象之间的links都是hash加密嵌入在源目标中。这是Git数据结构的一种推广。它给IPFS提供了很多有用的属性:</p>\n<ul>\n  <li><strong>内容地址化</strong>:所有内容都是被多重hash校验和来唯一标识,<strong>包括links。</strong></li>\n  <li><strong>防止篡改</strong>:所有内容用它的校验和来验证。如果数据被篡改或损坏,则校验和会发生变化。</li>\n  <li><strong>去冗余</strong>:所有拥有相同内容的对象<strong>只被存储一次</strong>。这里借鉴了git的tree和commits的原理,详细请看 <a href=\"http://blog.jobbole.com/26209/\">Git内部原理</a> 。</li>\n</ul>\n<p>IPFS对象的数据结构:</p>\n<pre><code>type IPFSLink struct {<br>\n &nbsp;&nbsp;&nbsp;Name string &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 此link的别名<br>\n &nbsp;&nbsp;&nbsp;Hash Multihash &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 目标的加密hash<br>\n &nbsp;&nbsp;&nbsp;Size int &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 目标总大小<br>\n}<br>\ntype IPFSObject struct {<br>\n &nbsp;&nbsp;&nbsp;links []IPFSLink &nbsp;&nbsp;&nbsp;&nbsp;//links数组<br>\n &nbsp;&nbsp;&nbsp;data []byte &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//不透明内容数据<br>\n}</code></pre>\n<p><strong>路径</strong>IPFS中对象所采用的路径格式是:</p>\n<pre><code># format<br>\n/ipfs/&lt;hash-of-object&gt;/&lt;name-path-to-object&gt;<br>\n# example<br>\n/ipfs/XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x/foo.txt</code></pre>\n<h2>文件</h2>\n<p>IPFS为模型化版本系统定义了一组对象模型,与Git很类似:</p>\n<ol>\n  <li>block:一个可变大小的数据块。</li>\n  <li>list:块或其他链表的集合。</li>\n  <li>tree:块、链表和其他树的集合。</li>\n  <li>commit:当前文件数在版本历史记录中的一个快照。</li>\n</ol>\n<p><strong>Blob</strong>Blob对象代表一个文件,并且包含一个可寻址的数据单元。<strong>IPFS文件可以使用lists或者blobs来表示。</strong>要注意的是,Blob没有链接。</p>\n<pre><code>{<br>\n &nbsp;&nbsp;&nbsp;\"data\": \"some data here\",<br>\n &nbsp;&nbsp;&nbsp;// blobs have no links<br>\n}</code></pre>\n<p><strong>List</strong>List对象包含一个有序的队列,该队列由blob或list对象组成。</p>\n<pre><code>{<br>\n &nbsp;&nbsp;&nbsp;\"data\": [\"blob\", \"list\", \"blob\"],<br>\n &nbsp;&nbsp;&nbsp;// lists have an array of object types as data<br>\n &nbsp;&nbsp;&nbsp;\"links\": [<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x\",\"size\": 189458 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5\",\"size\": 19441 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z\",\"size\": 5286 }<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// lists have no names in links<br>\n &nbsp;&nbsp;&nbsp;]<br>\n}</code></pre>\n<p><strong>Tree</strong>在IPFS中,Tree对象与Git的tree类似:它代表一个目录,或者一个名字到哈希值的映射表。哈希值表示blobs,lists,其他的trees,或commits。</p>\n<pre><code>{<br>\n &nbsp;&nbsp;&nbsp;\"data\": [\"blob\", \"list\", \"blob\"],<br>\n &nbsp;&nbsp;&nbsp;// trees have an array of object types as data<br>\n &nbsp;&nbsp;&nbsp;\"links\": [<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"XLYkgq61DYaQ8NhkcqyU7rLcnSa7dSHQ16x\",\"name\": \"less\", \"size\": 189458 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"XLHBNmRQ5sJJrdMPuu48pzeyTtRo39tNDR5\",\"name\": \"script\", \"size\": 19441 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"XLWVQDqxo9Km9zLyquoC9gAP8CL1gWnHZ7z\",\"name\": \"template\", \"size\": 5286 }<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// trees do have names<br>\n &nbsp;&nbsp;&nbsp;]<br>\n}</code></pre>\n<p><strong>Commit</strong>在IPFS中,commit对象代表任何对象在版本历史记录中的一个快照。它与Git的commit也非常类似,但它可以指向任何类型的对象(Git中只能指向tree或其他commit)。</p>\n<pre><code>&gt; ipfs file-cat &lt;ccc111-hash&gt; --json<br>\n{<br>\n &nbsp;&nbsp;&nbsp;\"data\": {<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"type\": \"tree\",<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"date\": \"2014-09-20 12:44:06Z\",<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"message\": \"This is a commit message.\"<br>\n &nbsp;&nbsp;&nbsp;},<br>\n &nbsp;&nbsp;&nbsp;\"links\": [<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"&lt;ccc000-hash&gt;\",\"name\": \"parent\", \"size\": 25309 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"&lt;ttt111-hash&gt;\",\"name\": \"object\", \"size\": 5198 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"&lt;aaa111-hash&gt;\",\"name\": \"author\", \"size\": 109 }<br>\n &nbsp;&nbsp;&nbsp;]<br>\n}<br>\n&gt; ipfs file-cat &lt;ttt111-hash&gt; --json<br>\n{<br>\n &nbsp;&nbsp;&nbsp;\"data\": [\"tree\", \"tree\", \"blob\"],<br>\n &nbsp;&nbsp;&nbsp;\"links\": [<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"&lt;ttt222-hash&gt;\",\"name\": \"ttt222-name\", \"size\": 1234 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"&lt;ttt333-hash&gt;\",\"name\": \"ttt333-name\", \"size\": 3456 },<br>\n &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ \"hash\": \"&lt;bbb222-hash&gt;\",\"name\": \"bbb222-name\", \"size\": 22 }<br>\n &nbsp;&nbsp;&nbsp;]<br>\n}<br>\n&gt; ipfs file-cat &lt;bbb222-hash&gt; --json<br>\n{<br>\n &nbsp;&nbsp;&nbsp;\"data\": \"blob222 data\",<br>\n &nbsp;&nbsp;&nbsp;\"links\": []<br>\n}</code></pre>\n<p><strong>将文件分割成lists和blobs</strong>IPFS提供了以下几个可选的选择:</p>\n<ul>\n  <li>使用Rabin Fingerprints来选取合适的块边界。</li>\n  <li>使用rsync rolling-checksum算法来检测块在版本之间的改变。</li>\n  <li>允许用户指定一个可为特定文件而调整的块分割函数。</li>\n</ul>\n<h2>IPNS:命名以及易变状态</h2>\n<p>目前为止,IPFS桟形成了一个由对等块交换构建的内容可寻址的DAG对象。这提供了发布和获取不可变对象的服务,甚至可以追踪这些对象的版本历史。然而,我们还缺少一个关键部分:<strong>易变命名(mutable naming)</strong>。我们希望有类似域名与IP的多对一映射的关系,采用可变的命名映射到不可变的哈希值上。IPFS提供了如下几种方案:<strong>1. 自验证的命名系统</strong>使用SFS(Self-Certified Filesystems)中的命名方案,我们可以在指定加密命名空间下构建可自验证的名称。</p>\n<ol>\n  <li>NodeId=hash(node.PubKey)&nbsp;</li>\n  <li>为每位用户分配一个可变的命名空间,例如 /ipns/&lt;NodeId&gt;。</li>\n  <li>一个用户可以在此路径下发布一个由自己私钥签名的对象,例如路径 /ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/。</li>\n  <li>当其他用户获取该对象时,使用公钥进行验签,即验证所用的公钥是否与NodeId匹配。这验证了用户发布对象的真实性,同时也获取到了可变状态。</li>\n</ol>\n<p>发布对象中任何links均可以在命名空间中充当子名称:</p>\n<pre><code>/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/<br>\n/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/docs<br>\n/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm/docs/ipfs</code></pre>\n<p><strong>2. 人类友好名称</strong>IPNS使用很长的哈希值作为名称,很难被记住,对人类这种物种来说极不友好。因此我们需要采取一些改进措施,使得路径名称变得易于记忆:<strong>Peer Links</strong>即用户可以直接将其他用户的对象link到自己的对象上(命名空间、主目录等)。例如:</p>\n<pre><code># Alice links 到Bob上<br>\nipfs link /&lt;alice-pk-hash&gt;/friends/bob /&lt;bob-pk-hash&gt;<br>\n# Eve links 到Alice上<br>\nipfs link /&lt;eve-pk-hash/friends/alice /&lt;alice-pk-hash&gt;<br>\n# Eve 也可以访问Bob<br>\n/&lt;eve-pk-hash/friends/alice/friends/bob<br>\n# 访问Verisign 认证域<br>\n/&lt;verisign-pk-hash&gt;/foo.com</code></pre>\n<p><strong>DNS TXT IPNS记录</strong>如果/ipns/是一个有效的域名,则会在DNS TXT记录中查找到相应的记录。<strong>本质上是为哈希值起了一个别名。</strong></p>\n<pre><code># this DNS TXT record<br>\nipfs.benet.ai. TXT \"ipfs=XLF2ipQ4jD3U ...\"<br>\n# behaves as symlink<br>\nln -s /ipns/XLF2ipQ4jD3U /ipns/fs.benet.ai</code></pre>\n<p><strong>可读的标识符</strong>IPFS支持将哈希地址译成可发音的单词:</p>\n<pre><code># proquint语句<br>\n/ipns/dahih-dolij-sozuk-vosah-luvar-fuluh<br>\n# 将解析成<br>\n/ipns/KhAwNprxYVxKqpDZ</code></pre>\n<p><strong>缩短名称服务</strong>这种方案跟我们今天的DNS和Web URL较为类似。直接上例子:</p>\n<pre><code># 用户可以从下面获取一个link<br>\n/ipns/shorten.er/foobar<br>\n# 然后放到自己的命名空间<br>\n/ipns/XLF2ipQ4jD3UdeX5xp1KBgeHRhemUtaA8Vm</code></pre>\n<h2>小结</h2>\n<p>一种新的技术想要替代旧的技术,无非是从两方面着手:</p>\n<ol>\n  <li>提升效率</li>\n  <li>降低成本</li>\n</ol>\n<p>IPFS综合了先前P2P系统的优点,包括DHT、BitTorrent、Git和SFS等。它把P2P的格局放到了全网,更好地实现了从多个资源节点获取内容,不依赖主干网,也不局限于一个Torrent,提升了资源响应速度与可靠性;同时基于IPFS,我们可以实现一种更廉价、带奖励机制的分布式存储方案(如<a href=\"http://chainx.org/paper/index/index/id/13.html\">FileCoin</a>),这为IPFS生态的发展提供了十足的想象空间。IPFS的实现得益于区块链技术的发展。在区块链诞生之前,对于IPFS的实现存在两个问题:</p>\n<ol>\n  <li>节点网络在维护路由表的一致性,特别是涉及到节点、资源的动态增删,节点的信用以及防欺骗和防free loader等方面,往往不得不采用一些中心化的解决方案(例如迅雷下载P2P加速),而这又违背了去中心的理念。</li>\n  <li>对节点实行奖惩机制,涉及到账本、信用管理,代币发行以及交易事务处理等等,在分布式架构下难以保证高可靠、高可用和安全防篡改。过去的解决方案也是引入一个中心化的机构作背书。</li>\n</ol>\n<p>这些问题在今天来看,使用区块链技术,综合效率和成本两方面,是再合适不过的。在接下来的10年,我们一定会看到IPFS在分布式应用方面大行其道。基于区块链技术的杀手级应用,很可能也会因此到来。</p>\n</html>",
      "json_metadata": "{\"tags\":[\"blockchain\",\"ipfs\",\"distribution\"],\"links\":[\"https://ipfs.io/#why\",\"http://filecoin.io/\",\"https://github.com/ipfs/papers/blob/master/ipfs-cap2pfs/ipfs-p2p-file-system.pdf\",\"http://blog.jobbole.com/26209/\",\"http://chainx.org/paper/index/index/id/13.html\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}"
    }
  ]
}
2017/11/24 05:37:39
parent authorcheetah
parent permlinkcheetah-re-lowesyang2jukq9
authorlowesyang
permlinkre-cheetah-cheetah-re-lowesyang2jukq9-20171124t053738082z
title
bodyYeap, that belongs to the same author.
json metadata{"tags":["bitcoin"],"app":"steemit/0.1"}
Transaction InfoBlock #17494377/Trx 0afcef24264e76ea7f9f84f52a57f2e00fff5d2d
View Raw JSON Data
{
  "trx_id": "0afcef24264e76ea7f9f84f52a57f2e00fff5d2d",
  "block": 17494377,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:37:39",
  "op": [
    "comment",
    {
      "parent_author": "cheetah",
      "parent_permlink": "cheetah-re-lowesyang2jukq9",
      "author": "lowesyang",
      "permlink": "re-cheetah-cheetah-re-lowesyang2jukq9-20171124t053738082z",
      "title": "",
      "body": "Yeap, that belongs to the same author.",
      "json_metadata": "{\"tags\":[\"bitcoin\"],\"app\":\"steemit/0.1\"}"
    }
  ]
}
yasinskupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 05:36:33
voteryasinsk
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17494355/Trx c8afd4b4737c398ad11d11a804385a6274d5284d
View Raw JSON Data
{
  "trx_id": "c8afd4b4737c398ad11d11a804385a6274d5284d",
  "block": 17494355,
  "trx_in_block": 32,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:36:33",
  "op": [
    "vote",
    {
      "voter": "yasinsk",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
2017/11/24 05:35:36
parent authorlowesyang
parent permlink2jukq9
authorcheetah
permlinkcheetah-re-lowesyang2jukq9
title
bodyHi! I am a robot. I just upvoted you! I found similar content that readers might be interested in: https://juejin.im/post/59b8c4e05188257e8a3093f2
json metadata
Transaction InfoBlock #17494336/Trx 698fa3c3379637576a3b4001d9b67efe46c6255c
View Raw JSON Data
{
  "trx_id": "698fa3c3379637576a3b4001d9b67efe46c6255c",
  "block": 17494336,
  "trx_in_block": 13,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:35:36",
  "op": [
    "comment",
    {
      "parent_author": "lowesyang",
      "parent_permlink": "2jukq9",
      "author": "cheetah",
      "permlink": "cheetah-re-lowesyang2jukq9",
      "title": "",
      "body": "Hi! I am a robot. I just upvoted you! I found similar content that readers might be interested in:\nhttps://juejin.im/post/59b8c4e05188257e8a3093f2",
      "json_metadata": ""
    }
  ]
}
cheetahupvoted (0.13%) @lowesyang / 2jukq9
2017/11/24 05:35:33
votercheetah
authorlowesyang
permlink2jukq9
weight13 (0.13%)
Transaction InfoBlock #17494335/Trx 6cd4656e024a0c3e31ffec79605dd219d86f5b86
View Raw JSON Data
{
  "trx_id": "6cd4656e024a0c3e31ffec79605dd219d86f5b86",
  "block": 17494335,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:35:33",
  "op": [
    "vote",
    {
      "voter": "cheetah",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 13
    }
  ]
}
lowesyangupvoted (100.00%) @lowesyang / 2jukq9
2017/11/24 05:35:18
voterlowesyang
authorlowesyang
permlink2jukq9
weight10000 (100.00%)
Transaction InfoBlock #17494330/Trx 475470c8f34d591e7d350fa70c96978299ba4612
View Raw JSON Data
{
  "trx_id": "475470c8f34d591e7d350fa70c96978299ba4612",
  "block": 17494330,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:35:18",
  "op": [
    "vote",
    {
      "voter": "lowesyang",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "weight": 10000
    }
  ]
}
lowesyangpublished a new post: 2jukq9
2017/11/24 05:35:18
parent author
parent permlinkbitcoin
authorlowesyang
permlink2jukq9
title区块链给我们带来什么(一)数字货币
body<html> <p>2009年,中本聪将比特币与区块链的概念带给了世人。从创世区块至今已有8年,时间长河证明了比特币在其去(弱)中心化、安全性、匿名性等方面相比于传统货币与中心化的电子货币的巨大优势。比特币的成功带动了数字货币的集体繁荣,截止2017年6月20日,数字货币种类已达885种,其中除了比特币外,也不乏有力的竞争者如莱特币(LTC),比特现金(BCC,由BTC硬分叉),以太币及以太经典(ETH、ETC)等。本文希望以比特币为例,从更本质层面来阐述,区块链技术如何使得数字货币拥有了货币的性质。</p> <h2>货币到底是什么?</h2> <p>首先是两个基本点:</p> <ol> <li>货币的本质是一种记账方式。</li> <li>信任是交易的基础。</li> </ol> <p>当我们使用货币发生交易,只是在一个隐形的账本上进行了一次会计操作。当A从B这里拿货时,A将一个债务契约交给B,表明“A欠B xxx物品”,B可以使用这个债务契约去与其他人交易。在现代社会中,这样的债务关系被记录在了一个由国家背书的中心化账本上,用法定货币来衡量其价值,并承诺和承认:这种法定货币,可以交易流通;可以兑换黄金;可以贮藏,或是存在银行;可以对汇,在世界范围流通......因此,人们生活中的日常交易,只是记录了类似“xxx物品的价值所有权从A转移到了B”这样一个会计条目,法币则是这种价值转换的代言物。实际上对于法币的价值背书——黄金来说,仍然躺在国库中丝毫未动。<strong>中心化信任</strong>我们相信法定货币并使用它,是因为我们信任国家和政府的强制力与威严可以保证这个中心化账本的公正。然而这种中心化的信任往往是低效且不合理的:场景一:当我向银行贷款后,银行的账本会记录一条我的欠款记录,但这个账本确是交由银行管理,并且国家只承认银行的账本。由于我们信任国家机器,而国家通过强制力保证银行履行义务,因此我们选择信任银行,信任这一套金融体系。但这从逻辑上来看其实是非常可笑的——A与B之间的债务关系不由C来证明,而是由A、B中的某一方来证明。场景二:银行间的跨行结算依赖于清算中心,这是一个典型的中心化的架构。这种架构的弊端显而易见:</p> <ol> <li>各银行间的清算、结算、托管和注册服务的工作量都集中在清算中心,给清算中心带来了巨大的工作量,显著增加成本(包括特定业务的手续费、系统运维成本、人力成本等等)。</li> <li>中心化的机构需要巨大的成本和精力来保证更好的容灾能力。例如“9.11”事件后,纽约联邦储备银行立刻停止了靠近纽约的新泽西美元支付清算系统的运行,启动灾备系统,将美元支付清算系统从纽约新泽西切换到里士满和达拉斯。虽然用“多个中心”的方案,也可以解决这一问题,但无疑是昂贵和低效的。</li> </ol> <p>中心化信任是人类经济社会发展出来的必然产物,但它具备一定的历史局限,有自己的弊端和风险。也正是如此。我们需要花费更大的成本去规避风险、扬长补短。目前的货币体系正是基于中心化信任,故不得不承担着连带的风险。</p> <h2>比特币为什么可以当做货币?</h2> <p>区块链技术的出现让我们看到了去中心化信任的希望,它赋予比特币三个重要特点:</p> <ol> <li><strong>分布式记账</strong>:比特币网络中存在一个总的账本,即以区块的链条形式存在。每个节点可以拥有自己的账本,节点间点对点的通信。当产生一笔交易时,节点将其广播至其他几点,若某一节点的矿工通过了工作量证明,有权利产生新的区块(新的一页账单),则会对该交易进行确认、验证后,打包进区块,将新账本广播至全网。其他节点收到新区块,通过验证后加入到自己的区块链(账本)中。</li> <li><strong>账本无法伪造,且不可逆</strong>:比特币使用POW(工作量证明)的共识算法(具体算法细节在下文有详述),这样的机制保证了新区块的产生需要付出一定的代价,大大降低了伪造、欺骗的性价比,从而保证了各节点账本的一致性和真实性。</li> <li><strong>比特币本质上是UXTO(Unspent Transaction Output,未花费交易的输出)</strong>:在比特币的区块中,一笔交易包含输入和输出。一个用户拥有的比特币数量,等价于他与其他人交易时,整个区块链中确认的交易中以他的地址为输出的那些交易所代表的金额。这本质上也是一个账单条目。我花费固定数量的比特币,实质是花费了某些交易的输出。</li> </ol> <p>这些特点,让我们不需要相信某个中心化的机构来发行、监管比特币。只要全网大多数的节点对总账本达成了一致,则其中的交易记录(包含UXTO)将会被大多数人所信任的,从而通过消耗比特币(UXTO)所产生的交易行为,也将通过同样的机制获得全网的信任。如此,比特币其实就拥有了货币的一些基本职能。另外,这些特点也赋予了比特币和黄金相似的三个重要属性:</p> <ol> <li><strong>获取成本</strong>:黄金的开采需要耗费成本,而比特币的开采同样也要耗费计算力,一个是人力和设备成本,一个是硬件和电力成本。</li> <li><strong>稀有性</strong>:地球上的黄金总量有限,比特币的总量也是有限的(总共约为2100万个)。其稀有性决定了它有贮藏的价值。</li> <li><strong>难以伪造</strong>:人们可以依靠化学手段来判断黄金的真伪,而比特币依靠其密码学原理和共识算法来防止伪造。</li> </ol> <p>区块链技术所实现的这一整套分布式与共识机制,使得比特币与黄金一样,能够成为<strong>一般等价物</strong>,在商品交换中流通。从过去8年比特币的发展也证明了这一点。</p> <h2>数字货币的关键机制</h2> <p>尽管都是基于区块链技术,但不同的数字货币拥有的理念与算法,各有千秋。其中最重要的特性,同时也是决定了数字货币间的主要差异的环节,便是<strong>共识机制</strong>。<strong>共识机制</strong>,即区块链节点就区块信息达成全网一致共识的机制,可以保证最新区块被准确添加至区块链、节点存储的区块链信息一致不分叉,甚至可以抵御恶意攻击。目前典型的共识算法共有四种:</p> <ol> <li><strong>POW算法(工作量证明)</strong>:该算法<strong>通过节点消耗计算力来进行制定的哈希运算,找到合理的随机数,当该随机数小于比特币网络所规定的目标值时,则该节点有权产生一个新区块</strong>,在上面留下自己的数字签名,所计算得的哈希值,新区块头的标识(也是一个哈希字符串)和上一个区块头的标识等其他信息,验证并打包一些该节点中存在的交易(可以是来自其他节点的,也可以是自己节点产生的)至新区块中,然后广播至全网。其他节点收到区块并验证通过后,加入自己的区块链中。使用这种共识算法的数字货币,代表的有比特币、莱特币、以太币等。</li> <li><strong>POS算法(权益证明)</strong>:该算法<strong>根据节点持有货币的量和时间(常以币天为单位),进行利息发放和区块产生机制</strong>。例如持有100个币,共持有了30天,那么币天就为3000。以未来币为例:一个账户用自己的私钥在原先的区块上产生一个64字节的“生成签名”,之后通过SHA256散列该签名。将结果的前八个字节作为一个数字,称为"hit"。将"hit"与目前的目标值相比,如果计算出的"hit"值要比目标值低,则有权生成一个新区块。目标值随着时间的流逝而增长,如果在最初的一秒内没有账户的"hit"值低于目标值,则下一秒“目标值”就会翻倍,直到一个活动账户的"hit"有一个较低的数值。另外还有一个“基本目标”值,以60秒的间隔设定为目标值,从而使区块平均产生的时间限制在60秒左右。某个节点产生新区块后,广播至其他节点,通过其他节点的验证后加入到各自的区块链中。</li> <li><strong>DPOS算法(委任权益证明)</strong>:该算法是POS算法的改进。POS算法的一个弊端是,最终区块链的区块产生权掌握在账户余额最多的少数节点中,这对去中心化带来了一定的挑战。DPOS的改进之处是:<strong>每个持币节点可以将其投票权授予一名代表,获票数最多的前100位代表按照既定时间表轮流产生区块。每名代表被分配到一个时间段生产区块。所有的代表将收到等同于一个平均水平的区块所含交易费的1%作为报酬。</strong>如果某代表错过了太多的区块,那么系统将推荐用户去更换一个新的代表;若被发现签发了一个无效的区块,那么所有标准钱包将在每个钱包进行更多交易前要求选出一个新代表。DPOS的典型应用例子是比特股。</li> <li><strong>PBFT(实用拜占庭容错算法)</strong>:这个算法在保证活性和安全性(liveness &amp; safety)的前提下提供了(n-1)/3的容错性(为什么是(n-1)/3,可参考拜<a href="https://baike.baidu.com/item/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98/265656?fr=aladdin">占庭将军问题</a>)。PBFT是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。<strong>整个节点网络分为两种节点:主节点与副本节点。整个流程是这样的:① 客户端向主节点发送请求调用服务操作。② 主节点通过广播将请求发送给其他副本节点。③ 所有副本节点都执行请求并将结果发回客户端。④ 客户端需要等待f+1个不同副本节点发回相同的结果,作为这个操作的最终结果(这里f是指有可能失效的副本节点的最大个数)。</strong>这保证了客户端不会被失效(假的)副本节点给的最终结果所欺骗。</li> </ol> <p>PBFT由于不需要通过付出成本来达成区块的共识,不依赖于币的存在,因此常被用于联盟链和私有链中。而POW、POS、DPOS中,创建区块仍然是要付出代价(POW需要消耗算力,POS、DPOS需要消耗币天),常被用于需要代币作为激励或原料的公有链项目。总的来说,共识算法为数字货币提供了如下三个特性:</p> <ol> <li>创建区块需要付出一定成本。</li> <li>分布式账本的一致性。</li> <li>安全性,不可伪造。</li> </ol> <p>当然,构建数字货币所面临的问题,自然不是单单一个共识算法能够解决的,其背后的技术方案还包括了非对称加密算法、数字签名、弱中心化节点架构等来防止如双重支付、DDos攻击、身份伪造等问题。</p> <h2>结语</h2> <p>数字货币,其所拥有的货币属性完全依赖于计算机算法与网络技术。正是基于这样精巧设计的分布式网络与加密、共识机制,使得数字货币拥有了传统货币所没有的去中心化、安全性、匿名性、透明等特性。如果说传统的货币,国家需要依靠完善制度法律,强化监管力度来威慑、打击货币犯罪的行为,那么数字货币则力图从根本上杜绝类似的货币伪造、刷信用等不法行为的发生。尽管这些天,国家管制纷纷来袭,但数字货币的价值已经被全世界所认可,它的普及也将是大势所趋。最后引用太祖的一句名言:</p> <blockquote>人类的历史,就是一个不断地从必然王国向自由王国发展的历史。——毛泽东</blockquote> <p>去中心化意味着金融系统中每个参与者真正的自由。相信创新的革命会被人类的理性所接受。</p> <h2>参考资料</h2> <p><a href="https://read.douban.com/ebook/24123244/">《区块链:从数字货币到信用社会》</a></p> <p><a href="http://www.8btc.com/dpossha">区块链核心技术:拜占庭共识算法之PBFT</a></p> <p><a href="http://www.8btc.com/dpossha">信息图:股份授权证明机制(DPOS)</a></p> </html>
json metadata{"tags":["bitcoin","blockchain","tech"],"links":["https://baike.baidu.com/item/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98/265656?fr=aladdin","https://read.douban.com/ebook/24123244/","http://www.8btc.com/dpossha"],"app":"steemit/0.1","format":"html"}
Transaction InfoBlock #17494330/Trx 475470c8f34d591e7d350fa70c96978299ba4612
View Raw JSON Data
{
  "trx_id": "475470c8f34d591e7d350fa70c96978299ba4612",
  "block": 17494330,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T05:35:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "bitcoin",
      "author": "lowesyang",
      "permlink": "2jukq9",
      "title": "区块链给我们带来什么(一)数字货币",
      "body": "<html>\n<p>2009年,中本聪将比特币与区块链的概念带给了世人。从创世区块至今已有8年,时间长河证明了比特币在其去(弱)中心化、安全性、匿名性等方面相比于传统货币与中心化的电子货币的巨大优势。比特币的成功带动了数字货币的集体繁荣,截止2017年6月20日,数字货币种类已达885种,其中除了比特币外,也不乏有力的竞争者如莱特币(LTC),比特现金(BCC,由BTC硬分叉),以太币及以太经典(ETH、ETC)等。本文希望以比特币为例,从更本质层面来阐述,区块链技术如何使得数字货币拥有了货币的性质。</p>\n<h2>货币到底是什么?</h2>\n<p>首先是两个基本点:</p>\n<ol>\n  <li>货币的本质是一种记账方式。</li>\n  <li>信任是交易的基础。</li>\n</ol>\n<p>当我们使用货币发生交易,只是在一个隐形的账本上进行了一次会计操作。当A从B这里拿货时,A将一个债务契约交给B,表明“A欠B xxx物品”,B可以使用这个债务契约去与其他人交易。在现代社会中,这样的债务关系被记录在了一个由国家背书的中心化账本上,用法定货币来衡量其价值,并承诺和承认:这种法定货币,可以交易流通;可以兑换黄金;可以贮藏,或是存在银行;可以对汇,在世界范围流通......因此,人们生活中的日常交易,只是记录了类似“xxx物品的价值所有权从A转移到了B”这样一个会计条目,法币则是这种价值转换的代言物。实际上对于法币的价值背书——黄金来说,仍然躺在国库中丝毫未动。<strong>中心化信任</strong>我们相信法定货币并使用它,是因为我们信任国家和政府的强制力与威严可以保证这个中心化账本的公正。然而这种中心化的信任往往是低效且不合理的:场景一:当我向银行贷款后,银行的账本会记录一条我的欠款记录,但这个账本确是交由银行管理,并且国家只承认银行的账本。由于我们信任国家机器,而国家通过强制力保证银行履行义务,因此我们选择信任银行,信任这一套金融体系。但这从逻辑上来看其实是非常可笑的——A与B之间的债务关系不由C来证明,而是由A、B中的某一方来证明。场景二:银行间的跨行结算依赖于清算中心,这是一个典型的中心化的架构。这种架构的弊端显而易见:</p>\n<ol>\n  <li>各银行间的清算、结算、托管和注册服务的工作量都集中在清算中心,给清算中心带来了巨大的工作量,显著增加成本(包括特定业务的手续费、系统运维成本、人力成本等等)。</li>\n  <li>中心化的机构需要巨大的成本和精力来保证更好的容灾能力。例如“9.11”事件后,纽约联邦储备银行立刻停止了靠近纽约的新泽西美元支付清算系统的运行,启动灾备系统,将美元支付清算系统从纽约新泽西切换到里士满和达拉斯。虽然用“多个中心”的方案,也可以解决这一问题,但无疑是昂贵和低效的。</li>\n</ol>\n<p>中心化信任是人类经济社会发展出来的必然产物,但它具备一定的历史局限,有自己的弊端和风险。也正是如此。我们需要花费更大的成本去规避风险、扬长补短。目前的货币体系正是基于中心化信任,故不得不承担着连带的风险。</p>\n<h2>比特币为什么可以当做货币?</h2>\n<p>区块链技术的出现让我们看到了去中心化信任的希望,它赋予比特币三个重要特点:</p>\n<ol>\n  <li><strong>分布式记账</strong>:比特币网络中存在一个总的账本,即以区块的链条形式存在。每个节点可以拥有自己的账本,节点间点对点的通信。当产生一笔交易时,节点将其广播至其他几点,若某一节点的矿工通过了工作量证明,有权利产生新的区块(新的一页账单),则会对该交易进行确认、验证后,打包进区块,将新账本广播至全网。其他节点收到新区块,通过验证后加入到自己的区块链(账本)中。</li>\n  <li><strong>账本无法伪造,且不可逆</strong>:比特币使用POW(工作量证明)的共识算法(具体算法细节在下文有详述),这样的机制保证了新区块的产生需要付出一定的代价,大大降低了伪造、欺骗的性价比,从而保证了各节点账本的一致性和真实性。</li>\n  <li><strong>比特币本质上是UXTO(Unspent Transaction Output,未花费交易的输出)</strong>:在比特币的区块中,一笔交易包含输入和输出。一个用户拥有的比特币数量,等价于他与其他人交易时,整个区块链中确认的交易中以他的地址为输出的那些交易所代表的金额。这本质上也是一个账单条目。我花费固定数量的比特币,实质是花费了某些交易的输出。</li>\n</ol>\n<p>这些特点,让我们不需要相信某个中心化的机构来发行、监管比特币。只要全网大多数的节点对总账本达成了一致,则其中的交易记录(包含UXTO)将会被大多数人所信任的,从而通过消耗比特币(UXTO)所产生的交易行为,也将通过同样的机制获得全网的信任。如此,比特币其实就拥有了货币的一些基本职能。另外,这些特点也赋予了比特币和黄金相似的三个重要属性:</p>\n<ol>\n  <li><strong>获取成本</strong>:黄金的开采需要耗费成本,而比特币的开采同样也要耗费计算力,一个是人力和设备成本,一个是硬件和电力成本。</li>\n  <li><strong>稀有性</strong>:地球上的黄金总量有限,比特币的总量也是有限的(总共约为2100万个)。其稀有性决定了它有贮藏的价值。</li>\n  <li><strong>难以伪造</strong>:人们可以依靠化学手段来判断黄金的真伪,而比特币依靠其密码学原理和共识算法来防止伪造。</li>\n</ol>\n<p>区块链技术所实现的这一整套分布式与共识机制,使得比特币与黄金一样,能够成为<strong>一般等价物</strong>,在商品交换中流通。从过去8年比特币的发展也证明了这一点。</p>\n<h2>数字货币的关键机制</h2>\n<p>尽管都是基于区块链技术,但不同的数字货币拥有的理念与算法,各有千秋。其中最重要的特性,同时也是决定了数字货币间的主要差异的环节,便是<strong>共识机制</strong>。<strong>共识机制</strong>,即区块链节点就区块信息达成全网一致共识的机制,可以保证最新区块被准确添加至区块链、节点存储的区块链信息一致不分叉,甚至可以抵御恶意攻击。目前典型的共识算法共有四种:</p>\n<ol>\n  <li><strong>POW算法(工作量证明)</strong>:该算法<strong>通过节点消耗计算力来进行制定的哈希运算,找到合理的随机数,当该随机数小于比特币网络所规定的目标值时,则该节点有权产生一个新区块</strong>,在上面留下自己的数字签名,所计算得的哈希值,新区块头的标识(也是一个哈希字符串)和上一个区块头的标识等其他信息,验证并打包一些该节点中存在的交易(可以是来自其他节点的,也可以是自己节点产生的)至新区块中,然后广播至全网。其他节点收到区块并验证通过后,加入自己的区块链中。使用这种共识算法的数字货币,代表的有比特币、莱特币、以太币等。</li>\n  <li><strong>POS算法(权益证明)</strong>:该算法<strong>根据节点持有货币的量和时间(常以币天为单位),进行利息发放和区块产生机制</strong>。例如持有100个币,共持有了30天,那么币天就为3000。以未来币为例:一个账户用自己的私钥在原先的区块上产生一个64字节的“生成签名”,之后通过SHA256散列该签名。将结果的前八个字节作为一个数字,称为\"hit\"。将\"hit\"与目前的目标值相比,如果计算出的\"hit\"值要比目标值低,则有权生成一个新区块。目标值随着时间的流逝而增长,如果在最初的一秒内没有账户的\"hit\"值低于目标值,则下一秒“目标值”就会翻倍,直到一个活动账户的\"hit\"有一个较低的数值。另外还有一个“基本目标”值,以60秒的间隔设定为目标值,从而使区块平均产生的时间限制在60秒左右。某个节点产生新区块后,广播至其他节点,通过其他节点的验证后加入到各自的区块链中。</li>\n  <li><strong>DPOS算法(委任权益证明)</strong>:该算法是POS算法的改进。POS算法的一个弊端是,最终区块链的区块产生权掌握在账户余额最多的少数节点中,这对去中心化带来了一定的挑战。DPOS的改进之处是:<strong>每个持币节点可以将其投票权授予一名代表,获票数最多的前100位代表按照既定时间表轮流产生区块。每名代表被分配到一个时间段生产区块。所有的代表将收到等同于一个平均水平的区块所含交易费的1%作为报酬。</strong>如果某代表错过了太多的区块,那么系统将推荐用户去更换一个新的代表;若被发现签发了一个无效的区块,那么所有标准钱包将在每个钱包进行更多交易前要求选出一个新代表。DPOS的典型应用例子是比特股。</li>\n  <li><strong>PBFT(实用拜占庭容错算法)</strong>:这个算法在保证活性和安全性(liveness &amp; safety)的前提下提供了(n-1)/3的容错性(为什么是(n-1)/3,可参考拜<a href=\"https://baike.baidu.com/item/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98/265656?fr=aladdin\">占庭将军问题</a>)。PBFT是一种状态机副本复制算法,即服务作为状态机进行建模,状态机在分布式系统的不同节点进行副本复制。<strong>整个节点网络分为两种节点:主节点与副本节点。整个流程是这样的:① 客户端向主节点发送请求调用服务操作。② 主节点通过广播将请求发送给其他副本节点。③ 所有副本节点都执行请求并将结果发回客户端。④ 客户端需要等待f+1个不同副本节点发回相同的结果,作为这个操作的最终结果(这里f是指有可能失效的副本节点的最大个数)。</strong>这保证了客户端不会被失效(假的)副本节点给的最终结果所欺骗。</li>\n</ol>\n<p>PBFT由于不需要通过付出成本来达成区块的共识,不依赖于币的存在,因此常被用于联盟链和私有链中。而POW、POS、DPOS中,创建区块仍然是要付出代价(POW需要消耗算力,POS、DPOS需要消耗币天),常被用于需要代币作为激励或原料的公有链项目。总的来说,共识算法为数字货币提供了如下三个特性:</p>\n<ol>\n  <li>创建区块需要付出一定成本。</li>\n  <li>分布式账本的一致性。</li>\n  <li>安全性,不可伪造。</li>\n</ol>\n<p>当然,构建数字货币所面临的问题,自然不是单单一个共识算法能够解决的,其背后的技术方案还包括了非对称加密算法、数字签名、弱中心化节点架构等来防止如双重支付、DDos攻击、身份伪造等问题。</p>\n<h2>结语</h2>\n<p>数字货币,其所拥有的货币属性完全依赖于计算机算法与网络技术。正是基于这样精巧设计的分布式网络与加密、共识机制,使得数字货币拥有了传统货币所没有的去中心化、安全性、匿名性、透明等特性。如果说传统的货币,国家需要依靠完善制度法律,强化监管力度来威慑、打击货币犯罪的行为,那么数字货币则力图从根本上杜绝类似的货币伪造、刷信用等不法行为的发生。尽管这些天,国家管制纷纷来袭,但数字货币的价值已经被全世界所认可,它的普及也将是大势所趋。最后引用太祖的一句名言:</p>\n<blockquote>人类的历史,就是一个不断地从必然王国向自由王国发展的历史。——毛泽东</blockquote>\n<p>去中心化意味着金融系统中每个参与者真正的自由。相信创新的革命会被人类的理性所接受。</p>\n<h2>参考资料</h2>\n<p><a href=\"https://read.douban.com/ebook/24123244/\">《区块链:从数字货币到信用社会》</a></p>\n<p><a href=\"http://www.8btc.com/dpossha\">区块链核心技术:拜占庭共识算法之PBFT</a></p>\n<p><a href=\"http://www.8btc.com/dpossha\">信息图:股份授权证明机制(DPOS)</a></p>\n</html>",
      "json_metadata": "{\"tags\":[\"bitcoin\",\"blockchain\",\"tech\"],\"links\":[\"https://baike.baidu.com/item/%E6%8B%9C%E5%8D%A0%E5%BA%AD%E5%B0%86%E5%86%9B%E9%97%AE%E9%A2%98/265656?fr=aladdin\",\"https://read.douban.com/ebook/24123244/\",\"http://www.8btc.com/dpossha\"],\"app\":\"steemit/0.1\",\"format\":\"html\"}"
    }
  ]
}
steemcreated a new account: @lowesyang
2017/11/24 02:53:24
fee0.500 STEEM
delegation57000.000000 VESTS
creatorsteem
new account namelowesyang
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM6ErqstANfeKTh6D9adn69yszEjKyrszAicQJf6izjN9KxtJvuj",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM8CLeW6rRRXcHxRMiW4wJ5hvwtKuYmyAbnT28LP7RDjVdui4gEg",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM6SHNxtvLADqqQU7cafQwtoTeHUzbQbncHs3aHFrDZkvrMFdo6k",1]]}
memo keySTM6gAuEJYpKY2jobBNBgbhHrUABn3M1Sx3LHYh1EiSnw91Jo4FPr
json metadata
extensions[]
Transaction InfoBlock #17491093/Trx f2d334e7eb48f2263f0e4123a0a400b87f9654e2
View Raw JSON Data
{
  "trx_id": "f2d334e7eb48f2263f0e4123a0a400b87f9654e2",
  "block": 17491093,
  "trx_in_block": 33,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2017-11-24T02:53:24",
  "op": [
    "account_create_with_delegation",
    {
      "fee": "0.500 STEEM",
      "delegation": "57000.000000 VESTS",
      "creator": "steem",
      "new_account_name": "lowesyang",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM6ErqstANfeKTh6D9adn69yszEjKyrszAicQJf6izjN9KxtJvuj",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM8CLeW6rRRXcHxRMiW4wJ5hvwtKuYmyAbnT28LP7RDjVdui4gEg",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM6SHNxtvLADqqQU7cafQwtoTeHUzbQbncHs3aHFrDZkvrMFdo6k",
            1
          ]
        ]
      },
      "memo_key": "STM6gAuEJYpKY2jobBNBgbhHrUABn3M1Sx3LHYh1EiSnw91Jo4FPr",
      "json_metadata": "",
      "extensions": []
    }
  ]
}

Account Metadata

POSTING JSON METADATA
None
JSON METADATA
None
{
  "posting_json_metadata": {},
  "json_metadata": {}
}

Auth Keys

Owner
Single Signature
Public Keys
STM6ErqstANfeKTh6D9adn69yszEjKyrszAicQJf6izjN9KxtJvuj1/1
Active
Single Signature
Public Keys
STM8CLeW6rRRXcHxRMiW4wJ5hvwtKuYmyAbnT28LP7RDjVdui4gEg1/1
Posting
Single Signature
Public Keys
STM6SHNxtvLADqqQU7cafQwtoTeHUzbQbncHs3aHFrDZkvrMFdo6k1/1
Memo
STM6gAuEJYpKY2jobBNBgbhHrUABn3M1Sx3LHYh1EiSnw91Jo4FPr
{
  "owner": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6ErqstANfeKTh6D9adn69yszEjKyrszAicQJf6izjN9KxtJvuj",
        1
      ]
    ]
  },
  "active": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM8CLeW6rRRXcHxRMiW4wJ5hvwtKuYmyAbnT28LP7RDjVdui4gEg",
        1
      ]
    ]
  },
  "posting": {
    "weight_threshold": 1,
    "account_auths": [],
    "key_auths": [
      [
        "STM6SHNxtvLADqqQU7cafQwtoTeHUzbQbncHs3aHFrDZkvrMFdo6k",
        1
      ]
    ]
  },
  "memo": "STM6gAuEJYpKY2jobBNBgbhHrUABn3M1Sx3LHYh1EiSnw91Jo4FPr"
}

Witness Votes

0 / 30
No active witness votes.
[]