版权声明:本文为博主原创文章,未经博主允许不得转载。深圳夸克时代在线技术有限公司 官网:http://www.kksdapp.com https://blog.csdn.net/wahaha13168/article/details/82989000
1:创建种子
// MARK: - Create Seed
- (NSData *)createSeed;
{
void *mem = malloc(32);
NSData *data = [[NSData alloc] initWithBytes:mem length:32];
unsigned char *bytePair = (unsigned char *)[data bytes];
xrb_generate_random(bytePair);
free(mem);
return data;
}
2:创建私钥
// MARK: - Crate Private Keys
- (NSData *)createPrivateKey:(NSData *)seed atIndex:(UInt8)index;
{
unsigned char *seedBytePair = (unsigned char *)[seed bytes];
void *priv = malloc(32);
NSData *privateKeyData = [[NSData alloc] initWithBytes:priv length:32];
unsigned char *privateKeyBytePair = (unsigned char *)[privateKeyData bytes];
xrb_seed_key(seedBytePair, index, privateKeyBytePair);
free(priv);
return privateKeyData;
}
3:通过种子来得到私钥
- (NSData *)privateKeyForSeed:(NSString *)seed atIndex:(UInt8)index;
{
const char *str = [seed UTF8String];
void *mem = malloc(32);
NSData *data = [[NSData alloc] initWithBytes:mem length:32];
unsigned char *bytePair = (unsigned char *)[data bytes];
xrb_uint256_from_string((char *)str, bytePair);
free(mem);
return [self createPrivateKey:data atIndex:index];
}
4:通过私钥来得到公钥
// MARK: - Create Public Key
- (NSData *)createPublicKey:(NSData *)privateKey;
{
unsigned char *privateKeyBytePair = (unsigned char *)[privateKey bytes];
void *public = malloc(32);
NSData *publicKeyData = [[NSData alloc] initWithBytes:public length:32];
unsigned char *publicKeyBytePair = (unsigned char *)[publicKeyData bytes];
xrb_key_account(privateKeyBytePair, publicKeyBytePair);
free(public);
return publicKeyData;
}
5:通过公钥得到地址
// MARK: - Create Addresses
- (NSString *)createAddressFromPublicKey:(NSData *)publicKey;
{
char string[128] = {0};
unsigned char *publicKeyBytes = (unsigned char *)[publicKey bytes];
xrb_uint256_to_address(publicKeyBytes, string);
NSString *address = [NSString stringWithFormat:@"%s", string];
if (![self walletAddressIsValid:address]) {
return nil;
}
return address;
}
- (NSString *)createAddressFromPublicKeyString:(NSString *)publicKey;
{
const char *str = [publicKey UTF8String];
void *mem = malloc(32);
NSData *data = [[NSData alloc] initWithBytes:mem length:32];
unsigned char *bytePair = (unsigned char *)[data bytes];
xrb_uint256_from_string((char *)str, bytePair);
char string[128] = {0};
xrb_uint256_to_address(bytePair, string);
NSString *address = [NSString stringWithFormat:@"%s", string];
if (![self walletAddressIsValid:address]) {
return nil;
}
free(mem);
return address;
}
6:用私钥去签名交易
- (NSString *)signTransaction:(NSString *)transaction withPrivateKey:(NSData *)privateKey;
{
const char *txn = [transaction UTF8String];
unsigned char *privateKeyBytePair = (unsigned char *)[privateKey bytes];
const char *signedTransaction = xrb_sign_transaction((char *)txn, privateKeyBytePair);
return [NSString stringWithFormat:@"%s", signedTransaction];
}
7:验证地址是否有效
// MARK: - Address validation
- (BOOL)walletAddressIsValid:(NSString *)string;
{
const char *str = [string UTF8String];
return xrb_valid_address((char *)str) == 0;
}