TRON Witness List: An October 29 Mainnet Data Audit

Written by

in

A TRON witness list contains registered candidate records; it is not a list of independent people or an investment ranking. Read the explicit isJobs flag for the active producer set, preserve the response date and keep vote totals separate from voter counts. Our October 29 Mainnet snapshot contained 446 unique candidate addresses and 27 records explicitly marked active.

This dated data review shows how to audit a saved witness response with tested offline Python. It reports the denominator behind each calculation and distinguishes absent JSON fields from explicit values. The Tronscan News homepage collects our independent explorer coverage. No vote was cast, reward withdrawn or account changed for this article.

TRON witness roster audit with 446 unique candidate addresses and 27 explicit active flags
Original Tronscan News data worksheet from the dated snapshot; not a live dashboard.

1. Choose the witness source and preserve its scope

The official ListWitnesses reference describes the candidate list and the active-set flag. Its example base URL is Shasta testnet. We used the corresponding Mainnet provider route, https://api.trongrid.io/wallet/listwitnesses, and retained the actual response rather than presenting a documentation example as live data.

The collection began at 04:16:00.078323 UTC and ended at 04:16:00.319213 UTC on October 29, 2026. HTTP status was 200, and the body contained a nonempty witnesses list. The response was one latest-view observation from one public provider. It did not supply an independent consensus audit or a historical series.

  1. Select the intended network and documented endpoint.
  2. Save the complete response with request start and finish times.
  3. Confirm that the body contains candidate records rather than an Error object.
  4. Validate addresses and detect duplicate rows before adding counts.
  5. Separate explicit active flags, absent fields and vote observations.
  6. Report only calculations supported by that saved input.

The latest-head versus solidified-state guide explains why a source’s view matters. This article reads the route named above; it does not substitute a solidified account query, a paginated current-vote interface or an explorer index without changing the label. Those sources can answer related questions under different timing and aggregation rules.

2. Inspect the dated witness snapshot

Our local audit found 446 rows and 446 distinct full hexadecimal addresses. Exactly 27 rows contained Boolean isJobs:true. Another 419 rows omitted that field, and none contained an explicit Boolean false. We preserve that raw JSON distinction in the audit output instead of rewriting the original file.

The official consensus documentation explains the active SR set and maintenance-driven changes. A snapshot is therefore a dated observation, not a promise about tomorrow’s producers. We did not infer a universal maintenance interval from this one response or measure a transition between sets.

Audit measure October 29 result Denominator or scope
Candidate rows 446 Entire returned list
Unique addresses 446 Normalized complete hex addresses
Explicit isJobs true 27 Boolean fields actually present
Explicit isJobs false 0 Not a count of all inactive candidates
Absent isJobs 419 Raw field presence, retained separately
Rows with voteCount 406 Explicit nonnegative integer values
Rows without voteCount 40 No invented numeric value

Protocol JSON serializers can omit default-valued scalar fields. The audit deliberately reports presence as well as values so readers can inspect what the service actually emitted. An omitted flag should not be described as a failed node request or an unexpected outage. It also should not be rewritten as an explicit false in an evidence transcript.

The same approach applies to voteCount. We do not claim that the 40 absent values are 40 lost votes or 40 unknown voters. They are 40 candidate records without that JSON field. The program computes a sum over the 406 explicitly reported values and names that denominator in its result.

Witness response field-presence worksheet: 406 vote counts, 40 absent vote counts and 419 absent active flags
Original Tronscan News data worksheet from the dated snapshot; not a live dashboard.

3. Calculate the reported-vote denominator

The explicit voteCount values summed to 43,602,034,298. The three largest reported values summed to 10,836,569,507. Dividing that three-row subtotal by the explicit-value total produced 24.8534%, rounded to four decimal places using Decimal arithmetic. This is a share of the reported candidate-vote tally, not a share of all TRX or a count of unique voters.

Full candidate address Reported voteCount Explicit active flag
4162398d516b555ac64af24416e05c199c01823048 4,210,707,146 true
414cdd560ded17f30e2c2d5422669cc86a14c8c3ba 3,709,097,663 true
41c05142fd1ca1e03688a43585096866ae658f2cb2 2,916,764,698 true

We identify the rows by their complete addresses, not by assuming that a URL label proves an organization’s ownership. A candidate record can include a website string, but this article did not authenticate the site’s operator or establish who controls the associated account. The names are unnecessary for reproducing the arithmetic.

The first row in the returned response was not the highest-vote row. Our program explicitly sorts known values in descending numeric order and uses the normalized address only as a deterministic tie-breaker for presentation. That tie-breaker is our local reporting rule; it is not a claim about the network’s consensus scheduling algorithm.

Votes are not addresses. A candidate can receive allocations from multiple accounts, and a voter can allocate voting weight across candidates. A candidate-vote sum alone cannot reveal the number of distinct people, beneficial owners or independent organizations involved. No ownership-concentration or governance-control conclusion follows from the calculated percentage.

4. Run the offline witness audit

Save the complete response as witnesses.json and the following program as audit_witnesses.py. Run python audit_witnesses.py witnesses.json. The program reads that local file, validates selected fields, calculates a reported-value subtotal and prints a JSON report. It does not contact a node or ask for wallet access.

The address validator expects the hexadecimal format used in this observation: the 41 network prefix followed by 40 hexadecimal characters. If you deliberately request Base58-formatted addresses, this version rejects them. Convert through an independently verified method or adapt the validator with appropriate tests; do not remove validation merely to suppress an error.

import json
import re
import sys
from decimal import Decimal, localcontext


def count(value, name):
    if type(value) is not int or not 0 <= value <= 9223372036854775807:
        raise ValueError(name + ' must be a nonnegative int64 integer')
    return value


def audit_witnesses(payload):
    if not isinstance(payload, dict) or 'Error' in payload:
        raise ValueError('usable witness response required')
    rows = payload.get('witnesses')
    if not isinstance(rows, list) or not rows:
        raise ValueError('nonempty witnesses list required')
    seen, records = set(), []
    flags = {'true': 0, 'false': 0, 'absent': 0}
    for row in rows:
        if not isinstance(row, dict):
            raise ValueError('each row must be an object')
        address = row.get('address')
        if not isinstance(address, str) or not re.fullmatch(r'41[0-9a-fA-F]{40}', address):
            raise ValueError('hex-format TRON address required')
        address = address.lower()
        if address in seen:
            raise ValueError('duplicate address')
        seen.add(address)
        if 'isJobs' not in row:
            flags['absent'] += 1
        elif type(row['isJobs']) is not bool:
            raise ValueError('isJobs must be Boolean when present')
        else:
            flags['true' if row['isJobs'] else 'false'] += 1
        votes = count(row['voteCount'], 'voteCount') if 'voteCount' in row else None
        records.append({'address': address, 'votes': votes,
                        'explicit_active': row.get('isJobs') is True})
    known = [row for row in records if row['votes'] is not None]
    ordered = sorted(known, key=lambda row: (-row['votes'], row['address']))
    total = sum(row['votes'] for row in known)
    top3 = sum(row['votes'] for row in ordered[:3])
    with localcontext() as context:
        context.prec = 50
        share = str((Decimal(top3) * 100 / Decimal(total)).quantize(Decimal('0.0001'))) if total else None
    return {'row_count': len(rows), 'unique_addresses': len(seen),
            'isJobs_presence': flags, 'known_vote_rows': len(known),
            'missing_vote_rows': len(rows) - len(known),
            'reported_vote_sum': total, 'top3_reported_vote_sum': top3,
            'top3_share_of_reported_votes_percent': share,
            'top3': ordered[:3],
            'scope': 'One supplied roster; no voter identity, independence, yield or uptime conclusion'}


