Pull to refresh

Comments 14

Всеми признанный король криптовалют использует хеш-функцию secp256k1

Это не хеш-функция...

Там и в оригинале написано secp256k1 elliptic curves hash algorithm...

Спасибо за комментарий, я и правда перепутал алгоритм цифровой подписи с хеш-функцией в статье про криптографию :( Когда переводил, забыл исправить этот момент

Биткойн использует алгоритм цифровой подписи с эллиптической кривой (ECDSA), основанный на шифровании с эллиптической кривой. Конкретная эллиптическая кривая называется secp256k1, т.е. кривая y² = x³ + 7

https://russianblogs.com/article/22411554642/

За что вам минус поставили в комментарий??

очевидно, что человек не хочет признать свою ошибку, а написать открыто, что не так - кишка тонка, вот и стучит.

Я не ставил вам минус, веткой выше я уже признал свою ошибку, спасибо.

Я не про Вас, а про того, кто поставил. В интернете много г..на плавает.

Насколько качественный генератор в 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);
}

Sign up to leave a comment.

Articles