Ecoer Logo
VOTING POWER100.00%
DOWNVOTE POWER100.00%
RESOURCE CREDITS100.00%
REPUTATION PROGRESS89.14%
Net Worth
0.073USD
STEEM
1.071STEEM
SBD
0.010SBD
Effective Power
50.886SP
├── Own SP
0.195SP
└── Incoming Deleg
+50.691SP

Detailed Balance

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

Account Info

nameety001.test
id879745
rank41,132
reputation2095389655
created2018-03-24T13:13:06
recovery_accountety001
proxyety001
post_count55
comment_count0
lifetime_vote_count0
witnesses_voted_for0
last_post2025-11-07T06:52:03
last_root_post2025-11-07T06:52:03
last_vote_time2018-10-14T15:21:36
proxied_vsf_votes0, 0, 0, 0
can_vote1
voting_power0
delayed_votes0
balance1.070 STEEM
savings_balance0.001 STEEM
sbd_balance0.010 SBD
savings_sbd_balance0.000 SBD
vesting_shares317.773965 VESTS
delegated_vesting_shares0.000000 VESTS
received_vesting_shares82547.602366 VESTS
reward_vesting_balance0.000000 VESTS
vesting_balance0.000 STEEM
vesting_withdraw_rate0.000000 VESTS
next_vesting_withdrawal1969-12-31T23:59:59
withdrawn6794554
to_withdraw6794554
withdraw_routes0
savings_withdraw_requests0
last_account_recovery2025-03-26T11:43:24
reset_accountnull
last_owner_update2025-03-26T11:43:24
last_account_update2025-03-26T11:59:33
minedNo
sbd_seconds0
sbd_last_interest_payment2026-05-19T15:43:57
savings_sbd_last_interest_payment1970-01-01T00:00:00
{
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM7g7LEae1deMa4hH28UKuxHhqCUrnXYZy1k5nGZfzqpCX1xWDaE",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "balance": "1.070 STEEM",
  "can_vote": true,
  "comment_count": 0,
  "created": "2018-03-24T13:13:06",
  "curation_rewards": 0,
  "delegated_vesting_shares": "0.000000 VESTS",
  "downvote_manabar": {
    "current_mana": "20716344082",
    "last_update_time": 1762498314
  },
  "guest_bloggers": [],
  "id": 879745,
  "json_metadata": "{}",
  "last_account_recovery": "2025-03-26T11:43:24",
  "last_account_update": "2025-03-26T11:59:33",
  "last_owner_update": "2025-03-26T11:43:24",
  "last_post": "2025-11-07T06:52:03",
  "last_root_post": "2025-11-07T06:52:03",
  "last_vote_time": "2018-10-14T15:21:36",
  "lifetime_vote_count": 0,
  "market_history": [],
  "memo_key": "STM7BoijbnbVt5EsF4zVGvHcwwR18se9fV5mtBadgawAwjEX6vDcT",
  "mined": false,
  "name": "ety001.test",
  "next_vesting_withdrawal": "1969-12-31T23:59:59",
  "other_history": [],
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "pending_claimed_accounts": 0,
  "post_bandwidth": 0,
  "post_count": 55,
  "post_history": [],
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8XNpCMGTAwWCKZXx4ShHG6SUdNMdcLpgXVz9oA8UYkEiPx212X",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting_json_metadata": "",
  "posting_rewards": 118,
  "proxied_vsf_votes": [
    0,
    0,
    0,
    0
  ],
  "proxy": "ety001",
  "received_vesting_shares": "82547.602366 VESTS",
  "recovery_account": "ety001",
  "reputation": 2095389655,
  "reset_account": "null",
  "reward_sbd_balance": "0.000 SBD",
  "reward_steem_balance": "0.000 STEEM",
  "reward_vesting_balance": "0.000000 VESTS",
  "reward_vesting_steem": "0.000 STEEM",
  "savings_balance": "0.001 STEEM",
  "savings_sbd_balance": "0.000 SBD",
  "savings_sbd_last_interest_payment": "1970-01-01T00:00:00",
  "savings_sbd_seconds": "0",
  "savings_sbd_seconds_last_update": "1970-01-01T00:00:00",
  "savings_withdraw_requests": 0,
  "sbd_balance": "0.010 SBD",
  "sbd_last_interest_payment": "2026-05-19T15:43:57",
  "sbd_seconds": "0",
  "sbd_seconds_last_update": "2026-05-19T17:04:42",
  "tags_usage": [],
  "to_withdraw": 6794554,
  "transfer_history": [],
  "vesting_balance": "0.000 STEEM",
  "vesting_shares": "317.773965 VESTS",
  "vesting_withdraw_rate": "0.000000 VESTS",
  "vote_history": [],
  "voting_manabar": {
    "current_mana": "82865376331",
    "last_update_time": 1762498314
  },
  "voting_power": 0,
  "withdraw_routes": 0,
  "withdrawn": 6794554,
  "witness_votes": [],
  "witnesses_voted_for": 0,
  "rank": 41132
}

Withdraw Routes

