擅长:python、mysql、java
<p>以下是<a href="http://openssl.sourcearchive.com/documentation/1.0.0d-2/crypto_2ec_2ec_8h_a1a93f5739c093586ef83517b52b44a0c.html" rel="nofollow">i2o_ECPublicKey()</a>的OpenSSL文档。这些文档是为C程序员编写的,但是它们仍然包含了对Python程序员有用的信息(但是我承认,如果你知道C:),它会有所帮助。在</p>
<p>正如这些文档所述,<code>i2o_ECPublicKey()</code>的第二个参数应该是指向输出缓冲区的指针;如果您将<code>NULL</code>作为第二个参数传递给<code>i2o_ECPublicKey()</code>,它只返回输出缓冲区所需的字节数;您应该保存该返回值,以便可以使用正确大小的正确初始化缓冲区重新调用<code>i2o_ECPublicKey</code>。要使用Python ctypes传递<code>NULL</code>,您需要使用<code>None</code>。我怀疑将<code>0</code>传递给一个需要指针的lib函数可能会混淆事情,从而导致灾难性的结果。在</p>
<p>所以用这个代替上面的代码:</p>
<pre><code>import ctypes
from bitcoin.core.key import NID_secp256k1
ssl = ctypes.cdll.LoadLibrary('/usr/lib/x86_64-linux-gnu/libssl.so')
eckey = ssl.EC_KEY_new_by_curve_name(NID_secp256k1)
keysize = ssl.i2o_ECPublicKey(eckey, None)
</code></pre>
<p>看看这能不能避免segfault。如果有效,可以使用<a href="https://docs.python.org/2/library/ctypes.html#ctypes.create_string_buffer" rel="nofollow">create_string_buffer(keysize)</a>初始化实际的输出缓冲区。在</p>