if __name__ == '__main__':
    if len(sys.argv) != 2:
        raise SystemExit('Usage: audit_witnesses.py witnesses.json')
    with open(sys.argv[1], encoding='utf-8') as source:
        payload = json.load(source)
    print(json.dumps(audit_witnesses(payload), indent=2))

The program rejects duplicate full addresses because blindly counting repeated rows can inflate a list total. It rejects negative, Boolean and string vote counters instead of converting them into apparently valid integers. A Boolean is treated separately even though Python’s type hierarchy otherwise permits it in some integer operations.

When no reported votes contribute to the denominator, the percentage is null. That differs from a known nonzero total with a zero subtotal. It also differs from a failed API response, which is rejected before arithmetic. These explicit branches prevent a dashboard from converting unavailable information into a confident-looking zero-percent result.

5. Reproduce the data-quality tests

We ran 17 local tests. Four check the retained response’s row count, explicit active count, absent-flag count and uniqueness. Other tests use controlled synthetic inputs to exercise zero denominators, missing values, invalid fields and duplicates. The program also produced identical output when the real input row order was reversed.

Local test Expected result Interpretation
Real saved list 446 unique rows, 27 explicit true Reproduce this observation
Explicit voteCount zero Accepted integer zero Known value
Missing voteCount Counted as absent No invented tally
Zero reported denominator Percentage null No division by zero
Duplicate address Rejected No double counting
Negative, Boolean or string votes Rejected No silent type coercion
String isJobs or malformed address Rejected Source-format issue remains visible
Empty, missing or Error response Rejected Not an empty network
Reversed real rows Identical report Presentation does not depend on response order

The synthetic one-row fixtures use invented addresses and values only to test branches. They are not real candidate registrations, votes or withdrawals. The test suite did not benchmark a production node or send malformed requests to the public service.

For a quick independent check, add the three displayed vote counts by hand or in a local calculator. Their sum must be 10,836,569,507. Divide by 43,602,034,298, multiply by 100 and round only the final result. A denominator taken from the active 27 alone would answer a different question and must have a different label.

Dated witness arithmetic: top three reported votes are 24.8534 percent of the reported-value total
Original Tronscan News data worksheet from the dated snapshot; not a live dashboard.

6. Avoid unsupported performance and reward claims

A large voteCount does not measure response latency, missed blocks during the last hour or an individual voter’s reward. The response also includes cumulative production-related fields for some records, but we did not calculate a recent uptime rate from them. A cumulative counter needs an observation interval and a suitable denominator before it can support a period-specific statement.

The block-record reading guide helps inspect a particular produced block. One block can establish a dated record; it does not establish a candidate’s reliability over an unspecified period. Our witness audit does not independently validate every producer signature or reconstruct the full block-production schedule.

If your question concerns one account’s allocation, use the complete vote-allocation reading guide. A candidate-wide vote tally is different from one account’s submitted list, and a new complete allocation replaces its earlier list. Preserve account-state timing and the maintenance snapshot before comparing those two records.

We make no ranking recommendation, projected yield or claim that the top three rows belong to independent operators. Such conclusions need evidence beyond a candidate address and aggregate count. The useful result here is narrower: a reproducible audit of one returned roster and clearly defined arithmetic.

7. Prepare a comparison that can support a later change claim

Before collecting another snapshot, define the question. A change in active-set membership, a change in voteCount and a change in the number of returned candidates are different measurements. Keep the same network, endpoint family, field rules and complete-list scope for each comparison. Record any intentional change in provider or formatting.

Match candidate rows by normalized complete address. Do not match by array position or website label. The local sort can move a row when a vote value changes, while the account identity remains the same. Preserve newly present, no-longer-present and unchanged addresses as separate outcomes instead of filling every absent row with a zero.

