5 months ago

在比特币中生成地址是免费的,一个人可以生成多个地址,每生成一个地址就代表着生成了对应的一个私钥和一个公钥,地址和公钥是可以公开给别人看的,但私钥必须隐藏好,否则你很可能会失去这个地址内所有的比特币。

//首先调用函数仓库,函数仓库分为三种:1、操作系统的函数仓库;2、标准函数仓库;3、第三方机构或个人写的函数仓库。
其中,stdio.h(标准输出和输入的函数库)、stdlib.h(内存分配的函数库)和 string.h(字符串和内存管理函数库)都是三个标准且常用的函数仓库。
tomcrypt.h是第三方机构函数库,#define TFM_DESE是为了激活tomcrypt.h内的函数用的,是调用此函数的标准写法。

#define TFM_DESC

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "tomcrypt.h"
#include "tfm.h"

//这里是定义base58check encoding的用法,目的是将生字节转换成base58字符串。
因为在直接调用这个函数方法时失败,所以将源代码粘贴到这里,所以代码看起来很长。

static const char b58digits_ordered[] = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijk$

// Base58

int b58enc(char *b58, size_t *b58sz, const void *data, size_t binsz)
{
   const uint8_t *bin = data;
   int carry;
   ssize_t i, j, high, zcount = 0;
   size_t size;

   while (zcount < binsz && !bin[zcount])
      ++zcount;

   size = (binsz - zcount) * 138 / 100 + 1;
   uint8_t buf[size];
   memset(buf, 0, size);

   for (i = zcount, high = size - 1; i < binsz; ++i, high = j)
   {
      for (carry = bin[i], j = size - 1; (j > high) || carry; --j)
      {
         carry += 256 * buf[j];
         buf[j] = carry % 58;
         carry /= 58;
      }
   }
   
     for (j = 0; j < size && !buf[j]; ++j);

   if (*b58sz <= zcount + size - j)
   {
      *b58sz = zcount + size - j + 1;
      return 0;
   }

   if (zcount)
      memset(b58, '1', zcount);
   for (i = zcount; j < size; ++i, ++j)
      b58[i] = b58digits_ordered[buf[j]];
   b58[i] = '\0';
   *b58sz = i + 1;

   return 1;
}

//这里是为了调用随机数生成器
char *get_random(int length)
{
   FILE *_8425;
   char *random;

   random = malloc(length);

   _8425 = fopen("/dev/urandom", "r");
   fread(random, 1, length, _8425);

   return random;
}

//这里是为了获得私钥,并输出私钥
char *get_private(int *length)
{
   prng_state _2761;
   ecc_key _5440;
   char *private;

   private = malloc(*length = 1000);
   
   //这是调用了 ECC 加密学函数,为了生成私钥
   ecc_make_key(&_2761, find_prng("sprng"), 32, &_5440);
   
   //这个函数是为了以字符串的形式输出私钥
   ecc_export(private, length, PK_PRIVATE, &_5440);
   
    return private;
}

//这里是为了引入私钥,生成并输出公钥
char *get_public(int *length, char *private)
{
   ecc_key _1006;
   char *public;

   //这里引入了私钥
   ecc_import(private, *length, &_1006);
   public = malloc(*length = 1000);
   
   //这里生成了公钥,并以字符串的形式输出
   ecc_export(public, length, PK_PUBLIC, &_1006);

   return public;
}

//这里是主函数,上面的函数都会在这个主函数中被调用
int main(int _3464, char **_1019, char **_1109)
{
   int _7727, _6282, _6904, _9440;
   char *private, *public, *new_private, *new_public;
   prng_state _3618;

   //这三行是配合tomcrypt.h这个函数库的,是调用这个函数的标准写法。
   ltc_mp = tfm_desc;
   register_prng(&sprng_desc);
   register_hash(&sha256_desc);
  
   //以下是生成地址的流程,请结合流程图来看代码
   private = get_private(&_7727);
   _6282 = _7727;
   public = get_public(&_6282, private);

   new_private = malloc(_6904 = 1000);
   new_public = malloc(_9440 = 1000);

   //base64 是将字符串转换成生字节
   base64_encode(private, _7727, new_private, &_6904);
   base64_encode(public, _6282, new_public, &_9440);

   new_private[_6904] = 0;
   new_public[_9440] = 0;
   
   //以字符串的形式打印私钥
   printf("private: %s%c", new_private, 10);
   
   //以字符串的形式打印公钥
   printf("public: %s%c", new_public, 10);

   hash_state _8438; char *_6643;

   //sha256
   _6643 = malloc(32);
   sha256_init(&_8438);
   sha256_process(&_8438, public, _6282);
   sha256_done(&_8438, _6643);

   hash_state _7516; char *_4485;
   
   //ripemd160
   _4485 = malloc(21);
   _4485[0] = 137;
   rmd160_init(&_7516);
   rmd160_process(&_7516, _6643, 32);
   rmd160_done(&_7516, _4485 + 1);
   
   hash_state _5545; char *_2796;

   //sha256
   _2796 = malloc(32);
   sha256_init(&_5545);
   sha256_process(&_5545, _4485, 21);
   sha256_done(&_5545, _2796);

   hash_state _7512; char *_2952;

   //sha256
   _2952 = malloc(32);
   sha256_init(&_7512);
   sha256_process(&_7512, _2796, 32);
   sha256_done(&_7512, _2952);

   char *_1230;

   _1230 = malloc(25);
   memcpy(_1230, _4485, 21);
   memcpy(_1230 + 21, _2952, 4);
   
   char *_7665; int _9583;

   //base58 将生字节转换成字符串
   _7665 = malloc(_9583 = 100);
   b58enc(_7665, &_9583, _1230, 25);
   _7665[_9583] = 0;
   
   //以字符串的形式打印地址
   printf("address: %s%c", _7665, 10);
}

登陆服务器,然后 cd /tmp/relay
cp * /home/yourname (你的名字拼音) 【这一步是将代码全部复制到你私人的服务器上,请在你自己的服务器上测试】
cd
使用 nano 来打开文件
退出 nano 编辑器:contrl + x
比如:nano generate.c
将 generate.c 转换成执行文件的基本框架:
第一步,编译:tcc -c -o generate.o generate.c (generate.o 文件生成)
第二步,连接:tcc -o generate generate.o (generate 执行文件生成,并且名字是可以自定义的)

这两步老师都生成好了,不需要再操作,如果想操作可以这样做:
mkdir xcy 新建一个名叫 xcy 的文件夹
cp libtomcrypt.a libtfm.a generate.c xcy
cd xcy
tcc -c -o generate.o generate.c
tcc -o generate generate.o libtomcrypt.a libtfm.a (后面两个是加密算法的文件,在 generate 中调用了很多加密函数都是来自于这两个文件,我们要将这两个文件跟 generate 连接起来。)
执行文件:./generate

← 为节点制作Tcp Table
 
comments powered by Disqus