लेनदेन हेक्स स्ट्रिंग संपीड़ित करें

Sep 06 2020

मुझे एहसास हुआ कि लेनदेन हेक्स बहुत लंबा हो सकता है और आपको ब्लॉकस्ट्रीम.इन एपीआई का उपयोग करके एक टीएक्स प्रसारित करने के लिए इसकी आवश्यकता है:

https://blockstream.info/testnet/api/tx

https://github.com/Blockstream/esplora/blob/master/API.md

यदि उपयोगकर्ता पाठ संदेश का उपयोग करके इस हेक्स को भेजना चाहता है जो एक संदेश में 160 वर्णों की अनुमति देता है, तो इस समस्या को हल करने का सबसे अच्छा तरीका क्या होना चाहिए? मैंने इसे संपीड़ित करने के तरीके के बारे में शोध करने की कोशिश की, एक संख्या को भेजें जो कि PHP कोड को चलाने वाले वेब सर्वर के लिए आगे है, हेक्स स्ट्रिंग विघटित है और tx प्रसारण के लिए blockstream.info को भेजा गया है। Base64 एन्कोडिंग के बाद gzcompress()वर्णों की संख्या 160 से कम नहीं हो सकती है।

उदाहरण:

हेक्स:

02000000000101e939fb23e9991ebbc75fd08c736da32ca12d98a4ff1b8e970e97f5661927ee410100000000fdffffff02b0a90a000000000016001421e2f997b3bd36e273eaca365da8515a389444ae40420f0000000000160014829e2dbcf6b7f31bc93633971f71f6f6b9b5f89e0247304402200f8e3e573be749caf1964a85707bf540de2e7b367ae46c23bd4f21932ff82346022062dc3007072cd5a19b45e479525f4829bc48be4fd3c21b5a9ae34bcf9a3a3ccf0121020f88c7db36cbb492e80d3062fc19db55bed82687498f8cfe6d0cf47adf6687aa49f31b00

संकुचित और Base64 एन्कोडेड:

eNpdkNmJBEAIRFPyarsNxzP/ENZZGBZW9Eew6pVA8C0EbGObIG4zw47Ie6bg5WUtZ0pHKnsuMxiv7cLOHFU0ut2yCl+xqfktoAA3cPiz0R0hbBqzGxzF2nS5PZ31lL+Dx/mZiHgLCMH8v35kTRU5GncYI42V2S7Otu7W4syzBpLLIAK0Mec197kcfcXSB01lzS7cmCNQTb04etdUk5ZLhtCYZh6x6EdDqZIB9oSyjqOFnJZrh858oCLlRcsUJ2EcN2+WxTRn58wBJITN8/altV4ZIUb9oHi1J9EqzomuR/qW8s3LaS3Ikes1ult3sU9mgB8sW3Vy

जवाब

2 RedGrittyBrick Sep 06 2020 at 23:44

अधिक-या-कम यादृच्छिक संख्या को कम करना निरर्थक है। आपका सबसे अच्छा विकल्प बस अधिक कॉम्पैक्ट एन्कोडिंग का उपयोग करना है। बेस 64 हेक्स की तुलना में बेहतर है, लेकिन इसमें अन्य एनकोडिंग मौजूद हैं जो बेहतर रूप से बेहतर हैं

विकिपीडिया कई को सूचीबद्ध करता है और दक्षता के क्रम में उन्हें रैंक करता है

Encoding            Data type                    Efficiency
yEnc                Arbitrary, mostly non-text   ~98%
Ascii85             Arbitrary                     80%
Base85 (RFC 1924)   Arbitrary                     80%
Base64              Arbitrary                     75%
...

आप स्पष्ट रूप से बेहतर कर सकते हैं यदि आप 8-बिट्स का उपयोग करते हैं (जैसे यूनिकोड प्रिंट करने योग्य कोड पॉइंट्स जो कि यूटीएफ -8 में सिंगल बाइट एन्कोडिंग हैं) लेकिन चूंकि एसएमएस 7-बिट कैरेक्टर सेट (जहां तक ​​मुझे पता है) का उपयोग करता है तो आप ज्यादा कुछ नहीं करेंगे बेहतर

CodingEnthusiast Sep 07 2020 at 13:50

यदि उपयोगकर्ता पाठ संदेश का उपयोग करके इस हेक्स को भेजना चाहता है जो एक संदेश में 160 वर्णों की अनुमति देता है, तो इस समस्या को हल करने का सबसे अच्छा तरीका क्या होना चाहिए?

222 बाइट को 160 अक्षरों में बदलना बहुत चुनौतीपूर्ण होने वाला है, इसलिए हमारा ध्यान न केवल एन्कोडिंग पर हो सकता है, बल्कि इसे 222 बाइट पर ही निर्देशित किया जाना चाहिए। चूंकि यह बिल्कुल यादृच्छिक बाइट्स नहीं है और बिटकॉइन लेनदेन संरचना बिल्कुल सबसे प्रभावी संरचना नहीं है, इसलिए इन बाइट्स को संपीड़ित करने के अवसर हैं (या कुछ "बेकार" बाइट्स से छुटकारा पाने के लिए)।
आइए पहले इसे तोड़ते हैं और देखते हैं कि हम किन बाइट्स से छुटकारा पा सकते हैं:

1) 02000000
2) 0001
3) 01
4) e939fb23e9991ebbc75fd08c736da32ca12d98a4ff1b8e970e97f5661927ee41
5) 01000000
6) 00
7) fdffffff
8) 02
9) b0a90a0000000000
10) 16001421e2f997b3bd36e273eaca365da8515a389444ae
11) 40420f0000000000
12) 160014829e2dbcf6b7f31bc93633971f71f6f6b9b5f89e
13) 02
14) 47304402200f8e3e573be749caf1964a85707bf540de2e7b367ae46c23bd4f21932ff82346022062dc3007072cd5a19b45e479525f4829bc48be4fd3c21b5a9ae34bcf9a3a3ccf01
15) 21020f88c7db36cbb492e80d3062fc19db55bed82687498f8cfe6d0cf47adf6687aa
16) 49f31b00
  1. संस्करण
    1 बाइट में बदल सकता है जो कि CompactInt -> के रूप में एन्कोडेड है02
  2. साक्षी ध्वज
    छोड़ा जा सकता है -> (यह # 6 को संशोधित करके काम करता है)
  3. इनपुट गणना
    कोई परिवर्तन नहीं ->01
  4. इनपुट लेनदेन हैश
    कोई परिवर्तन नहीं ->e939fb23e9991ebbc75fd08c736da32ca12d98a4ff1b8e970e97f5661927ee41
  5. इनपुट इंडेक्स
    एक और कॉम्पैक्टआईंट ->01
  6. हस्ताक्षर स्क्रिप्ट
    एक नियम के रूप में, सभी स्क्रिप्ट एक ध्वज 1 = P2PKH, 2 = P2WPKH, 3 = P2SH, ... 255 = notdefined के साथ शुरू हो सकती हैं, और जब उन्हें परिभाषित नहीं किया जाता है तो सटीक स्क्रिप्ट को आकार और बाकी सब के साथ यहां रखा जाता है। प्रत्येक दूसरे भाग की तरह, रिसीवर को स्क्रिप्ट का सही तरीके से निर्माण करना होता है (साक्षी ध्वज # 2 सेट करें, इन्हें साक्षी आइटम # 14 & # 15 पर ले जाएं, प्रत्येक पुश पुश के लिए लंबाई जोड़ें, DER सांकेतिक हस्ताक्षर)
    गवाह बनता है: <1-बाइट-ध्वज > <32-बाइट-आर> <32-बाइट-एस> <33-बाइट- pubkey>
    <02><0f8e3e573be749caf1964a85707bf540de2e7b367ae46c23bd4f21932ff82346><62dc3007072cd5a19b45e479525f4829bc48be4fd3c21b5a9ae34bcf9a3a3ccf><01><020f88c7db36cbb492e80d3062fc19db55bed82687498f8cfe6d0cf47adf6687aa>
    अगर प्यूबिक असम्पीडित था तो पहले बाइट को बदल दिया जाता है 0x82=0b10000010(सबसे महत्वपूर्ण बिट सेट) को इंगित करने के लिए असम्पीडित प्यूब का निर्माण किया जाना चाहिए।
  7. अनुक्रम
    को एक "स्टैकइंट" के रूप में एन्कोड किया जा सकता है (एक संख्या जिसे स्टैक में धकेल दिया जा सकता है जो नकारात्मक हो सकता है)
    1 = OP_1, 2 = OP_2 -1 = OP_NegativeOne -2 = 0x82, 321321 = 0xfffe29e70400
    चूंकि 0xfdffffff UInt32.Max-2 है - >82
  8. आउटपुट गणना
    कोई परिवर्तन नहीं ->02
  9. राशि के
    रूप में CompactInt->feb0a90a00
  10. Pubkey स्क्रिप्ट
    हस्ताक्षर स्क्रिप्ट के समान है हम मानक स्क्रिप्ट के लिए झंडे का उपयोग कर सकते हैं, उदा। 0x03 P2WPKH स्क्रिप्ट हो सकता है ->0321e2f997b3bd36e273eaca365da8515a389444ae
  11. राशि के
    रूप में CompactInt->fe40420f00
  12. पबकी स्क्रिप्ट
    पहले की तरह ही03829e2dbcf6b7f31bc93633971f71f6f6b9b5f89e
  13. गवाह मद की गणना
    निकाली गई ->
  14. गवाह
    हटाया गया (यह पहले से ही # 6 में रखा गया है) ->
  15. गवाह
    हटाया गया (यह पहले से ही # 6 में रखा गया है) ->
  16. लॉकटाइम
    कोई परिवर्तन नहीं ->49f31b00

अब 222 बाइट्स को 192 बाइट्स (13.5%) में संपीड़ित किया जाता है, जिसे बाद में सर्वोत्तम संभव परिणाम प्राप्त करने के लिए अधिक कुशल एन्कोडिंग के साथ एन्कोड किया जा सकता है। यह और अधिक संपीड़ित हो सकता है यदि आप इस लेनदेन को उनके आउटपुट (ओं) को छोड़ कर निधियों के वास्तविक रिसीवर को भेज रहे हैं। उदाहरण के लिए, जब आप satoshi को भुगतान करने वाले थे , तो रिसीवर पहले से ही यह जानता है और आपको उन्हें फिर से बताने की आवश्यकता नहीं है। इसका मतलब है कि # 11 और # 12 में 26 बाइट्स को घटाकर 166 बाइट्स (25.2%) के आकार को कम किया जा सकता है । लेकिन इस पर सहमति होनी चाहिए कि प्राप्त आउटपुट उदाहरण के लिए पहला है। अधिक समझौतों के साथ आने से यह और भी संकुचित हो सकता है :
698800bc1qy830n9anh5mwyul2egm9m2z3tgufg39wk4g0eu

  • टीएक्स संस्करण हमेशा 2 -> 165 बाइट्स होना चाहिए
  • SigHashType हमेशा SigHashAll होना चाहिए -> 164 बाइट्स (प्रत्येक इनपुट से हटाएं # 6 यहाँ)
  • प्रत्येक इनपुट अनुक्रम को पूर्वनिर्धारित int पर सेट किया जाना चाहिए -> 163 बाइट्स (# 7 छोड़ें)
  • Tx में हमेशा 2 आउटपुट होने चाहिए -> 162 बाइट्स (स्किप # 8)
  • लॉकटाइम हमेशा 0 होना चाहिए - 158 बाइट्स (# 16 छोड़ें) ( 28.8% )