For vote deltas, require comparable numeric values in both snapshots. If a field is absent in one input, report that state explicitly and avoid silently calculating a difference against an invented zero. If your application adopts protobuf default-value semantics for a particular field, document that transformation separately from the raw-response audit shown here.

For active-set changes, compare the explicit true-address sets and retain the request windows. Two reads on opposite sides of a maintenance update can legitimately describe different sets. This article collected only one roster, so it does not claim that a specific candidate entered or left the active set today.

A failed collection is not a zero-candidate observation. Keep the last completed snapshot under its original timestamp, record the failed attempt separately and resume within normal service access conditions. Do not replace the unavailable result with another network’s roster to keep a chart continuous.

The practical success criterion is an audit another reader can reproduce from the same file: identical unique-address counts, field-presence counts, reported-vote sums and sorted top rows. A precise date and denominator make that output useful without overstating what it says about ownership, performance or future governance.

Original witness audit checklist for unique addresses, missing fields and 17 local validation tests
Original Tronscan News data worksheet from the dated snapshot; not a live dashboard.

8. Reconcile the audit before sharing a chart

Use two simple count identities to check the output. For the flag audit, 27 explicit true plus 0 explicit false plus 419 absent equals the full 446-row list. For vote-field coverage, 406 present values plus 40 absent values also equals 446. These identities check that every returned record reached exactly one branch of each classification. They do not prove that the provider returned every candidate that exists on the network.

Next compare row count with unique-address count. Both were 446 in the retained witness response. If a future collection contains duplicate addresses, the supplied program stops before reporting a vote sum. That is deliberate: deduplicating by silently taking the last row could hide conflicting counters. Preserve both rows and their positions, then investigate why the source or collection process repeated the identity.

Check the reported-vote subtotal independently of any website labels. The three-row table can be reconciled directly to the JSON output by complete address. A shortened first-and-last-character label is convenient in a chart, but the accompanying evidence should retain the full address. Otherwise a reader cannot reliably distinguish a copy error from a different candidate.

Keep the units on every exported number. The row count counts records. The unique-address count counts distinct candidate addresses. The vote sum adds reported voting-weight values. The percentage divides one vote subtotal by another. None of these units is interchangeable with TRX transferred, active wallets, people or dollars. A chart title should state the actual unit and snapshot date before suggesting a comparison.

Finally, distinguish a value that changed from a value that was reformatted. Adding commas to 43602034298 does not change the underlying integer. Rounding 24.8534 percent to 24.85 percent changes display precision, not the numerator or denominator. Keep the unrounded source integers so a later reader can apply a different display precision without reconstructing the data from a screenshot.

A defensible short caption for this observation is: “October 29, 2026, one Mainnet ListWitnesses response; 446 unique returned candidate addresses, 27 explicit active flags; top three reported vote values total 24.8534% of the explicit vote-value sum.” Its limits remain visible even when the full method appears elsewhere on the page.

Frequently asked questions

Does a witness list contain only the 27 active SRs?

No. The endpoint returns candidate records as well. Our saved response had 446 rows, with 27 explicitly marked isJobs true.

Is voteCount a number of unique voters?

No. It is a candidate vote tally. The response does not identify distinct people or establish independent ownership.

Can I treat a missing field as an explicit zero?

The raw audit keeps absence separate. Any default-value interpretation should be documented as a transformation, rather than rewriting the observed JSON.

Does the calculated top-three share predict rewards?

No. It describes a subtotal divided by the reported-vote sum in one saved list. It is not a yield estimate or recommendation.

Does this audit cast votes or change staking?

No. It reads a local response file and prints calculations. It has no signing, voting or withdrawal function.

Checked October 29, 2026 by the Tronscan News editorial team. AI assisted preparation; the original audit and 17 local tests were executed against retained public Mainnet data. Independent publication, not official TRONSCAN support. Send corrections through this page’s comments with the affected field and public source, excluding signing secrets.

Rate this post

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *