Bitcoin google protocolo de erro de buffer usando python django?falta serialized_payment_details
-
20-12-2019 - |
Pergunta
Aqui está o meu problema caras,
Eu inicializar o protofile como mostrado na bitcoin para desenvolvedores wiki mostrado aqui:
package payments;
option java_package = "org.bitcoin.protocols.payments";
option java_outer_classname = "Protos";
message Output {
optional uint64 amount = 1 [default = 0];
required bytes script = 2;
}
message PaymentDetails {
optional string network = 1 [default = "test"];
repeated Output outputs = 2;
required uint64 time = 3;
optional uint64 expires = 4;
optional string memo = 5;
optional string payment_url = 6;
optional bytes merchant_data = 7;
}
message PaymentRequest {
optional uint32 payment_details_version = 1 [default = 1];
optional string pki_type = 2 [default = "none"];
optional bytes pki_data = 3;
required bytes serialized_payment_details = 4;
optional bytes signature = 5;
}
message X509Certificates {
repeated bytes certificate = 1;
}
message Payment {
optional bytes merchant_data = 1;
repeated bytes transactions = 2;
repeated Output refund_to = 3;
optional string memo = 4;
}
message PaymentACK {
required Payment payment = 1;
optional string memo = 2;
}
jogar este modo de exibição em django que obtém a chave pública associada a uma recém-criada endereço, hashes para o formato correto para um script, serializa o 'serialized_payment_details campo e retorna um objeto de resposta.
def paymentobject(request):
def addr_160(pub):
h3 = hashlib.sha256(unhexlify(pub))
return hashlib.new('ripemd160', h3.digest())
x = payments_pb2
btc_address = bc.getnewaddress()
pubkey_hash = bc.validateaddress(btc_address).pubkey
pubkey_hash160 = addr_160(pubkey_hash).hexdigest()
hex_script = "76" + "a9" + "14" + pubkey_hash160 + "88" + "ac"
serialized_script = hex_script.decode("hex")
xpd = x.PaymentDetails()
xpd.time = int(time())
xpd.outputs.add(amount = 0, script = serialized_script)
xpr = x.PaymentRequest()
xpr.serialized_payment_details = xpd.SerializeToString()
return HttpResponse(xpr.SerializeToString(), content_type="application/octet-stream")
Quando eu direciono o meu bitcoin v0.9 cliente na URI
bitcoin:?r=http://127.0.0.1:8000/paymentobject
Estou satisfeita com um erro
[libprotobuf ERROR google/protobuf/message_lite.cc:123] Can't parse message of type "payments.PaymentRequest" because it is missing required fields: serialized_payment_details
Mas ele não está em falta no campo de detalhes é?
Bem-vindo, obrigado :)
Solução
A resposta foi a de que (no momento da escrita), você não pode especificar zero como a Output.amount
.O bitcoin-qt 0.9 cliente considera a poeira e não permitir que a transação prossiga.
Mais informações aqui.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow