質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Bitcoin

Bitcoinは、インターネット上で流通している電子マネーです。P2Pネットワークを通じた安価な決済コストが実現できる一方、取引時の危険性や闇市場・資金洗浄など不正取引の温床といった法的問題も抱えています。

Q&A

0回答

983閲覧

複数のUTXOからBitcoinまたはLitecoinの送金をPay-to-PubkeyHashで行う。

nekoooo

総合スコア10

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Bitcoin

Bitcoinは、インターネット上で流通している電子マネーです。P2Pネットワークを通じた安価な決済コストが実現できる一方、取引時の危険性や闇市場・資金洗浄など不正取引の温床といった法的問題も抱えています。

0グッド

0クリップ

投稿2018/12/01 00:33

編集2022/01/12 10:55

前提・実現したいこと

BitcoinまたはLitecoinの送金をPay-to-PubkeyHashで行いたいのですが。
1つのUTXOからの送金を
https://en.bitcoin.it/wiki/Transaction#Pay-to-PubkeyHash
https://github.com/shirriff/bitcoin-code/blob/master/txnUtils.py
を参考に送金を行うことができました。
しかし
2つ3つの同じアドレスのUTXOから送金をしたいと思っています。

発生している問題・エラーメッセージ

https://github.com/shirriff/bitcoin-code/blob/master/txnUtils.py
のソースコードを元に以下のソースコードを作成実行したところAPI側から
Non-canonical signature: S value is unnecessarily high
とエラーが発生してしまいます。

該当のソースコード

python

1class BitcoinTransaction(): 2 def __init__(self,type="insight",APIURL="https://insight.litecore.io",txversion="01000000",iVersion=48,iWIFVersion=176): 3 if type == "insight": 4 self.APIRapper = insight(APIURL) 5 elif type == "dogechain": 6 self.APIRapper = dogechain() 7 8 self.txversion = txversion 9 10 self.util = BitcoinUtil(iVersion,iWIFVersion) 11 12 13 def varstr(self,s): 14 return self.varint(len(s)) + s 15 16 17 def varint(self,n): 18 if n < 0xfd: 19 return struct.pack('<B', n) 20 elif n < 0xffff: 21 return struct.pack('<cH', '\xfd', n) 22 elif n < 0xffffffff: 23 return struct.pack('<cL', '\xfe', n) 24 else: 25 return struct.pack('<cQ', '\xff', n) 26 27 28 29 def GetScriptPubKeyFromAddress(self,address): 30 pubkeyhash = self.util.GetPubkeyhashFromAddress(address) 31 return '76a914' + pubkeyhash + '88ac' 32 33 34 35 def CreateRawInputs(self,address): 36 utxos = self.APIRapper.utxo(address) 37 38 inputs_text = "" 39 inputs_text = inputs_text + "%02x" % len(utxos) 40 41 for index,utxo in enumerate(utxos): 42 utxoTx = binascii.unhexlify(utxo["txid"]) 43 utxoTx = utxoTx[::-1] 44 utxoTx = binascii.hexlify(utxoTx) 45 utxoTx = utxoTx.decode('utf-8') 46 47 utxoIndex = utxo["vout"] 48 utxoIndex = struct.pack('<L', utxoIndex) 49 utxoIndex = binascii.hexlify(utxoIndex) 50 utxoIndex = utxoIndex.decode('utf-8') 51 52 scriptPubKey = utxo["scriptPubKey"] 53 scriptPubKey_size = len(binascii.unhexlify(scriptPubKey)) 54 scriptPubKey_size = "%02x" % scriptPubKey_size 55 56 sequence = "ffffffff" 57 58 inputs_text = inputs_text + (utxoTx + utxoIndex + scriptPubKey_size + scriptPubKey + sequence) 59 60 return inputs_text 61 62 63 64 def CreateSignInputs(self,privkey,datas): 65 address = self.util.GetKeysFromPrivkey(privkey)["address"] 66 utxos = self.APIRapper.utxo(address) 67 68 sk = SigningKey.from_string(binascii.unhexlify(privkey), curve=SECP256k1) 69 70 71 72 inputs_text = "" 73 inputs_text = inputs_text + "%02x" % len(utxos) 74 75 for index,utxo in enumerate(utxos): 76 utxoTx = binascii.unhexlify(utxo["txid"]) 77 utxoTx = utxoTx[::-1] 78 utxoTx = binascii.hexlify(utxoTx) 79 utxoTx = utxoTx.decode('utf-8') 80 81 utxoIndex = utxo["vout"] 82 utxoIndex = struct.pack('<L', utxoIndex) 83 utxoIndex = binascii.hexlify(utxoIndex) 84 utxoIndex = utxoIndex.decode('utf-8') 85 86 87 88 RawTransaction = self.CreateRawTransaction(address,datas) 89 txhash = hashlib.sha256(hashlib.sha256(binascii.unhexlify(RawTransaction)).digest()).digest() 90 91 sig = sk.sign_digest(txhash, sigencode=ecdsa.util.sigencode_der) + binascii.unhexlify('01') # 01 is hashtype 92 pubKey = binascii.unhexlify(self.util.GetPubkeyFromPrivkey(privkey)) 93 scriptSig = binascii.hexlify(self.varstr(sig)).decode('utf-8') + binascii.hexlify(self.varstr(pubKey)).decode('utf-8') 94 95 scriptSig_size = len(binascii.unhexlify(scriptSig)) 96 scriptSig_size = "%02x" % scriptSig_size 97 98 99 sequence = "ffffffff" 100 101 inputs_text = inputs_text + (utxoTx + utxoIndex + scriptSig_size + scriptSig + sequence) 102 103 return inputs_text 104 105 106 107 108 def CreateOutputs(self,datas): 109 outputs_text = "" 110 outputs_text = outputs_text + "%02x" % len(datas) 111 for data in datas: 112 redemptionSatoshis, address = data 113 114 rspack = struct.pack("<Q", redemptionSatoshis) 115 rspack = binascii.hexlify(rspack).decode('utf-8') 116 117 outputScript = self.GetScriptPubKeyFromAddress(address) 118 outputScript_size = len(binascii.unhexlify(outputScript)) 119 outputScript_size = "%02x" % outputScript_size 120 121 outputs_text = outputs_text + (rspack + outputScript_size + outputScript) 122 123 outputs_text = outputs_text + "00000000" 124 125 return outputs_text 126 127 128 129 def CreateRawTransaction(self,inputaddress,datas): 130 RawTransaction = "" 131 RawTransaction = RawTransaction + self.txversion 132 RawTransaction = RawTransaction + self.CreateRawInputs(inputaddress) 133 RawTransaction = RawTransaction + self.CreateOutputs(datas) 134 135 RawTransaction = RawTransaction + "01000000" 136 137 return RawTransaction 138 139 140 141 def CreateSignTransaction(self,privkey,datas): 142 SignTransaction = "" 143 SignTransaction = SignTransaction + self.txversion 144 SignTransaction = SignTransaction + self.CreateSignInputs(privkey,datas) 145 SignTransaction = SignTransaction + self.CreateOutputs(datas) 146 147 return SignTransaction

試したこと

python

1scriptSig = binascii.hexlify(self.varstr(sig)).decode('utf-8') + binascii.hexlify(self.varstr(pubKey)).decode('utf-8')

sigの元のtxhashの元のrawTransactionの中を変更したりしました。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問