IncomingOutgoing
Empty
Empty
{
  "incoming": [],
  "outgoing": []
}
From Date
To Date
ety001sent 0.010 SBD to @ety001.test
2026/05/19 17:04:42
fromety001
toety001.test
amount0.010 SBD
memo
Transaction InfoBlock #106192243/Trx f173a609dabe7d5043bbd738bfd9b18f77a9a5f0
View Raw JSON Data
{
  "trx_id": "f173a609dabe7d5043bbd738bfd9b18f77a9a5f0",
  "block": 106192243,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-19T17:04:42",
  "op": [
    "transfer",
    {
      "from": "ety001",
      "to": "ety001.test",
      "amount": "0.010 SBD",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 SBD to @ety001
2026/05/19 15:43:57
fromety001.test
toety001
amount0.001 SBD
memo
Transaction InfoBlock #106190636/Trx 81f88cb15bc9902f25d09844fc2235cb1a8d5dac
View Raw JSON Data
{
  "trx_id": "81f88cb15bc9902f25d09844fc2235cb1a8d5dac",
  "block": 106190636,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-19T15:43:57",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 SBD",
      "memo": ""
    }
  ]
}
ety001.testblockchain operation: transfer to savings
2026/05/19 15:42:33
fromety001.test
toety001.test
amount0.001 STEEM
memo
Transaction InfoBlock #106190608/Trx 089010537ca4bfce026be162d6b69c85306dc4f0
View Raw JSON Data
{
  "trx_id": "089010537ca4bfce026be162d6b69c85306dc4f0",
  "block": 106190608,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-19T15:42:33",
  "op": [
    "transfer_to_savings",
    {
      "from": "ety001.test",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/05/19 15:33:51
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #106190436/Trx 357486915c1f132ac771f46f65bb1ca8dde348c2
View Raw JSON Data
{
  "trx_id": "357486915c1f132ac771f46f65bb1ca8dde348c2",
  "block": 106190436,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-19T15:33:51",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/05/19 11:37:12
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #106185720/Trx 5a0f2af95918c8118e17d5e8695026416bd2620a
View Raw JSON Data
{
  "trx_id": "5a0f2af95918c8118e17d5e8695026416bd2620a",
  "block": 106185720,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-05-19T11:37:12",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001sent 0.001 STEEM to @ety001.test
2026/03/02 14:15:12
fromety001
toety001.test
amount0.001 STEEM
memo
Transaction InfoBlock #103951220/Trx f46826c71515ba02994a9fe990c978bb4573e144
View Raw JSON Data
{
  "trx_id": "f46826c71515ba02994a9fe990c978bb4573e144",
  "block": 103951220,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-03-02T14:15:12",
  "op": [
    "transfer",
    {
      "from": "ety001",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001sent 1.000 STEEM to @ety001.test
2026/02/26 16:21:06
fromety001
toety001.test
amount1.000 STEEM
memo
Transaction InfoBlock #103838950/Trx 35167bad4ce40c5c91108f804e33e0d2e05f2fce
View Raw JSON Data
{
  "trx_id": "35167bad4ce40c5c91108f804e33e0d2e05f2fce",
  "block": 103838950,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-26T16:21:06",
  "op": [
    "transfer",
    {
      "from": "ety001",
      "to": "ety001.test",
      "amount": "1.000 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/26 03:26:00
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103823508/Trx 8da23a2a8c6c23a40075705c4f356afb75af6500
View Raw JSON Data
{
  "trx_id": "8da23a2a8c6c23a40075705c4f356afb75af6500",
  "block": 103823508,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-26T03:26:00",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/26 03:25:45
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103823503/Trx ac583d9cdf5e3db2ec96b4826bf5192f61f9c5b4
View Raw JSON Data
{
  "trx_id": "ac583d9cdf5e3db2ec96b4826bf5192f61f9c5b4",
  "block": 103823503,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-26T03:25:45",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/25 09:44:03
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103802347/Trx 34bd2c6b796124534a3ff9f70d16018c796df495
View Raw JSON Data
{
  "trx_id": "34bd2c6b796124534a3ff9f70d16018c796df495",
  "block": 103802347,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-25T09:44:03",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/25 09:42:51
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103802323/Trx 2fe3664b829415bf747b671fe4fb8e0ca8bad536
View Raw JSON Data
{
  "trx_id": "2fe3664b829415bf747b671fe4fb8e0ca8bad536",
  "block": 103802323,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-25T09:42:51",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/25 06:40:03
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103798680/Trx 0625d83d662edab4166ba5e356bc15eaeefd62c5
View Raw JSON Data
{
  "trx_id": "0625d83d662edab4166ba5e356bc15eaeefd62c5",
  "block": 103798680,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-25T06:40:03",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/24 20:01:12
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103785948/Trx 3190b574c66353bcd963079147409da75dfde297
View Raw JSON Data
{
  "trx_id": "3190b574c66353bcd963079147409da75dfde297",
  "block": 103785948,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-24T20:01:12",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/24 18:32:42
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103784183/Trx 333621cb78bfc7080de76aaf9fc756ea091bc68d
View Raw JSON Data
{
  "trx_id": "333621cb78bfc7080de76aaf9fc756ea091bc68d",
  "block": 103784183,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-24T18:32:42",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001
2026/02/24 18:31:54
fromety001.test
toety001
amount0.001 STEEM
memo
Transaction InfoBlock #103784167/Trx 3df480d10d1062a4a55c175422d1275140d67fd0
View Raw JSON Data
{
  "trx_id": "3df480d10d1062a4a55c175422d1275140d67fd0",
  "block": 103784167,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-24T18:31:54",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001sent 0.001 STEEM to @ety001.test
2026/02/24 06:32:09
fromety001
toety001.test
amount0.001 STEEM
memo
Transaction InfoBlock #103769825/Trx 632bdf7906e23b7dd54abcf5bf7ac72d55fdc4ef
View Raw JSON Data
{
  "trx_id": "632bdf7906e23b7dd54abcf5bf7ac72d55fdc4ef",
  "block": 103769825,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2026-02-24T06:32:09",
  "op": [
    "transfer",
    {
      "from": "ety001",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001234sent 0.001 SBD to @ety001.test- "Hello from Steem Go SDK!"
2025/11/25 02:52:09
fromety001234
toety001.test
amount0.001 SBD
memoHello from Steem Go SDK!
Transaction InfoBlock #101150838/Trx 8ff41a284baaa94141c8175c29eb612d686c375f
View Raw JSON Data
{
  "trx_id": "8ff41a284baaa94141c8175c29eb612d686c375f",
  "block": 101150838,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-11-25T02:52:09",
  "op": [
    "transfer",
    {
      "from": "ety001234",
      "to": "ety001.test",
      "amount": "0.001 SBD",
      "memo": "Hello from Steem Go SDK!"
    }
  ]
}
ety001234sent 0.001 STEEM to @ety001.test- "Hello from Steem Go SDK!"
2025/11/25 02:43:54
fromety001234
toety001.test
amount0.001 STEEM
memoHello from Steem Go SDK!
Transaction InfoBlock #101150673/Trx 67c7bd1f4686fdea4684bdf39ef57d52499fb00c
View Raw JSON Data
{
  "trx_id": "67c7bd1f4686fdea4684bdf39ef57d52499fb00c",
  "block": 101150673,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-11-25T02:43:54",
  "op": [
    "transfer",
    {
      "from": "ety001234",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": "Hello from Steem Go SDK!"
    }
  ]
}
ety001.testpublished a new post: null
2025/11/07 06:52:03
parent author
parent permlinkcn-dev
authorety001.test
permlinknull
titleNull账号技术文档
body# Null账号技术文档 ## 概述 `null`账号是Steem区块链中的一个特殊系统账号,用于表示一个无法被任何人访问或控制的账号。发送到null账号的资金将被永久锁定,无法被提取。 ## 账号定义 ### 账号名称 - **账号名**: `null` - **定义位置**: `libraries/protocol/include/steem/protocol/config.hpp` ```cpp /// Represents the canonical account with NO authority (nobody can access funds in null account) #define STEEM_NULL_ACCOUNT "null" ``` ### 系统账号分类 Steem区块链中定义了多个保留账号: - `miners` - 代表当前见证人 - `null` - 无权限账号(无人能访问其中的资金) - `temp` - 通配符权限账号(任何人都能访问其中的资金) - `steem.dao` - 无权限账号,用于提案系统的资源支付 ## 初始化 null账号在创世块(genesis)初始化时创建: ```cpp // 位置: libraries/chain/database.cpp::init_genesis() create< account_object >( [&]( account_object& a ) { a.name = STEEM_NULL_ACCOUNT; } ); create< account_authority_object >( [&]( account_authority_object& auth ) { auth.account = STEEM_NULL_ACCOUNT; auth.owner.weight_threshold = 1; auth.active.weight_threshold = 1; }); ``` ## 权限结构(Authority) ### Authority配置 null账号的权限配置如下: - **Owner权限**: - `weight_threshold = 1` - `key_auths = {}` (空) - `account_auths = {}` (空) - **Active权限**: - `weight_threshold = 1` - `key_auths = {}` (空) - `account_auths = {}` (空) ### 无法满足的权限(Impossible Authority) 由于null账号的authority没有任何密钥或账号授权,但`weight_threshold`设置为1,这导致权限无法满足: ```cpp bool authority::is_impossible()const { uint64_t auth_weights = 0; for( const auto& item : account_auths ) auth_weights += item.second; for( const auto& item : key_auths ) auth_weights += item.second; return auth_weights < weight_threshold; } ``` - 总权重 = 0(没有任何授权) - 阈值 = 1 - 结果:`is_impossible() = true` 这意味着: - **没有任何私钥可以控制null账号** - **无法使用null账号签名任何交易** - **发送到null账号的资金将永久锁定** ## 私钥 ### 结论:没有可用私钥 null账号**没有可用的私钥**,原因如下: 1. **Authority结构**: null账号的authority中没有配置任何公钥(`key_auths`为空) 2. **无法满足**: 即使存在私钥,由于authority无法满足,也无法用于签名交易 3. **设计目的**: null账号的设计目的就是创建一个无法被任何人控制的账号 ### 代码验证 在代码中,null账号的authority被明确标记为"impossible to satisfy": ```cpp // 位置: libraries/protocol/include/steem/protocol/steem_operations.hpp a.push_back( authority( 1, STEEM_NULL_ACCOUNT, 1 ) ); // The null account auth is impossible to satisfy ``` ## 用途 ### 1. 资金销毁 null账号的主要用途是作为资金销毁地址。当需要永久销毁代币时,可以将其发送到null账号: - 发送到null账号的STEEM、SBD、VESTS等资产将永久锁定 - 这些资产无法被任何人提取或使用 ### 2. 费用处理 在某些操作中,费用可能被发送到null账号: ```cpp // 位置: libraries/chain/steem_evaluator.cpp _db.adjust_balance( _db.get< account_object, by_name >( STEEM_NULL_ACCOUNT ), o.fee ); ``` ### 3. 余额清理机制 系统实现了自动清理null账号余额的机制(在硬分叉0.14之后): ```cpp // 位置: libraries/chain/database.cpp::clear_null_account_balance() void database::clear_null_account_balance() { if( !has_hardfork( STEEM_HARDFORK_0_14__327 ) ) return; // 检查并清理null账号的所有余额类型: // - balance (STEEM) // - savings_balance (STEEM) // - sbd_balance (SBD) // - savings_sbd_balance (SBD) // - vesting_shares (VESTS) // - reward_steem_balance // - reward_sbd_balance // - reward_vesting_balance } ``` 清理操作会: 1. 统计null账号的所有余额 2. 生成`clear_null_account_balance_operation`虚拟操作 3. 将所有余额清零 4. 从全局供应中扣除相应数量 ### 4. 默认重置账号 在账号恢复机制中,null账号被用作默认的`reset_account`: ```cpp // 位置: libraries/chain/include/steem/chain/account_object.hpp account_name_type reset_account = STEEM_NULL_ACCOUNT; ``` ## 相关操作 ### clear_null_account_balance_operation 这是一个虚拟操作(virtual operation),用于记录null账号余额的清理: ```cpp // 位置: libraries/protocol/include/steem/protocol/steem_virtual_operations.hpp struct clear_null_account_balance_operation : public virtual_operation { vector< asset > total_cleared; }; ``` ## 测试用例 代码库中包含针对null账号的测试: - **位置**: `tests/tests/operation_time_tests.cpp` - **测试函数**: `clear_null_account` - **测试内容**: 验证向null账号转账后,余额清理机制是否正常工作 ## 安全考虑 1. **不可逆性**: 发送到null账号的资金无法恢复,操作前需谨慎 2. **无权限访问**: 即使知道账号名,也无法通过任何方式访问其中的资金 3. **系统保护**: null账号的authority结构确保其永远不会被控制 ## 总结 | 属性 | 说明 | |------|------| | **账号类型** | 系统保留账号 | | **账号名** | `null` | | **是否有私钥** | 否,没有可用私钥 | | **Authority状态** | Impossible(无法满足) | | **资金可访问性** | 否,资金永久锁定 | | **主要用途** | 资金销毁、费用处理 | | **余额清理** | 支持(硬分叉0.14后) | ## 参考代码位置 - 定义: `libraries/protocol/include/steem/protocol/config.hpp:332` - 初始化: `libraries/chain/database.cpp:3019-3028` - Authority检查: `libraries/protocol/authority.cpp:25-31` - 余额清理: `libraries/chain/database.cpp:1458-1590` - 测试用例: `tests/tests/operation_time_tests.cpp:2852`
json metadata{"tags":["cn-dev"],"app":"steemit/0.2","format":"markdown"}
Transaction InfoBlock #100638501/Trx 07220c26b6aa7b06689e5b5359d9992745714cfd
View Raw JSON Data
{
  "trx_id": "07220c26b6aa7b06689e5b5359d9992745714cfd",
  "block": 100638501,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-11-07T06:52:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "cn-dev",
      "author": "ety001.test",
      "permlink": "null",
      "title": "Null账号技术文档",
      "body": "# Null账号技术文档\n\n## 概述\n\n`null`账号是Steem区块链中的一个特殊系统账号,用于表示一个无法被任何人访问或控制的账号。发送到null账号的资金将被永久锁定,无法被提取。\n\n## 账号定义\n\n### 账号名称\n- **账号名**: `null`\n- **定义位置**: `libraries/protocol/include/steem/protocol/config.hpp`\n\n```cpp\n/// Represents the canonical account with NO authority (nobody can access funds in null account)\n#define STEEM_NULL_ACCOUNT                    \"null\"\n```\n\n### 系统账号分类\n\nSteem区块链中定义了多个保留账号:\n\n- `miners` - 代表当前见证人\n- `null` - 无权限账号(无人能访问其中的资金)\n- `temp` - 通配符权限账号(任何人都能访问其中的资金)\n- `steem.dao` - 无权限账号,用于提案系统的资源支付\n\n## 初始化\n\nnull账号在创世块(genesis)初始化时创建:\n\n```cpp\n// 位置: libraries/chain/database.cpp::init_genesis()\n\ncreate< account_object >( [&]( account_object& a )\n{\n   a.name = STEEM_NULL_ACCOUNT;\n} );\ncreate< account_authority_object >( [&]( account_authority_object& auth )\n{\n   auth.account = STEEM_NULL_ACCOUNT;\n   auth.owner.weight_threshold = 1;\n   auth.active.weight_threshold = 1;\n});\n```\n\n## 权限结构(Authority)\n\n### Authority配置\n\nnull账号的权限配置如下:\n\n- **Owner权限**:\n  - `weight_threshold = 1`\n  - `key_auths = {}` (空)\n  - `account_auths = {}` (空)\n\n- **Active权限**:\n  - `weight_threshold = 1`\n  - `key_auths = {}` (空)\n  - `account_auths = {}` (空)\n\n### 无法满足的权限(Impossible Authority)\n\n由于null账号的authority没有任何密钥或账号授权,但`weight_threshold`设置为1,这导致权限无法满足:\n\n```cpp\nbool authority::is_impossible()const\n{\n   uint64_t auth_weights = 0;\n   for( const auto& item : account_auths ) auth_weights += item.second;\n   for( const auto& item : key_auths ) auth_weights += item.second;\n   return auth_weights < weight_threshold;\n}\n```\n\n- 总权重 = 0(没有任何授权)\n- 阈值 = 1\n- 结果:`is_impossible() = true`\n\n这意味着:\n- **没有任何私钥可以控制null账号**\n- **无法使用null账号签名任何交易**\n- **发送到null账号的资金将永久锁定**\n\n## 私钥\n\n### 结论:没有可用私钥\n\nnull账号**没有可用的私钥**,原因如下:\n\n1. **Authority结构**: null账号的authority中没有配置任何公钥(`key_auths`为空)\n2. **无法满足**: 即使存在私钥,由于authority无法满足,也无法用于签名交易\n3. **设计目的**: null账号的设计目的就是创建一个无法被任何人控制的账号\n\n### 代码验证\n\n在代码中,null账号的authority被明确标记为\"impossible to satisfy\":\n\n```cpp\n// 位置: libraries/protocol/include/steem/protocol/steem_operations.hpp\na.push_back( authority( 1, STEEM_NULL_ACCOUNT, 1 ) ); \n// The null account auth is impossible to satisfy\n```\n\n## 用途\n\n### 1. 资金销毁\n\nnull账号的主要用途是作为资金销毁地址。当需要永久销毁代币时,可以将其发送到null账号:\n\n- 发送到null账号的STEEM、SBD、VESTS等资产将永久锁定\n- 这些资产无法被任何人提取或使用\n\n### 2. 费用处理\n\n在某些操作中,费用可能被发送到null账号:\n\n```cpp\n// 位置: libraries/chain/steem_evaluator.cpp\n_db.adjust_balance( _db.get< account_object, by_name >( STEEM_NULL_ACCOUNT ), o.fee );\n```\n\n### 3. 余额清理机制\n\n系统实现了自动清理null账号余额的机制(在硬分叉0.14之后):\n\n```cpp\n// 位置: libraries/chain/database.cpp::clear_null_account_balance()\nvoid database::clear_null_account_balance()\n{\n   if( !has_hardfork( STEEM_HARDFORK_0_14__327 ) ) return;\n   \n   // 检查并清理null账号的所有余额类型:\n   // - balance (STEEM)\n   // - savings_balance (STEEM)\n   // - sbd_balance (SBD)\n   // - savings_sbd_balance (SBD)\n   // - vesting_shares (VESTS)\n   // - reward_steem_balance\n   // - reward_sbd_balance\n   // - reward_vesting_balance\n}\n```\n\n清理操作会:\n1. 统计null账号的所有余额\n2. 生成`clear_null_account_balance_operation`虚拟操作\n3. 将所有余额清零\n4. 从全局供应中扣除相应数量\n\n### 4. 默认重置账号\n\n在账号恢复机制中,null账号被用作默认的`reset_account`:\n\n```cpp\n// 位置: libraries/chain/include/steem/chain/account_object.hpp\naccount_name_type reset_account = STEEM_NULL_ACCOUNT;\n```\n\n## 相关操作\n\n### clear_null_account_balance_operation\n\n这是一个虚拟操作(virtual operation),用于记录null账号余额的清理:\n\n```cpp\n// 位置: libraries/protocol/include/steem/protocol/steem_virtual_operations.hpp\nstruct clear_null_account_balance_operation : public virtual_operation\n{\n   vector< asset > total_cleared;\n};\n```\n\n## 测试用例\n\n代码库中包含针对null账号的测试:\n\n- **位置**: `tests/tests/operation_time_tests.cpp`\n- **测试函数**: `clear_null_account`\n- **测试内容**: 验证向null账号转账后,余额清理机制是否正常工作\n\n## 安全考虑\n\n1. **不可逆性**: 发送到null账号的资金无法恢复,操作前需谨慎\n2. **无权限访问**: 即使知道账号名,也无法通过任何方式访问其中的资金\n3. **系统保护**: null账号的authority结构确保其永远不会被控制\n\n## 总结\n\n| 属性 | 说明 |\n|------|------|\n| **账号类型** | 系统保留账号 |\n| **账号名** | `null` |\n| **是否有私钥** | 否,没有可用私钥 |\n| **Authority状态** | Impossible(无法满足) |\n| **资金可访问性** | 否,资金永久锁定 |\n| **主要用途** | 资金销毁、费用处理 |\n| **余额清理** | 支持(硬分叉0.14后) |\n\n## 参考代码位置\n\n- 定义: `libraries/protocol/include/steem/protocol/config.hpp:332`\n- 初始化: `libraries/chain/database.cpp:3019-3028`\n- Authority检查: `libraries/protocol/authority.cpp:25-31`\n- 余额清理: `libraries/chain/database.cpp:1458-1590`\n- 测试用例: `tests/tests/operation_time_tests.cpp:2852`",
      "json_metadata": "{\"tags\":[\"cn-dev\"],\"app\":\"steemit/0.2\",\"format\":\"markdown\"}"
    }
  ]
}
ety001delegated 50.691 SP to @ety001.test
2025/11/07 06:51:54
delegatorety001
delegateeety001.test
vesting shares82547.602366 VESTS
Transaction InfoBlock #100638498/Trx 79137bfce5a435a4ea4ac65a545dda9e59e80ca8
View Raw JSON Data
{
  "trx_id": "79137bfce5a435a4ea4ac65a545dda9e59e80ca8",
  "block": 100638498,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-11-07T06:51:54",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "ety001",
      "delegatee": "ety001.test",
      "vesting_shares": "82547.602366 VESTS"
    }
  ]
}
meteeupvoted (100.00%) @ety001.test / 3x5np2
2025/11/07 06:47:18
votermetee
authorety001.test
permlink3x5np2
weight10000 (100.00%)
Transaction InfoBlock #100638406/Trx c2d172b8335d6aee571fd7fe3e7fa259197e8164
View Raw JSON Data
{
  "trx_id": "c2d172b8335d6aee571fd7fe3e7fa259197e8164",
  "block": 100638406,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-11-07T06:47:18",
  "op": [
    "vote",
    {
      "voter": "metee",
      "author": "ety001.test",
      "permlink": "3x5np2",
      "weight": 10000
    }
  ]
}
ety001.testpublished a new post: 3x5np2
2025/11/07 06:46:39
parent author
parent permlinkcn-dev
authorety001.test
permlink3x5np2
title喂价保护技术文档
body# 喂价保护技术文档 ## 概述 Steem区块链中的喂价保护机制旨在确保STEEM/SBD价格喂价的稳定性和可靠性,防止价格操纵和异常波动。该机制通过多层保护措施,包括喂价有效性检查、中位数计算、历史价格平滑以及市值比例限制等,来维护系统的稳定性。 ## 价格喂价系统架构 ### 喂价发布 见证人(Witness)通过 `feed_publish_operation` 发布价格喂价: ```cpp // 位置: libraries/chain/steem_evaluator.cpp::feed_publish_evaluator::do_apply() void feed_publish_evaluator::do_apply( const feed_publish_operation& o ) { if( _db.has_hardfork( STEEM_HARDFORK_0_20__409 ) ) FC_ASSERT( is_asset_type( o.exchange_rate.base, SBD_SYMBOL ) && is_asset_type( o.exchange_rate.quote, STEEM_SYMBOL ), "Price feed must be a SBD/STEEM price" ); const auto& witness = _db.get_witness( o.publisher ); _db.modify( witness, [&]( witness_object& w ) { w.sbd_exchange_rate = o.exchange_rate; w.last_sbd_exchange_update = _db.head_block_time(); }); } ``` **关键点**: - 硬分叉0.20.409之后,价格喂价必须是 `SBD/STEEM` 格式 - 每个见证人维护自己的 `sbd_exchange_rate` 和 `last_sbd_exchange_update` 时间戳 ### 喂价验证 发布喂价时进行基本验证: ```cpp // 位置: libraries/protocol/steem_operations.cpp::feed_publish_operation::validate() void feed_publish_operation::validate()const { validate_account_name( publisher ); FC_ASSERT( ( is_asset_type( exchange_rate.base, STEEM_SYMBOL ) && is_asset_type( exchange_rate.quote, SBD_SYMBOL ) ) || ( is_asset_type( exchange_rate.base, SBD_SYMBOL ) && is_asset_type( exchange_rate.quote, STEEM_SYMBOL ) ), "Price feed must be a STEEM/SBD price" ); exchange_rate.validate(); } ``` ## 中位数价格计算 ### 更新频率 中位数价格每 `STEEM_FEED_INTERVAL_BLOCKS` 个区块更新一次(约每小时): ```cpp // 位置: libraries/chain/database.cpp::update_median_feed() void database::update_median_feed() { if( (head_block_num() % STEEM_FEED_INTERVAL_BLOCKS) != 0 ) return; // ... 计算中位数价格 } ``` **常量定义**: - `STEEM_FEED_INTERVAL_BLOCKS = STEEM_BLOCKS_PER_HOUR` (约1200个区块,每小时) ### 有效喂价收集 系统收集所有活跃见证人的有效喂价: ```cpp // 位置: libraries/chain/database.cpp::update_median_feed() auto now = head_block_time(); const witness_schedule_object& wso = get_witness_schedule_object(); vector<price> feeds; feeds.reserve( wso.num_scheduled_witnesses ); for( int i = 0; i < wso.num_scheduled_witnesses; i++ ) { const auto& wit = get_witness( wso.current_shuffled_witnesses[i] ); if( has_hardfork( STEEM_HARDFORK_0_19__822 ) ) { if( now < wit.last_sbd_exchange_update + STEEM_MAX_FEED_AGE_SECONDS && !wit.sbd_exchange_rate.is_null() ) { feeds.push_back( wit.sbd_exchange_rate ); } } else if( wit.last_sbd_exchange_update < now + STEEM_MAX_FEED_AGE_SECONDS && !wit.sbd_exchange_rate.is_null() ) { feeds.push_back( wit.sbd_exchange_rate ); } } ``` **有效性条件**: 1. 喂价不能为空(`!wit.sbd_exchange_rate.is_null()`) 2. 喂价年龄不能超过 `STEEM_MAX_FEED_AGE_SECONDS`(7天) **常量定义**: - `STEEM_MAX_FEED_AGE_SECONDS = 60*60*24*7` (7天 = 604800秒) ### 最小喂价数量要求 系统要求至少 `STEEM_MIN_FEEDS` 个有效喂价才能更新中位数价格: ```cpp if( feeds.size() >= STEEM_MIN_FEEDS ) { std::sort( feeds.begin(), feeds.end() ); auto median_feed = feeds[feeds.size()/2]; // ... 更新价格历史 } ``` **常量定义**: - `STEEM_MIN_FEEDS = STEEM_MAX_WITNESSES / 3` (21 / 3 = 7个喂价) - `STEEM_MAX_WITNESSES = 21` **保护目的**:防止在价格尚未建立时进行转换操作,确保有足够的见证人参与价格喂价。 ## 价格历史窗口 ### 历史价格存储 系统维护一个价格历史队列,用于计算历史中位数: ```cpp modify( get_feed_history(), [&]( feed_history_object& fho ) { fho.price_history.push_back( median_feed ); size_t steem_feed_history_window = STEEM_FEED_HISTORY_WINDOW_PRE_HF_16; if( has_hardfork( STEEM_HARDFORK_0_16__551) ) steem_feed_history_window = STEEM_FEED_HISTORY_WINDOW; if( fho.price_history.size() > steem_feed_history_window ) fho.price_history.pop_front(); ``` **历史窗口大小**: - **硬分叉0.16之前**:`STEEM_FEED_HISTORY_WINDOW_PRE_HF_16 = 24*7` (7天,168个数据点) - **硬分叉0.16之后**:`STEEM_FEED_HISTORY_WINDOW = 12*7` (3.5天,84个数据点) ### 历史中位数计算 从价格历史中计算中位数作为最终有效价格: ```cpp if( fho.price_history.size() ) { std::deque< price > copy; for( const auto& i : fho.price_history ) { copy.push_back( i ); } std::sort( copy.begin(), copy.end() ); fho.current_median_history = copy[copy.size()/2]; ``` **计算方式**: - 将价格历史复制到临时容器 - 排序后取中位数 - 这实现了"中位数的中位数"机制,提供额外的稳定性 ## 市值比例保护机制 ### SBD市值上限限制 在硬分叉0.14.230之后,系统引入了市值比例保护机制,确保SBD市值不超过STEEM+SBD总市值的10%: ```cpp // 位置: libraries/chain/database.cpp::update_median_feed() if( has_hardfork( STEEM_HARDFORK_0_14__230 ) ) { // This block limits the effective median price to force SBD to remain at or // below 10% of the combined market cap of STEEM and SBD. // // For example, if we have 500 STEEM and 100 SBD, the price is limited to // 900 SBD / 500 STEEM which works out to be $1.80. At this price, 500 Steem // would be valued at 500 * $1.80 = $900. 100 SBD is by definition always $100, // so the combined market cap is $900 + $100 = $1000. const auto& gpo = get_dynamic_global_properties(); if( gpo.current_sbd_supply.amount > 0 ) { price min_price( asset( 9 * gpo.current_sbd_supply.amount, SBD_SYMBOL ), gpo.current_supply ); if( min_price > fho.current_median_history ) fho.current_median_history = min_price; } } ``` ### 数学原理 **目标**:确保 `SBD市值 ≤ (STEEM市值 + SBD市值) × 10%` **推导过程**: 1. 设 `SBD市值 = SBD供应量 × $1 = SBD_supply` 2. 设 `STEEM市值 = STEEM供应量 × STEEM价格 = STEEM_supply × price` 3. 总市值 = `SBD_supply + STEEM_supply × price` 4. 要求:`SBD_supply ≤ (SBD_supply + STEEM_supply × price) × 0.1` 5. 化简:`SBD_supply ≤ 0.1 × SBD_supply + 0.1 × STEEM_supply × price` 6. 进一步:`0.9 × SBD_supply ≤ 0.1 × STEEM_supply × price` 7. 得到:`price ≥ (9 × SBD_supply) / STEEM_supply` **实现**: - 计算最小价格:`min_price = (9 × current_sbd_supply) / current_supply` - 如果计算出的历史中位数价格低于最小价格,则使用最小价格 **示例**: - 假设有 500 STEEM 和 100 SBD - 最小价格 = `(9 × 100) / 500 = 900 / 500 = 1.8 SBD/STEEM` - 在此价格下: - STEEM市值 = 500 × 1.8 = 900 SBD(等值) - SBD市值 = 100 SBD - 总市值 = 1000 SBD - SBD占比 = 100 / 1000 = 10% ✓ ## 测试网络特殊处理 在测试网络中,可以通过标志跳过价格限制检查: ```cpp #ifdef IS_TEST_NET if( skip_price_feed_limit_check ) return; #endif ``` 这允许测试网络进行更灵活的价格测试。 ## 转换操作保护 ### 转换延迟 SBD到STEEM的转换操作有延迟机制,确保价格稳定: **常量定义**: - **硬分叉0.16之前**:`STEEM_CONVERSION_DELAY_PRE_HF_16 = fc::days(7)` (7天) - **硬分叉0.16之后**:`STEEM_CONVERSION_DELAY = fc::hours(STEEM_FEED_HISTORY_WINDOW)` (3.5天) ```cpp // 位置: libraries/chain/steem_evaluator.cpp::convert_evaluator::do_apply() void convert_evaluator::do_apply( const convert_operation& o ) { _db.adjust_balance( o.owner, -o.amount ); const auto& fhistory = _db.get_feed_history(); FC_ASSERT( !fhistory.current_median_history.is_null(), "Cannot convert SBD because there is no price feed." ); auto steem_conversion_delay = STEEM_CONVERSION_DELAY_PRE_HF_16; if( _db.has_hardfork( STEEM_HARDFORK_0_16__551) ) steem_conversion_delay = STEEM_CONVERSION_DELAY; _db.create<convert_request_object>( [&]( convert_request_object& obj ) { obj.owner = o.owner; obj.requestid = o.requestid; obj.amount = o.amount; obj.conversion_date = _db.head_block_time() + steem_conversion_delay; }); } ``` **保护机制**: - 转换请求创建后,需要等待延迟时间才能执行 - 延迟时间与价格历史窗口相同,确保价格稳定后再执行转换 ## 关键常量总结 | 常量名 | 值 | 说明 | |--------|-----|------| | `STEEM_FEED_INTERVAL_BLOCKS` | `STEEM_BLOCKS_PER_HOUR` | 喂价更新间隔(约每小时) | | `STEEM_MAX_FEED_AGE_SECONDS` | `60*60*24*7` (604800) | 喂价最大有效期(7天) | | `STEEM_MIN_FEEDS` | `STEEM_MAX_WITNESSES/3` (7) | 最小有效喂价数量 | | `STEEM_FEED_HISTORY_WINDOW_PRE_HF_16` | `24*7` (168) | 硬分叉0.16前的历史窗口(7天) | | `STEEM_FEED_HISTORY_WINDOW` | `12*7` (84) | 硬分叉0.16后的历史窗口(3.5天) | | `STEEM_CONVERSION_DELAY_PRE_HF_16` | `fc::days(7)` | 硬分叉0.16前的转换延迟(7天) | | `STEEM_CONVERSION_DELAY` | `fc::hours(84)` | 硬分叉0.16后的转换延迟(3.5天) | | `STEEM_MAX_WITNESSES` | 21 | 最大见证人数量 | ## 保护机制层次 喂价保护机制采用多层防护: 1. **第一层:喂价有效性检查** - 检查喂价是否为空 - 检查喂价年龄是否在有效期内(7天) 2. **第二层:最小喂价数量要求** - 要求至少7个有效喂价才能更新中位数 - 防止少数见证人操纵价格 3. **第三层:中位数计算** - 使用所有有效喂价的中位数 - 减少异常值的影响 4. **第四层:历史价格平滑** - 维护3.5天的价格历史 - 使用历史中位数作为最终价格 - 实现"中位数的中位数"机制 5. **第五层:市值比例限制** - 确保SBD市值不超过总市值的10% - 通过设置最小价格实现 6. **第六层:转换延迟** - 转换操作延迟3.5天执行 - 与价格历史窗口同步,确保价格稳定 ## 硬分叉影响 ### 硬分叉0.14.230 - **引入**:市值比例保护机制 - **目的**:防止SBD市值过度膨胀 ### 硬分叉0.16.551 - **变更**:价格历史窗口从7天缩短到3.5天 - **变更**:转换延迟从7天缩短到3.5天 - **影响**:提高价格响应速度,同时保持稳定性 ### 硬分叉0.19.822 - **变更**:优化喂价年龄检查逻辑 - **改进**:更严格的时间戳验证 ### 硬分叉0.20.409 - **变更**:强制要求价格喂价为 `SBD/STEEM` 格式 - **目的**:统一价格表示格式 ## 安全考虑 1. **防止价格操纵**:通过中位数计算和历史平滑,单个见证人无法轻易操纵价格 2. **防止异常波动**:历史窗口机制平滑短期价格波动 3. **防止市值失衡**:市值比例限制确保SBD不会过度膨胀 4. **防止过早转换**:最小喂价数量要求和转换延迟防止在价格未建立时进行转换 5. **防止过期喂价**:7天的喂价有效期确保价格信息及时更新 ## 相关数据结构 ### feed_history_object ```cpp // 位置: libraries/chain/include/steem/chain/steem_objects.hpp class feed_history_object : public object< feed_history_object_type, feed_history_object > { price current_median_history; // 当前历史中位数价格 deque< price > price_history; // 价格历史队列 }; ``` ### witness_object ```cpp // 位置: libraries/chain/include/steem/chain/witness_objects.hpp class witness_object : public object< witness_object_type, witness_object > { price sbd_exchange_rate; // SBD/STEEM汇率 time_point_sec last_sbd_exchange_update; // 最后更新时间 }; ``` ## 测试用例 代码库中包含针对价格喂价的测试: - **位置**: `tests/tests/operation_time_tests.cpp` - **测试内容**: 验证价格喂价更新、中位数计算、历史窗口等功能 ## 参考代码位置 - 价格喂价更新: `libraries/chain/database.cpp:3540-3620` - 喂价发布评估: `libraries/chain/steem_evaluator.cpp:2505-2517` - 喂价验证: `libraries/protocol/steem_operations.cpp:487-494` - 常量定义: `libraries/protocol/include/steem/protocol/config.hpp:255-261` - 转换操作: `libraries/chain/steem_evaluator.cpp:2519-2538` - 测试用例: `tests/tests/operation_time_tests.cpp` ## 总结 Steem的喂价保护机制通过多层防护措施,确保了价格喂价的稳定性和可靠性: | 保护层 | 机制 | 目的 | |--------|------|------| | 有效性检查 | 年龄限制、非空检查 | 确保喂价及时有效 | | 数量要求 | 最少7个有效喂价 | 防止少数人操纵 | | 中位数计算 | 取所有喂价中位数 | 减少异常值影响 | | 历史平滑 | 3.5天历史中位数 | 平滑短期波动 | | 市值限制 | SBD市值≤10%总市值 | 防止市值失衡 | | 转换延迟 | 3.5天延迟执行 | 确保价格稳定 | 这些机制共同工作,为Steem生态系统提供了稳定可靠的价格基础。
json metadata{"tags":["cn-dev"],"app":"steemit/0.2","format":"markdown"}
Transaction InfoBlock #100638393/Trx 80a5c88e2c5efb362a9f0b5b33d6f18c74286961
View Raw JSON Data
{
  "trx_id": "80a5c88e2c5efb362a9f0b5b33d6f18c74286961",
  "block": 100638393,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-11-07T06:46:39",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "cn-dev",
      "author": "ety001.test",
      "permlink": "3x5np2",
      "title": "喂价保护技术文档",
      "body": "# 喂价保护技术文档\n\n## 概述\n\nSteem区块链中的喂价保护机制旨在确保STEEM/SBD价格喂价的稳定性和可靠性,防止价格操纵和异常波动。该机制通过多层保护措施,包括喂价有效性检查、中位数计算、历史价格平滑以及市值比例限制等,来维护系统的稳定性。\n\n## 价格喂价系统架构\n\n### 喂价发布\n\n见证人(Witness)通过 `feed_publish_operation` 发布价格喂价:\n\n```cpp\n// 位置: libraries/chain/steem_evaluator.cpp::feed_publish_evaluator::do_apply()\n\nvoid feed_publish_evaluator::do_apply( const feed_publish_operation& o )\n{\n   if( _db.has_hardfork( STEEM_HARDFORK_0_20__409 ) )\n      FC_ASSERT( is_asset_type( o.exchange_rate.base, SBD_SYMBOL ) && is_asset_type( o.exchange_rate.quote, STEEM_SYMBOL ),\n            \"Price feed must be a SBD/STEEM price\" );\n\n   const auto& witness = _db.get_witness( o.publisher );\n   _db.modify( witness, [&]( witness_object& w )\n   {\n      w.sbd_exchange_rate = o.exchange_rate;\n      w.last_sbd_exchange_update = _db.head_block_time();\n   });\n}\n```\n\n**关键点**:\n- 硬分叉0.20.409之后,价格喂价必须是 `SBD/STEEM` 格式\n- 每个见证人维护自己的 `sbd_exchange_rate` 和 `last_sbd_exchange_update` 时间戳\n\n### 喂价验证\n\n发布喂价时进行基本验证:\n\n```cpp\n// 位置: libraries/protocol/steem_operations.cpp::feed_publish_operation::validate()\n\nvoid feed_publish_operation::validate()const\n{\n   validate_account_name( publisher );\n   FC_ASSERT( ( is_asset_type( exchange_rate.base, STEEM_SYMBOL ) && is_asset_type( exchange_rate.quote, SBD_SYMBOL ) )\n      || ( is_asset_type( exchange_rate.base, SBD_SYMBOL ) && is_asset_type( exchange_rate.quote, STEEM_SYMBOL ) ),\n      \"Price feed must be a STEEM/SBD price\" );\n   exchange_rate.validate();\n}\n```\n\n## 中位数价格计算\n\n### 更新频率\n\n中位数价格每 `STEEM_FEED_INTERVAL_BLOCKS` 个区块更新一次(约每小时):\n\n```cpp\n// 位置: libraries/chain/database.cpp::update_median_feed()\n\nvoid database::update_median_feed() {\n   if( (head_block_num() % STEEM_FEED_INTERVAL_BLOCKS) != 0 )\n      return;\n   // ... 计算中位数价格\n}\n```\n\n**常量定义**:\n- `STEEM_FEED_INTERVAL_BLOCKS = STEEM_BLOCKS_PER_HOUR` (约1200个区块,每小时)\n\n### 有效喂价收集\n\n系统收集所有活跃见证人的有效喂价:\n\n```cpp\n// 位置: libraries/chain/database.cpp::update_median_feed()\n\nauto now = head_block_time();\nconst witness_schedule_object& wso = get_witness_schedule_object();\nvector<price> feeds; feeds.reserve( wso.num_scheduled_witnesses );\n\nfor( int i = 0; i < wso.num_scheduled_witnesses; i++ )\n{\n   const auto& wit = get_witness( wso.current_shuffled_witnesses[i] );\n   if( has_hardfork( STEEM_HARDFORK_0_19__822 ) )\n   {\n      if( now < wit.last_sbd_exchange_update + STEEM_MAX_FEED_AGE_SECONDS\n         && !wit.sbd_exchange_rate.is_null() )\n      {\n         feeds.push_back( wit.sbd_exchange_rate );\n      }\n   }\n   else if( wit.last_sbd_exchange_update < now + STEEM_MAX_FEED_AGE_SECONDS &&\n       !wit.sbd_exchange_rate.is_null() )\n   {\n      feeds.push_back( wit.sbd_exchange_rate );\n   }\n}\n```\n\n**有效性条件**:\n1. 喂价不能为空(`!wit.sbd_exchange_rate.is_null()`)\n2. 喂价年龄不能超过 `STEEM_MAX_FEED_AGE_SECONDS`(7天)\n\n**常量定义**:\n- `STEEM_MAX_FEED_AGE_SECONDS = 60*60*24*7` (7天 = 604800秒)\n\n### 最小喂价数量要求\n\n系统要求至少 `STEEM_MIN_FEEDS` 个有效喂价才能更新中位数价格:\n\n```cpp\nif( feeds.size() >= STEEM_MIN_FEEDS )\n{\n   std::sort( feeds.begin(), feeds.end() );\n   auto median_feed = feeds[feeds.size()/2];\n   // ... 更新价格历史\n}\n```\n\n**常量定义**:\n- `STEEM_MIN_FEEDS = STEEM_MAX_WITNESSES / 3` (21 / 3 = 7个喂价)\n- `STEEM_MAX_WITNESSES = 21`\n\n**保护目的**:防止在价格尚未建立时进行转换操作,确保有足够的见证人参与价格喂价。\n\n## 价格历史窗口\n\n### 历史价格存储\n\n系统维护一个价格历史队列,用于计算历史中位数:\n\n```cpp\nmodify( get_feed_history(), [&]( feed_history_object& fho )\n{\n   fho.price_history.push_back( median_feed );\n   size_t steem_feed_history_window = STEEM_FEED_HISTORY_WINDOW_PRE_HF_16;\n   if( has_hardfork( STEEM_HARDFORK_0_16__551) )\n      steem_feed_history_window = STEEM_FEED_HISTORY_WINDOW;\n\n   if( fho.price_history.size() > steem_feed_history_window )\n      fho.price_history.pop_front();\n```\n\n**历史窗口大小**:\n- **硬分叉0.16之前**:`STEEM_FEED_HISTORY_WINDOW_PRE_HF_16 = 24*7` (7天,168个数据点)\n- **硬分叉0.16之后**:`STEEM_FEED_HISTORY_WINDOW = 12*7` (3.5天,84个数据点)\n\n### 历史中位数计算\n\n从价格历史中计算中位数作为最终有效价格:\n\n```cpp\nif( fho.price_history.size() )\n{\n   std::deque< price > copy;\n   for( const auto& i : fho.price_history )\n   {\n      copy.push_back( i );\n   }\n\n   std::sort( copy.begin(), copy.end() );\n   fho.current_median_history = copy[copy.size()/2];\n```\n\n**计算方式**:\n- 将价格历史复制到临时容器\n- 排序后取中位数\n- 这实现了\"中位数的中位数\"机制,提供额外的稳定性\n\n## 市值比例保护机制\n\n### SBD市值上限限制\n\n在硬分叉0.14.230之后,系统引入了市值比例保护机制,确保SBD市值不超过STEEM+SBD总市值的10%:\n\n```cpp\n// 位置: libraries/chain/database.cpp::update_median_feed()\n\nif( has_hardfork( STEEM_HARDFORK_0_14__230 ) )\n{\n   // This block limits the effective median price to force SBD to remain at or\n   // below 10% of the combined market cap of STEEM and SBD.\n   //\n   // For example, if we have 500 STEEM and 100 SBD, the price is limited to\n   // 900 SBD / 500 STEEM which works out to be $1.80.  At this price, 500 Steem\n   // would be valued at 500 * $1.80 = $900.  100 SBD is by definition always $100,\n   // so the combined market cap is $900 + $100 = $1000.\n\n   const auto& gpo = get_dynamic_global_properties();\n\n   if( gpo.current_sbd_supply.amount > 0 )\n   {\n      price min_price( asset( 9 * gpo.current_sbd_supply.amount, SBD_SYMBOL ), gpo.current_supply );\n\n      if( min_price > fho.current_median_history )\n         fho.current_median_history = min_price;\n   }\n}\n```\n\n### 数学原理\n\n**目标**:确保 `SBD市值 ≤ (STEEM市值 + SBD市值) × 10%`\n\n**推导过程**:\n1. 设 `SBD市值 = SBD供应量 × $1 = SBD_supply`\n2. 设 `STEEM市值 = STEEM供应量 × STEEM价格 = STEEM_supply × price`\n3. 总市值 = `SBD_supply + STEEM_supply × price`\n4. 要求:`SBD_supply ≤ (SBD_supply + STEEM_supply × price) × 0.1`\n5. 化简:`SBD_supply ≤ 0.1 × SBD_supply + 0.1 × STEEM_supply × price`\n6. 进一步:`0.9 × SBD_supply ≤ 0.1 × STEEM_supply × price`\n7. 得到:`price ≥ (9 × SBD_supply) / STEEM_supply`\n\n**实现**:\n- 计算最小价格:`min_price = (9 × current_sbd_supply) / current_supply`\n- 如果计算出的历史中位数价格低于最小价格,则使用最小价格\n\n**示例**:\n- 假设有 500 STEEM 和 100 SBD\n- 最小价格 = `(9 × 100) / 500 = 900 / 500 = 1.8 SBD/STEEM`\n- 在此价格下:\n  - STEEM市值 = 500 × 1.8 = 900 SBD(等值)\n  - SBD市值 = 100 SBD\n  - 总市值 = 1000 SBD\n  - SBD占比 = 100 / 1000 = 10% ✓\n\n## 测试网络特殊处理\n\n在测试网络中,可以通过标志跳过价格限制检查:\n\n```cpp\n#ifdef IS_TEST_NET\n   if( skip_price_feed_limit_check )\n      return;\n#endif\n```\n\n这允许测试网络进行更灵活的价格测试。\n\n## 转换操作保护\n\n### 转换延迟\n\nSBD到STEEM的转换操作有延迟机制,确保价格稳定:\n\n**常量定义**:\n- **硬分叉0.16之前**:`STEEM_CONVERSION_DELAY_PRE_HF_16 = fc::days(7)` (7天)\n- **硬分叉0.16之后**:`STEEM_CONVERSION_DELAY = fc::hours(STEEM_FEED_HISTORY_WINDOW)` (3.5天)\n\n```cpp\n// 位置: libraries/chain/steem_evaluator.cpp::convert_evaluator::do_apply()\n\nvoid convert_evaluator::do_apply( const convert_operation& o )\n{\n   _db.adjust_balance( o.owner, -o.amount );\n\n   const auto& fhistory = _db.get_feed_history();\n   FC_ASSERT( !fhistory.current_median_history.is_null(), \"Cannot convert SBD because there is no price feed.\" );\n\n   auto steem_conversion_delay = STEEM_CONVERSION_DELAY_PRE_HF_16;\n   if( _db.has_hardfork( STEEM_HARDFORK_0_16__551) )\n      steem_conversion_delay = STEEM_CONVERSION_DELAY;\n\n   _db.create<convert_request_object>( [&]( convert_request_object& obj )\n   {\n      obj.owner           = o.owner;\n      obj.requestid       = o.requestid;\n      obj.amount          = o.amount;\n      obj.conversion_date = _db.head_block_time() + steem_conversion_delay;\n   });\n}\n```\n\n**保护机制**:\n- 转换请求创建后,需要等待延迟时间才能执行\n- 延迟时间与价格历史窗口相同,确保价格稳定后再执行转换\n\n## 关键常量总结\n\n| 常量名 | 值 | 说明 |\n|--------|-----|------|\n| `STEEM_FEED_INTERVAL_BLOCKS` | `STEEM_BLOCKS_PER_HOUR` | 喂价更新间隔(约每小时) |\n| `STEEM_MAX_FEED_AGE_SECONDS` | `60*60*24*7` (604800) | 喂价最大有效期(7天) |\n| `STEEM_MIN_FEEDS` | `STEEM_MAX_WITNESSES/3` (7) | 最小有效喂价数量 |\n| `STEEM_FEED_HISTORY_WINDOW_PRE_HF_16` | `24*7` (168) | 硬分叉0.16前的历史窗口(7天) |\n| `STEEM_FEED_HISTORY_WINDOW` | `12*7` (84) | 硬分叉0.16后的历史窗口(3.5天) |\n| `STEEM_CONVERSION_DELAY_PRE_HF_16` | `fc::days(7)` | 硬分叉0.16前的转换延迟(7天) |\n| `STEEM_CONVERSION_DELAY` | `fc::hours(84)` | 硬分叉0.16后的转换延迟(3.5天) |\n| `STEEM_MAX_WITNESSES` | 21 | 最大见证人数量 |\n\n## 保护机制层次\n\n喂价保护机制采用多层防护:\n\n1. **第一层:喂价有效性检查**\n   - 检查喂价是否为空\n   - 检查喂价年龄是否在有效期内(7天)\n\n2. **第二层:最小喂价数量要求**\n   - 要求至少7个有效喂价才能更新中位数\n   - 防止少数见证人操纵价格\n\n3. **第三层:中位数计算**\n   - 使用所有有效喂价的中位数\n   - 减少异常值的影响\n\n4. **第四层:历史价格平滑**\n   - 维护3.5天的价格历史\n   - 使用历史中位数作为最终价格\n   - 实现\"中位数的中位数\"机制\n\n5. **第五层:市值比例限制**\n   - 确保SBD市值不超过总市值的10%\n   - 通过设置最小价格实现\n\n6. **第六层:转换延迟**\n   - 转换操作延迟3.5天执行\n   - 与价格历史窗口同步,确保价格稳定\n\n## 硬分叉影响\n\n### 硬分叉0.14.230\n- **引入**:市值比例保护机制\n- **目的**:防止SBD市值过度膨胀\n\n### 硬分叉0.16.551\n- **变更**:价格历史窗口从7天缩短到3.5天\n- **变更**:转换延迟从7天缩短到3.5天\n- **影响**:提高价格响应速度,同时保持稳定性\n\n### 硬分叉0.19.822\n- **变更**:优化喂价年龄检查逻辑\n- **改进**:更严格的时间戳验证\n\n### 硬分叉0.20.409\n- **变更**:强制要求价格喂价为 `SBD/STEEM` 格式\n- **目的**:统一价格表示格式\n\n## 安全考虑\n\n1. **防止价格操纵**:通过中位数计算和历史平滑,单个见证人无法轻易操纵价格\n2. **防止异常波动**:历史窗口机制平滑短期价格波动\n3. **防止市值失衡**:市值比例限制确保SBD不会过度膨胀\n4. **防止过早转换**:最小喂价数量要求和转换延迟防止在价格未建立时进行转换\n5. **防止过期喂价**:7天的喂价有效期确保价格信息及时更新\n\n## 相关数据结构\n\n### feed_history_object\n\n```cpp\n// 位置: libraries/chain/include/steem/chain/steem_objects.hpp\n\nclass feed_history_object : public object< feed_history_object_type, feed_history_object >\n{\n   price                    current_median_history;  // 当前历史中位数价格\n   deque< price >           price_history;           // 价格历史队列\n};\n```\n\n### witness_object\n\n```cpp\n// 位置: libraries/chain/include/steem/chain/witness_objects.hpp\n\nclass witness_object : public object< witness_object_type, witness_object >\n{\n   price                    sbd_exchange_rate;        // SBD/STEEM汇率\n   time_point_sec           last_sbd_exchange_update; // 最后更新时间\n};\n```\n\n## 测试用例\n\n代码库中包含针对价格喂价的测试:\n\n- **位置**: `tests/tests/operation_time_tests.cpp`\n- **测试内容**: 验证价格喂价更新、中位数计算、历史窗口等功能\n\n## 参考代码位置\n\n- 价格喂价更新: `libraries/chain/database.cpp:3540-3620`\n- 喂价发布评估: `libraries/chain/steem_evaluator.cpp:2505-2517`\n- 喂价验证: `libraries/protocol/steem_operations.cpp:487-494`\n- 常量定义: `libraries/protocol/include/steem/protocol/config.hpp:255-261`\n- 转换操作: `libraries/chain/steem_evaluator.cpp:2519-2538`\n- 测试用例: `tests/tests/operation_time_tests.cpp`\n\n## 总结\n\nSteem的喂价保护机制通过多层防护措施,确保了价格喂价的稳定性和可靠性:\n\n| 保护层 | 机制 | 目的 |\n|--------|------|------|\n| 有效性检查 | 年龄限制、非空检查 | 确保喂价及时有效 |\n| 数量要求 | 最少7个有效喂价 | 防止少数人操纵 |\n| 中位数计算 | 取所有喂价中位数 | 减少异常值影响 |\n| 历史平滑 | 3.5天历史中位数 | 平滑短期波动 |\n| 市值限制 | SBD市值≤10%总市值 | 防止市值失衡 |\n| 转换延迟 | 3.5天延迟执行 | 确保价格稳定 |\n\n这些机制共同工作,为Steem生态系统提供了稳定可靠的价格基础。",
      "json_metadata": "{\"tags\":[\"cn-dev\"],\"app\":\"steemit/0.2\",\"format\":\"markdown\"}"
    }
  ]
}
ety001.testpublished a new post: test-div-class
2025/05/06 04:26:42
parent author
parent permlinktest
authorety001.test
permlinktest-div-class
titletest div class
body<div class="h1">hi</div> <!-- test -->
json metadata{"app":"steemit/0.2","format":"markdown"}
Transaction InfoBlock #95320848/Trx 99305a6a7fdaa64e1080306694e236ddea43a8b5
View Raw JSON Data
{
  "trx_id": "99305a6a7fdaa64e1080306694e236ddea43a8b5",
  "block": 95320848,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-05-06T04:26:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-div-class",
      "title": "test div class",
      "body": "<div class=\"h1\">hi</div>\n<!-- test -->",
      "json_metadata": "{\"app\":\"steemit/0.2\",\"format\":\"markdown\"}"
    }
  ]
}
ety001.testpublished a new post: test-div-class
2025/05/06 04:25:03
parent author
parent permlinktest
authorety001.test
permlinktest-div-class
titletest div class
body<div class="h1">hi</div>
json metadata{"tags":["test"],"app":"steemit/0.2","format":"markdown"}
Transaction InfoBlock #95320815/Trx 818dceffc1f958f6c7b34284c263bc78e2832727
View Raw JSON Data
{
  "trx_id": "818dceffc1f958f6c7b34284c263bc78e2832727",
  "block": 95320815,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-05-06T04:25:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-div-class",
      "title": "test div class",
      "body": "<div class=\"h1\">hi</div>",
      "json_metadata": "{\"tags\":[\"test\"],\"app\":\"steemit/0.2\",\"format\":\"markdown\"}"
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001.test- "memo info"
2025/04/10 18:05:33
fromety001.test
toety001.test
amount0.001 STEEM
memomemo info
Transaction InfoBlock #94590924/Trx 43fee13e39eb283a650330c4fc579ec8c1aff3fe
View Raw JSON Data
{
  "trx_id": "43fee13e39eb283a650330c4fc579ec8c1aff3fe",
  "block": 94590924,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-04-10T18:05:33",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": "memo info"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/27 18:44:00
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body![tt123](https://&#34;&#32;&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#50;&#51;&#52;&#41;) <img src="https://&#34;&#32;&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#50;&#51;&#52;&#41;" />
json metadata{}
Transaction InfoBlock #94189403/Trx 441bd02a8f790df7a7743ff272f59cdbe4881233
View Raw JSON Data
{
  "trx_id": "441bd02a8f790df7a7743ff272f59cdbe4881233",
  "block": 94189403,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-27T18:44:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "![tt123](https://&#34;&#32;&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#50;&#51;&#52;&#41;) <img src=\"https://&#34;&#32;&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#50;&#51;&#52;&#41;\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/27 18:34:18
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body![tt123](https://"javascript:alert(1234)) <img src="javascript:alert(1)" />
json metadata{}
Transaction InfoBlock #94189210/Trx 398de8db62697d457920fe6e8a6c8b51f537c276
View Raw JSON Data
{
  "trx_id": "398de8db62697d457920fe6e8a6c8b51f537c276",
  "block": 94189210,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-27T18:34:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "![tt123](https://\"javascript:alert(1234)) <img src=\"javascript:alert(1)\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/27 18:30:15
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body![tt123](https://"javascript:alert(1234))
json metadata{}
Transaction InfoBlock #94189129/Trx b0685902802413db6ae79c942409e2fbca22d88c
View Raw JSON Data
{
  "trx_id": "b0685902802413db6ae79c942409e2fbca22d88c",
  "block": 94189129,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-27T18:30:15",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "![tt123](https://\"javascript:alert(1234))",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/27 18:28:18
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body![tt123](https://" javascript:alert(1234))
json metadata{}
Transaction InfoBlock #94189090/Trx 63e6562bfdd2ce699aa56feb8d98dce40bfe1223
View Raw JSON Data
{
  "trx_id": "63e6562bfdd2ce699aa56feb8d98dce40bfe1223",
  "block": 94189090,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-27T18:28:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "![tt123](https://\" javascript:alert(1234))",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/27 11:45:18
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body<img src=javascript:alert(1234) />
json metadata{}
Transaction InfoBlock #94181051/Trx 0101058700007502d407ec8cff7bcbce5f6201ff
View Raw JSON Data
{
  "trx_id": "0101058700007502d407ec8cff7bcbce5f6201ff",
  "block": 94181051,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-27T11:45:18",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "<img src=javascript:alert(1234) />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 18:37:57
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body<img src="javascript:alert(123);" />
json metadata{}
Transaction InfoBlock #94160788/Trx 035fe05ea8765bf1bcb11fd0a30d78e2fcd292b6
View Raw JSON Data
{
  "trx_id": "035fe05ea8765bf1bcb11fd0a30d78e2fcd292b6",
  "block": 94160788,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T18:37:57",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "<img src=\"javascript:alert(123);\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 13:02:03
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body<img src="&#34;javascript:alert(/xss/)" />
json metadata{}
Transaction InfoBlock #94154081/Trx 1908cc9709e4b485e7efe4230063debe936d0ca2
View Raw JSON Data
{
  "trx_id": "1908cc9709e4b485e7efe4230063debe936d0ca2",
  "block": 94154081,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T13:02:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "<img src=\"&#34;javascript:alert(/xss/)\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:55:36
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body<img src="&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)" />
json metadata{}
Transaction InfoBlock #94153952/Trx d0388b1bfb71e681dffd5a100613cade9d2d7762
View Raw JSON Data
{
  "trx_id": "d0388b1bfb71e681dffd5a100613cade9d2d7762",
  "block": 94153952,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:55:36",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "<img src=\"&#01;j&#97;v&#x61;s&#9;c&#10;r&#13;ipt:alert(/xss/)\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:52:00
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body![test123](http://" onmouseover="alert(100))
json metadata{}
Transaction InfoBlock #94153880/Trx cac2019677532f6738c6770cb4a468999c26f34d
View Raw JSON Data
{
  "trx_id": "cac2019677532f6738c6770cb4a468999c26f34d",
  "block": 94153880,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:52:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "![test123](http://\" onmouseover=\"alert(100))",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:49:21
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body![test123](" onmouseover="alert(100))
json metadata{}
Transaction InfoBlock #94153827/Trx 9738cfdbfaf960fee19c13ac43bda8daeff7afc4
View Raw JSON Data
{
  "trx_id": "9738cfdbfaf960fee19c13ac43bda8daeff7afc4",
  "block": 94153827,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:49:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "![test123](\" onmouseover=\"alert(100))",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:47:30
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body![test123](http://"><script>alert(1234)</script>)
json metadata{}
Transaction InfoBlock #94153790/Trx ee03a4bbbb0d39694aae83146a71030640e31a75
View Raw JSON Data
{
  "trx_id": "ee03a4bbbb0d39694aae83146a71030640e31a75",
  "block": 94153790,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:47:30",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "![test123](http://\"><script>alert(1234)</script>)",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:43:03
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body[test](http://"><script>alert(1234)</script>)
json metadata{}
Transaction InfoBlock #94153702/Trx 0a15de6e1b809c59083971e7988b6a9c2a818309
View Raw JSON Data
{
  "trx_id": "0a15de6e1b809c59083971e7988b6a9c2a818309",
  "block": 94153702,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:43:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "[test](http://\"><script>alert(1234)</script>)",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:38:03
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body<img src="https://steemitimages.com/800x600/" onmouseover="alert(1)"" />
json metadata{}
Transaction InfoBlock #94153604/Trx bf71651fde7220307ed95a5eb21c67d5c7684f21
View Raw JSON Data
{
  "trx_id": "bf71651fde7220307ed95a5eb21c67d5c7684f21",
  "block": 94153604,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:38:03",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "<img src=\"https://steemitimages.com/800x600/\" onmouseover=\"alert(1)\"\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:35:42
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body[test](https://"\ onclick=alert('XSS2')) <img src="\"javascript:alert('XSS2')" />
json metadata{}
Transaction InfoBlock #94153558/Trx 9516e53b80b4b159089dd26af4f8fc4b8c539cf4
View Raw JSON Data
{
  "trx_id": "9516e53b80b4b159089dd26af4f8fc4b8c539cf4",
  "block": 94153558,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:35:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "[test](https://\"\\ onclick=alert('XSS2')) <img src=\"\\\"javascript:alert('XSS2')\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:33:45
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body[test](https://" onclick="alert('XSS2')) <img src="\"javascript:alert('XSS2')" />
json metadata{}
Transaction InfoBlock #94153519/Trx 22453250c17040e06c1470b6ed3a7aae34a362b3
View Raw JSON Data
{
  "trx_id": "22453250c17040e06c1470b6ed3a7aae34a362b3",
  "block": 94153519,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:33:45",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "[test](https://\" onclick=\"alert('XSS2')) <img src=\"\\\"javascript:alert('XSS2')\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:31:42
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body[test](https://"javascript:alert('XSS2')) <img src="\"javascript:alert('XSS2')" />
json metadata{}
Transaction InfoBlock #94153479/Trx 6da6d1e86cdd06d0bbbc7a5cce752dbe2748e38d
View Raw JSON Data
{
  "trx_id": "6da6d1e86cdd06d0bbbc7a5cce752dbe2748e38d",
  "block": 94153479,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:31:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "[test](https://\"javascript:alert('XSS2')) <img src=\"\\\"javascript:alert('XSS2')\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:16:51
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body <img src="\"javascript:alert('XSS2')" />
json metadata{}
Transaction InfoBlock #94153188/Trx 3a893a459ea3ac558bd9b6ca151a71f7808275ff
View Raw JSON Data
{
  "trx_id": "3a893a459ea3ac558bd9b6ca151a71f7808275ff",
  "block": 94153188,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:16:51",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": " <img src=\"\\\"javascript:alert('XSS2')\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001delegated 20.618 SP to @ety001.test
2025/03/26 12:16:33
delegatorety001
delegateeety001.test
vesting shares33574.636292 VESTS
Transaction InfoBlock #94153182/Trx 89cb2914f33f751a2fc6c43cc64f8c470e5c1760
View Raw JSON Data
{
  "trx_id": "89cb2914f33f751a2fc6c43cc64f8c470e5c1760",
  "block": 94153182,
  "trx_in_block": 3,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:16:33",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "ety001",
      "delegatee": "ety001.test",
      "vesting_shares": "33574.636292 VESTS"
    }
  ]
}
ety001.testpublished a new post: test-pr3944-2
2025/03/26 12:12:21
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944-2
titletest pr3944 2
body[test img xss](javascript:alert('XSS')) <img src="javascript:alert('XSS2')" />
json metadata{}
Transaction InfoBlock #94153099/Trx 0afe014dfc7907eb42ab462f5e672ff94f959374
View Raw JSON Data
{
  "trx_id": "0afe014dfc7907eb42ab462f5e672ff94f959374",
  "block": 94153099,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T12:12:21",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944-2",
      "title": "test pr3944 2",
      "body": "[test img xss](javascript:alert('XSS'))  <img src=\"javascript:alert('XSS2')\" />",
      "json_metadata": "{}"
    }
  ]
}
ety001.testupdated their account properties
2025/03/26 11:59:33
accountety001.test
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7g7LEae1deMa4hH28UKuxHhqCUrnXYZy1k5nGZfzqpCX1xWDaE",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM8XNpCMGTAwWCKZXx4ShHG6SUdNMdcLpgXVz9oA8UYkEiPx212X",1]]}
memo keySTM7BoijbnbVt5EsF4zVGvHcwwR18se9fV5mtBadgawAwjEX6vDcT
json metadata{}
Transaction InfoBlock #94152844/Trx 6e107be64997f94d2ec9735e96cdaeb3566241c5
View Raw JSON Data
{
  "trx_id": "6e107be64997f94d2ec9735e96cdaeb3566241c5",
  "block": 94152844,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T11:59:33",
  "op": [
    "account_update",
    {
      "account": "ety001.test",
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7g7LEae1deMa4hH28UKuxHhqCUrnXYZy1k5nGZfzqpCX1xWDaE",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM8XNpCMGTAwWCKZXx4ShHG6SUdNMdcLpgXVz9oA8UYkEiPx212X",
            1
          ]
        ]
      },
      "memo_key": "STM7BoijbnbVt5EsF4zVGvHcwwR18se9fV5mtBadgawAwjEX6vDcT",
      "json_metadata": "{}"
    }
  ]
}
ety001.testblockchain operation: recover account
2025/03/26 11:43:24
account to recoverety001.test
new owner authority{"weight_threshold":1,"account_auths":[],"key_auths":[["STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",1]]}
recent owner authority{"weight_threshold":1,"account_auths":[],"key_auths":[["STM5KK4Pkbir1BDjbQebdqBMGMTqiSZxBztbgpsDBzeWyS48q6ABY",1]]}
extensions[]
Transaction InfoBlock #94152522/Trx db36d667394fa1fd308090567011000b997a7f0d
View Raw JSON Data
{
  "trx_id": "db36d667394fa1fd308090567011000b997a7f0d",
  "block": 94152522,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T11:43:24",
  "op": [
    "recover_account",
    {
      "account_to_recover": "ety001.test",
      "new_owner_authority": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",
            1
          ]
        ]
      },
      "recent_owner_authority": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM5KK4Pkbir1BDjbQebdqBMGMTqiSZxBztbgpsDBzeWyS48q6ABY",
            1
          ]
        ]
      },
      "extensions": []
    }
  ]
}
ety001.testblockchain operation: request account recovery
2025/03/26 11:43:15
recovery accountety001
account to recoverety001.test
new owner authority{"weight_threshold":1,"account_auths":[],"key_auths":[["STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",1]]}
extensions[]
Transaction InfoBlock #94152519/Trx 0b624e384dd6a055aeb184ea21d3043ffa9bf776
View Raw JSON Data
{
  "trx_id": "0b624e384dd6a055aeb184ea21d3043ffa9bf776",
  "block": 94152519,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T11:43:15",
  "op": [
    "request_account_recovery",
    {
      "recovery_account": "ety001",
      "account_to_recover": "ety001.test",
      "new_owner_authority": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",
            1
          ]
        ]
      },
      "extensions": []
    }
  ]
}
ety001.testblockchain operation: request account recovery
2025/03/26 11:36:24
recovery accountety001
account to recoverety001.test
new owner authority{"weight_threshold":1,"account_auths":[],"key_auths":[["STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",1]]}
extensions[]
Transaction InfoBlock #94152382/Trx 3d56cd576c85edb3c3f4da87d69ce037f03af909
View Raw JSON Data
{
  "trx_id": "3d56cd576c85edb3c3f4da87d69ce037f03af909",
  "block": 94152382,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T11:36:24",
  "op": [
    "request_account_recovery",
    {
      "recovery_account": "ety001",
      "account_to_recover": "ety001.test",
      "new_owner_authority": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",
            1
          ]
        ]
      },
      "extensions": []
    }
  ]
}
ety001.testblockchain operation: request account recovery
2025/03/26 11:12:45
recovery accountety001
account to recoverety001.test
new owner authority{"weight_threshold":1,"account_auths":[],"key_auths":[["STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",1]]}
extensions[]
Transaction InfoBlock #94151909/Trx 9d19fb8c551a834c79170384a4cb720f8a257011
View Raw JSON Data
{
  "trx_id": "9d19fb8c551a834c79170384a4cb720f8a257011",
  "block": 94151909,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T11:12:45",
  "op": [
    "request_account_recovery",
    {
      "recovery_account": "ety001",
      "account_to_recover": "ety001.test",
      "new_owner_authority": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",
            1
          ]
        ]
      },
      "extensions": []
    }
  ]
}
ety001.testupdated their account properties
2025/03/26 10:48:48
accountety001.test
owner{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg",1]]}
active{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg",1]]}
posting{"weight_threshold":1,"account_auths":[],"key_auths":[["STM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg",1]]}
memo keySTM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg
json metadata{}
Transaction InfoBlock #94151432/Trx 5c9fc9ece9767c435637dfb763e4beeca9befb64
View Raw JSON Data
{
  "trx_id": "5c9fc9ece9767c435637dfb763e4beeca9befb64",
  "block": 94151432,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T10:48:48",
  "op": [
    "account_update",
    {
      "account": "ety001.test",
      "owner": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg",
            1
          ]
        ]
      },
      "active": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg",
            1
          ]
        ]
      },
      "posting": {
        "weight_threshold": 1,
        "account_auths": [],
        "key_auths": [
          [
            "STM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg",
            1
          ]
        ]
      },
      "memo_key": "STM7XJ1tCUwLMg9HbuhhHBYG4fhpeX3ScZRz5EnYWG9g4aRLaxfkg",
      "json_metadata": "{}"
    }
  ]
}
ety001.testpublished a new post: test-pr3944
2025/03/26 10:48:42
parent author
parent permlinktest
authorety001.test
permlinktest-pr3944
titletest pr3944
bodyP5KYenvsW67XCmtbxfnSuhS2WcDhAFbmUNst87KJak6XihnNyqCP
json metadata{}
Transaction InfoBlock #94151430/Trx ac41d5b132fe546d2b26e110dcb4d645d4aed304
View Raw JSON Data
{
  "trx_id": "ac41d5b132fe546d2b26e110dcb4d645d4aed304",
  "block": 94151430,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T10:48:42",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-pr3944",
      "title": "test pr3944",
      "body": "P5KYenvsW67XCmtbxfnSuhS2WcDhAFbmUNst87KJak6XihnNyqCP",
      "json_metadata": "{}"
    }
  ]
}
ety001.testcustom json: notify
2025/03/26 09:46:27
required auths[]
required posting auths["ety001.test"]
idnotify
json["setLastRead",{"date":"2025-03-26T09:46:26"}]
Transaction InfoBlock #94150187/Trx 25de61ff6f64beefb0d3f212d1d467c97bd9b0ed
View Raw JSON Data
{
  "trx_id": "25de61ff6f64beefb0d3f212d1d467c97bd9b0ed",
  "block": 94150187,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2025-03-26T09:46:27",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "ety001.test"
      ],
      "id": "notify",
      "json": "[\"setLastRead\",{\"date\":\"2025-03-26T09:46:26\"}]"
    }
  ]
}
ety001.testreceived 0.001 STEEM from power down installment (0.001 SP)
2024/11/13 18:04:30
from accountety001.test
to accountety001.test
withdrawn1.698637 VESTS
deposited0.001 STEEM
Transaction InfoBlock #90339236/Virtual Operation #2
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 90339236,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 2,
  "timestamp": "2024-11-13T18:04:30",
  "op": [
    "fill_vesting_withdraw",
    {
      "from_account": "ety001.test",
      "to_account": "ety001.test",
      "withdrawn": "1.698637 VESTS",
      "deposited": "0.001 STEEM"
    }
  ]
}
ety001.testreceived 0.001 STEEM from power down installment (0.001 SP)
2024/11/06 18:04:30
from accountety001.test
to accountety001.test
withdrawn1.698639 VESTS
deposited0.001 STEEM
Transaction InfoBlock #90138479/Virtual Operation #2
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 90138479,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 2,
  "timestamp": "2024-11-06T18:04:30",
  "op": [
    "fill_vesting_withdraw",
    {
      "from_account": "ety001.test",
      "to_account": "ety001.test",
      "withdrawn": "1.698639 VESTS",
      "deposited": "0.001 STEEM"
    }
  ]
}
ety001.testreceived 0.001 STEEM from power down installment (0.001 SP)
2024/10/30 18:04:30
from accountety001.test
to accountety001.test
withdrawn1.698639 VESTS
deposited0.001 STEEM
Transaction InfoBlock #89937397/Virtual Operation #2
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 89937397,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 2,
  "timestamp": "2024-10-30T18:04:30",
  "op": [
    "fill_vesting_withdraw",
    {
      "from_account": "ety001.test",
      "to_account": "ety001.test",
      "withdrawn": "1.698639 VESTS",
      "deposited": "0.001 STEEM"
    }
  ]
}
ety001.testreceived 0.001 STEEM from power down installment (0.001 SP)
2024/10/23 18:04:30
from accountety001.test
to accountety001.test
withdrawn1.698639 VESTS
deposited0.001 STEEM
Transaction InfoBlock #89736321/Virtual Operation #2
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 89736321,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 2,
  "timestamp": "2024-10-23T18:04:30",
  "op": [
    "fill_vesting_withdraw",
    {
      "from_account": "ety001.test",
      "to_account": "ety001.test",
      "withdrawn": "1.698639 VESTS",
      "deposited": "0.001 STEEM"
    }
  ]
}
ety001.testblockchain operation: fill transfer from savings
2024/10/19 18:05:30
fromety001.test
toety001.test
amount0.001 STEEM
request id1729101881
memo
Transaction InfoBlock #89621912/Virtual Operation #2
View Raw JSON Data
{
  "trx_id": "0000000000000000000000000000000000000000",
  "block": 89621912,
  "trx_in_block": 4294967295,
  "op_in_trx": 0,
  "virtual_op": 2,
  "timestamp": "2024-10-19T18:05:30",
  "op": [
    "fill_transfer_from_savings",
    {
      "from": "ety001.test",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "request_id": 1729101881,
      "memo": ""
    }
  ]
}
ety001.testblockchain operation: transfer from savings
2024/10/16 18:05:30
fromety001.test
request id1729101881
toety001.test
amount0.001 STEEM
memo
Transaction InfoBlock #89535713/Trx 9e68414da29cdb52511699ae584ce6f85690a7f5
View Raw JSON Data
{
  "trx_id": "9e68414da29cdb52511699ae584ce6f85690a7f5",
  "block": 89535713,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-10-16T18:05:30",
  "op": [
    "transfer_from_savings",
    {
      "from": "ety001.test",
      "request_id": 1729101881,
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.testpowered up 0.001 STEEM to @ety001.test
2024/10/16 18:05:06
fromety001.test
toety001.test
amount0.001 STEEM
Transaction InfoBlock #89535705/Trx 76dda1eda47fbb76d4e5018e1709000aa45bc258
View Raw JSON Data
{
  "trx_id": "76dda1eda47fbb76d4e5018e1709000aa45bc258",
  "block": 89535705,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-10-16T18:05:06",
  "op": [
    "transfer_to_vesting",
    {
      "from": "ety001.test",
      "to": "ety001.test",
      "amount": "0.001 STEEM"
    }
  ]
}
ety001.testblockchain operation: transfer to savings
2024/10/16 18:04:51
fromety001.test
toety001.test
amount0.001 STEEM
memo
Transaction InfoBlock #89535700/Trx 62c6c80c9ceec986243845338200b384a4108f34
View Raw JSON Data
{
  "trx_id": "62c6c80c9ceec986243845338200b384a4108f34",
  "block": 89535700,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-10-16T18:04:51",
  "op": [
    "transfer_to_savings",
    {
      "from": "ety001.test",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": ""
    }
  ]
}
ety001.teststarted power down of 0.004 SP
2024/10/16 18:04:30
accountety001.test
vesting shares6.794554 VESTS
Transaction InfoBlock #89535693/Trx 020e26263badc93d21466ef2ae2735d8f6cde439
View Raw JSON Data
{
  "trx_id": "020e26263badc93d21466ef2ae2735d8f6cde439",
  "block": 89535693,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-10-16T18:04:30",
  "op": [
    "withdraw_vesting",
    {
      "account": "ety001.test",
      "vesting_shares": "6.794554 VESTS"
    }
  ]
}
ety001.testsent 0.001 STEEM to @ety001- "test"
2024/10/16 18:02:48
fromety001.test
toety001
amount0.001 STEEM
memotest
Transaction InfoBlock #89535659/Trx b3f423ea6bb992cebcee322728cfc152d7c2d991
View Raw JSON Data
{
  "trx_id": "b3f423ea6bb992cebcee322728cfc152d7c2d991",
  "block": 89535659,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-10-16T18:02:48",
  "op": [
    "transfer",
    {
      "from": "ety001.test",
      "to": "ety001",
      "amount": "0.001 STEEM",
      "memo": "test"
    }
  ]
}
2024/07/12 06:33:18
voterbluesniper
authorety001.test
permlink14rmq-test-for-posting
weight10000 (100.00%)
Transaction InfoBlock #86768634/Trx 0d0bb97ab825fa0ea9ae5813186b7a1dcfd86604
View Raw JSON Data
{
  "trx_id": "0d0bb97ab825fa0ea9ae5813186b7a1dcfd86604",
  "block": 86768634,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-07-12T06:33:18",
  "op": [
    "vote",
    {
      "voter": "bluesniper",
      "author": "ety001.test",
      "permlink": "14rmq-test-for-posting",
      "weight": 10000
    }
  ]
}
ety001.testpublished a new post: 14rmq-test-for-posting
2024/07/12 06:27:36
parent author
parent permlinktest
authorety001.test
permlink14rmq-test-for-posting
titletest for posting
bodytester
json metadata{"tags":["test"],"app":"steemit/0.2","format":"markdown"}
Transaction InfoBlock #86768522/Trx 25ef1db09bd0671bd3ca56765c01aba7bebcb195
View Raw JSON Data
{
  "trx_id": "25ef1db09bd0671bd3ca56765c01aba7bebcb195",
  "block": 86768522,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-07-12T06:27:36",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "14rmq-test-for-posting",
      "title": "test for posting",
      "body": "tester",
      "json_metadata": "{\"tags\":[\"test\"],\"app\":\"steemit/0.2\",\"format\":\"markdown\"}"
    }
  ]
}
ety001.testcustom json: notify
2024/06/18 22:19:36
required auths[]
required posting auths["ety001.test"]
idnotify
json["setLastRead",{"date":"2024-06-18T22:20:37"}]
Transaction InfoBlock #86098878/Trx 20833e80a1eb94856469332019dbe830adb5a4cf
View Raw JSON Data
{
  "trx_id": "20833e80a1eb94856469332019dbe830adb5a4cf",
  "block": 86098878,
  "trx_in_block": 7,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-06-18T22:19:36",
  "op": [
    "custom_json",
    {
      "required_auths": [],
      "required_posting_auths": [
        "ety001.test"
      ],
      "id": "notify",
      "json": "[\"setLastRead\",{\"date\":\"2024-06-18T22:20:37\"}]"
    }
  ]
}
bluesnipersent 0.010 STEEM to @ety001.test- "Hello. Good to see you on Steem. To maximize your rewards, publish your post also on Hive ( hive.blog ) and Blurt ( blurt.blog ) blockchains. Use upvu, jsup or ctime and get instant upvotes"
2024/06/10 08:29:30
frombluesniper
toety001.test
amount0.010 STEEM
memoHello. Good to see you on Steem. To maximize your rewards, publish your post also on Hive ( hive.blog ) and Blurt ( blurt.blog ) blockchains. Use upvu, jsup or ctime and get instant upvotes
Transaction InfoBlock #85852811/Trx 9f63c144796c3d59c87d3e9bcd3eab37494f87db
View Raw JSON Data
{
  "trx_id": "9f63c144796c3d59c87d3e9bcd3eab37494f87db",
  "block": 85852811,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-06-10T08:29:30",
  "op": [
    "transfer",
    {
      "from": "bluesniper",
      "to": "ety001.test",
      "amount": "0.010 STEEM",
      "memo": "Hello. Good to see you on Steem. To maximize your rewards, publish your post also on Hive ( hive.blog ) and Blurt ( blurt.blog ) blockchains. Use upvu, jsup or ctime and get instant upvotes"
    }
  ]
}
2024/06/10 08:29:09
voterbluesniper
authorety001.test
permlinkthe-first-test-post
weight10000 (100.00%)
Transaction InfoBlock #85852804/Trx 673bb9799e86d16c82141456f76827f32dad2118
View Raw JSON Data
{
  "trx_id": "673bb9799e86d16c82141456f76827f32dad2118",
  "block": 85852804,
  "trx_in_block": 5,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-06-10T08:29:09",
  "op": [
    "vote",
    {
      "voter": "bluesniper",
      "author": "ety001.test",
      "permlink": "the-first-test-post",
      "weight": 10000
    }
  ]
}
ety001.testpublished a new post: the-first-test-post
2024/06/10 08:24:00
parent author
parent permlinksteem
authorety001.test
permlinkthe-first-test-post
titletitle: <img src="x" onerror=alert(1)>
bodybody: <img src="x" onerror=alert(2)>
json metadata{"tags":["test"]}
Transaction InfoBlock #85852701/Trx 1e2ba6d109be5bd33b4da49193d52d2b620f16e9
View Raw JSON Data
{
  "trx_id": "1e2ba6d109be5bd33b4da49193d52d2b620f16e9",
  "block": 85852701,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2024-06-10T08:24:00",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "steem",
      "author": "ety001.test",
      "permlink": "the-first-test-post",
      "title": "title: <img src=\"x\" onerror=alert(1)>",
      "body": "body: <img src=\"x\" onerror=alert(2)>",
      "json_metadata": "{\"tags\":[\"test\"]}"
    }
  ]
}
ety001delegated 0.000 SP to @ety001.test
2023/09/23 19:28:18
delegatorety001
delegateeety001.test
vesting shares0.000000 VESTS
Transaction InfoBlock #78402442/Trx 862cc8417b9da8faf340fa29cdef05f039d3b888
View Raw JSON Data
{
  "trx_id": "862cc8417b9da8faf340fa29cdef05f039d3b888",
  "block": 78402442,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-09-23T19:28:18",
  "op": [
    "delegate_vesting_shares",
    {
      "delegator": "ety001",
      "delegatee": "ety001.test",
      "vesting_shares": "0.000000 VESTS"
    }
  ]
}
alexmove.witnesssent 0.001 STEEM to @ety001.test- "Please support me @alexmove.witness as witness on site https://steemitwallet.com/~witnesses. I send daily Witness vote STEEM reward and developing a learning project SelfDevelopment Club. Your vote is..."
2023/04/16 09:20:06
fromalexmove.witness
toety001.test
amount0.001 STEEM
memoPlease support me @alexmove.witness as witness on site https://steemitwallet.com/~witnesses. I send daily Witness vote STEEM reward and developing a learning project SelfDevelopment Club. Your vote is very important to me, ety001.test! Good luck! 20230416
Transaction InfoBlock #73808407/Trx b675681aa801ce0226251b48af161b14d833a6b5
View Raw JSON Data
{
  "trx_id": "b675681aa801ce0226251b48af161b14d833a6b5",
  "block": 73808407,
  "trx_in_block": 1,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-04-16T09:20:06",
  "op": [
    "transfer",
    {
      "from": "alexmove.witness",
      "to": "ety001.test",
      "amount": "0.001 STEEM",
      "memo": "Please support me @alexmove.witness as witness on site https://steemitwallet.com/~witnesses. I send daily Witness vote STEEM reward and developing a learning project SelfDevelopment Club. Your vote is very important to me, ety001.test! Good luck! 20230416"
    }
  ]
}
ety001.testpublished a new post: test-from-go-sdk
2023/04/16 09:02:06
parent author
parent permlinktest
authorety001.test
permlinktest-from-go-sdk
titletest from go sdk
bodytest from go sdk content
json metadata
Transaction InfoBlock #73808049/Trx 07efe115a4b9250e3b11bf1a09bffddf53e8cef0
View Raw JSON Data
{
  "trx_id": "07efe115a4b9250e3b11bf1a09bffddf53e8cef0",
  "block": 73808049,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2023-04-16T09:02:06",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-from-go-sdk",
      "title": "test from go sdk",
      "body": "test from go sdk content",
      "json_metadata": ""
    }
  ]
}
ety001.testupdated options for test-svg
2022/05/20 05:57:45
authorety001.test
permlinktest-svg
max accepted payout1000000.000 SBD
percent steem dollars0
allow votestrue
allow curation rewardstrue
extensions[]
Transaction InfoBlock #64325952/Trx ddc21f24664e091902ba864e0569d8d58de2e79d
View Raw JSON Data
{
  "trx_id": "ddc21f24664e091902ba864e0569d8d58de2e79d",
  "block": 64325952,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-05-20T05:57:45",
  "op": [
    "comment_options",
    {
      "author": "ety001.test",
      "permlink": "test-svg",
      "max_accepted_payout": "1000000.000 SBD",
      "percent_steem_dollars": 0,
      "allow_votes": true,
      "allow_curation_rewards": true,
      "extensions": []
    }
  ]
}
ety001.testpublished a new post: test-svg
2022/05/20 05:57:45
parent author
parent permlinktest
authorety001.test
permlinktest-svg
titletest svg
body![test_svg](https://mmbiz.qlogo.cn/mmbiz_svg/k947icPboBqD0orBQhziaEGTiaNwWvkJ9Nh6CUgfHcdsVY44zIqnxyicY3NWOZTn1ZoREr8ZpwScMrexuHicnkxQyTrfztWPib4APF/0?wx_fmt=svg)
json metadata{"tags":["test"],"image":["https://mmbiz.qlogo.cn/mmbiz_svg/k947icPboBqD0orBQhziaEGTiaNwWvkJ9Nh6CUgfHcdsVY44zIqnxyicY3NWOZTn1ZoREr8ZpwScMrexuHicnkxQyTrfztWPib4APF/0?wx_fmt=svg"],"app":"steemit/0.2","format":"markdown"}
Transaction InfoBlock #64325952/Trx ddc21f24664e091902ba864e0569d8d58de2e79d
View Raw JSON Data
{
  "trx_id": "ddc21f24664e091902ba864e0569d8d58de2e79d",
  "block": 64325952,
  "trx_in_block": 0,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-05-20T05:57:45",
  "op": [
    "comment",
    {
      "parent_author": "",
      "parent_permlink": "test",
      "author": "ety001.test",
      "permlink": "test-svg",
      "title": "test svg",
      "body": "![test_svg](https://mmbiz.qlogo.cn/mmbiz_svg/k947icPboBqD0orBQhziaEGTiaNwWvkJ9Nh6CUgfHcdsVY44zIqnxyicY3NWOZTn1ZoREr8ZpwScMrexuHicnkxQyTrfztWPib4APF/0?wx_fmt=svg)",
      "json_metadata": "{\"tags\":[\"test\"],\"image\":[\"https://mmbiz.qlogo.cn/mmbiz_svg/k947icPboBqD0orBQhziaEGTiaNwWvkJ9Nh6CUgfHcdsVY44zIqnxyicY3NWOZTn1ZoREr8ZpwScMrexuHicnkxQyTrfztWPib4APF/0?wx_fmt=svg\"],\"app\":\"steemit/0.2\",\"format\":\"markdown\"}"
    }
  ]
}
ety001.testblockchain operation: escrow release
2022/05/15 14:58:33
fromety001.test
toety001
agentliuye
whoety001.test
receiverety001
escrow id1
sbd amount0.000 SBD
steem amount0.001 STEEM
Transaction InfoBlock #64193232/Trx 592ee8515d364b7e6cc1b34d7b10e1af63d03a43
View Raw JSON Data
{
  "trx_id": "592ee8515d364b7e6cc1b34d7b10e1af63d03a43",
  "block": 64193232,
  "trx_in_block": 4,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-05-15T14:58:33",
  "op": [
    "escrow_release",
    {
      "from": "ety001.test",
      "to": "ety001",
      "agent": "liuye",
      "who": "ety001.test",
      "receiver": "ety001",
      "escrow_id": 1,
      "sbd_amount": "0.000 SBD",
      "steem_amount": "0.001 STEEM"
    }
  ]
}
ety001.testblockchain operation: escrow approve
2022/05/15 14:50:06
fromety001.test
toety001
agentliuye
whoety001
escrow id1
approvetrue
Transaction InfoBlock #64193064/Trx e58d5265302ebb4c70f2daa87d012ddf94975dc2
View Raw JSON Data
{
  "trx_id": "e58d5265302ebb4c70f2daa87d012ddf94975dc2",
  "block": 64193064,
  "trx_in_block": 2,
  "op_in_trx": 0,
  "virtual_op": 0,
  "timestamp": "2022-05-15T14:50:06",
  "op": [
    "escrow_approve",
    {
      "from": "ety001.test",
      "to": "ety001",
      "agent": "liuye",
      "who": "ety001",
      "escrow_id": 1,
      "approve": true
    }
  ]
}

Account Metadata

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

Auth Keys

Owner
Single Signature
Public Keys
STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB1/1
Active
Single Signature
Public Keys
STM7g7LEae1deMa4hH28UKuxHhqCUrnXYZy1k5nGZfzqpCX1xWDaE1/1
Posting
Single Signature
Public Keys
STM8XNpCMGTAwWCKZXx4ShHG6SUdNMdcLpgXVz9oA8UYkEiPx212X1/1
Memo
STM7BoijbnbVt5EsF4zVGvHcwwR18se9fV5mtBadgawAwjEX6vDcT
{
  "owner": {
    "account_auths": [],
    "key_auths": [
      [
        "STM54Gj1SV7fqekT8qJzryihFAL8QHRTvNgz76f4oJ7d1vzh2N3PB",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "active": {
    "account_auths": [],
    "key_auths": [
      [
        "STM7g7LEae1deMa4hH28UKuxHhqCUrnXYZy1k5nGZfzqpCX1xWDaE",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "posting": {
    "account_auths": [],
    "key_auths": [
      [
        "STM8XNpCMGTAwWCKZXx4ShHG6SUdNMdcLpgXVz9oA8UYkEiPx212X",
        1
      ]
    ],
    "weight_threshold": 1
  },
  "memo": "STM7BoijbnbVt5EsF4zVGvHcwwR18se9fV5mtBadgawAwjEX6vDcT"
}

Witness Votes

0 / 30
No active witness votes (Proxied to @ety001).
[]