Wie berechnet man Felder mit variabler Länge?

Einige Teile von bitcoin tx Ex: Script haben eine variable Länge var_int . Kann jemand erklären, wie man seinen Wert aus dieser var_int- Tabelle berechnet.

Bsp.: Im folgenden TX ist der fettgedruckte Teil in Skriptlänge. seine Länge soll 349 Byte betragen. Wenn ich fd5d01direkt in Dezimalzahlen umwandle, ist der Wert 16604417. Ich glaube, ich habe die var_int- Tabelle nicht richtig verstanden.

01000000013dcd7d87904c9cb7f4b79f36b5a03f96e2e729284c09856238d5353e1182b00200000000 fd5d01004730440220762ce7bca626942975bfd5b130ed3470b9f538eb2ac120c2043b445709369628022051d73c80328b543f744aa64b7e9ebefa7ade3e5c716eab4a09b408d2c307ccd701483045022100abf740b58d79cab000f8b0d328c2fff7eb88933971d1b63f8b99e89ca3f2dae602203354770db3cc2623349c87dea7a50cee1f78753141a5052b2d58aeb592bcf50f014cc9524104a882d414e478039cd5b52a92ffb13dd5e6bd4515497439dffd691a0f12af9575fa349b5694ed3155b136f09e63975a1700c9f4d4df849323dac06cf3bd6458cd41046ce31db9bdd543e72fe3039a1f1c047dab87037c36a669ff90e28da1848f640de68c2fe913d363a51154a0c62d7adea1b822d05035077418267b1a1379790187410411ffd36c70776538d079fbae117dc38effafb33304af83ce4894589747aee1ef992f63280567f52f5ba870678b4ab4ff6c8ea600bd217870a8b4f1f09f3a8e8353aeffffffff0130d90000000000001976a914569076ba39fc4ff6a2291d9ea9196d8c08f9c7ab88ac00000000

Kann mir jemand die Regeln aus dieser Tabelle erklären?

Antworten (1)

es ist viel einfacher, lass einfach das "fd" weg. Hier ist die Erklärung von den Webseiten der Bitcoin-Entwickler.

Angenommen, Sie haben den Wert in einem Array (tx_array) und einen Zeiger auf das Array (tx_array_ptr), hier ist ein (unixoides Shell-Skript) Codebeispiel:

# var_int is defined as:
# value         size Format
# < 0xfd        1    uint8_t
# <= 0xffff     3    0xfd + uint16_t
# <= 0xffffffff 5    0xfe + uint32_t
# -             9    0xff + uint64_t 
# if value <= 0xfd, Bytes  = 1
# if value =  0xfd, Bytes  = 2
# if value =  0xfe, Bytes  = 4
# if value =  0xff, Bytes  = 8
  var_int=${tx_array[$tx_array_ptr]}
  if [ "$var_int" == "FD" ] ; then
    tx_array_ptr=$(( $tx_array_ptr + 1 ))
    tx_array_bytes=2
    var_int=$( get_TX_section )
  elif [ "$var_int" == "FE" ] ; then
    tx_array_ptr=$(( $tx_array_ptr + 1 ))
    tx_array_bytes=4
    var_int=$( get_TX_section )
  elif [ "$var_int" == "FF" ] ; then
    tx_array_ptr=$(( $tx_array_ptr + 1 ))
    tx_array_bytes=8
  else
    var_int=${tx_array[$tx_array_ptr]}
  fi

Wenn Sie Ihre var_int haben, vergessen Sie nicht, die Hex-Werte umzukehren (Big-Endian-Konvertierung)! Dann kannst du den Wert zB an deinen Dezimalkonverter schicken, also bekommst du für deinen Wert (fd5d01):

  1. lass das "fd" weg
  2. nehmen Sie die nächsten zwei Bytes "5d01"
  3. Big-Endian-Konvertierung "015d"
  4. in dezimal umwandeln:

Verwendung von "bc", um den Wert in Dezimalzahlen umzuwandeln:

$ echo "ibase=16;015D" | bc
349