Comments 14
Всеми признанный король криптовалют использует хеш-функцию secp256k1
Это не хеш-функция...
Биткойн использует алгоритм цифровой подписи с эллиптической кривой (ECDSA), основанный на шифровании с эллиптической кривой. Конкретная эллиптическая кривая называется secp256k1, т.е. кривая y² = x³ + 7
Насколько качественный генератор в rand::rngs::OsRng, к слову?
Название структуры косвенно намекает на то, что все зависит от операционной системы. Есть документация с источниками генерации. Об их качестве к сожалению рассуждать не могу
По-хорошему, не хватает функции освобождения памяти, а то если для каких-то задач генерировать адреса в цикле или в долгоживущем сервере, то в конце концов может случиться "ой".
На самом деле я не до конца понял этот момент. По сути C.GoString
- обычная структура { ptr*, len }
и должна менеджиться GC как и остальные строки в Go. Тем более, если посмотреть в документацию там указано, что например C.CString
надо высвобождать вручную, но про C.GoString
такого нет (https://pkg.go.dev/cmd/cgo#hdr-Go_references_to_C). Но наверное лучше делать так:
// ..
c_ptr := C.foo()
go_str := C.GoString(c_ptr)
defer C.free(unsafe.Pointer(c_ptr))
// ..
UPD: Так же в документации написано, что C.GoString
делает копию оригинальной строки. Так что судя по всему высвобождать оригинальную - обязательно.
A few special functions convert between Go and C types by making copies of the data. In pseudo-Go definitions.
Высвобождать память должен тот же аллокатор, что и выделял память. У вас почти никогда нет гарантии, что аллокатор в двух языках будет одинаковым. Поэтому, почти всегда освобождать память надо на той же стороне, где создавался объект, в противном случае это чистое UB с отстрелом ног.
#[no_mangle]
pub unsafe extern "C" fn free_wallet(p: *mut i8) {
let _ = CString::from_raw(p);
}
Криптография на Rust и немного FFI