mirror of
https://github.com/ilyakooo0/urbit.git
synced 2024-12-21 05:41:43 +03:00
mine a comet under a list of stars that we download
This commit is contained in:
parent
86c38a46ea
commit
b13f444809
190
vere/dawn.c
190
vere/dawn.c
@ -8,6 +8,40 @@
|
||||
#include "all.h"
|
||||
#include "vere/vere.h"
|
||||
|
||||
/* _dawn_oct_to_buf(): +octs to uv_buf_t
|
||||
*/
|
||||
static uv_buf_t
|
||||
_dawn_oct_to_buf(u3_noun oct)
|
||||
{
|
||||
if ( c3n == u3a_is_cat(u3h(oct)) ) {
|
||||
u3_lo_bail();
|
||||
}
|
||||
|
||||
c3_w len_w = u3h(oct);
|
||||
c3_y* buf_y = c3_malloc(1 + len_w);
|
||||
buf_y[len_w] = 0;
|
||||
|
||||
u3r_bytes(0, len_w, buf_y, u3t(oct));
|
||||
|
||||
u3z(oct);
|
||||
return uv_buf_init((void*)buf_y, len_w);
|
||||
}
|
||||
|
||||
/* _dawn_buf_to_oct(): uv_buf_t to +octs
|
||||
*/
|
||||
static u3_noun
|
||||
_dawn_buf_to_oct(uv_buf_t buf_u)
|
||||
{
|
||||
u3_noun len = u3i_words(1, (c3_w*)&buf_u.len);
|
||||
|
||||
if ( c3n == u3a_is_cat(len) ) {
|
||||
u3_lo_bail();
|
||||
}
|
||||
|
||||
return u3nc(len, u3i_bytes(buf_u.len, (const c3_y*)buf_u.base));
|
||||
}
|
||||
|
||||
|
||||
/* _dawn_curl_alloc(): allocate a response buffer for curl
|
||||
*/
|
||||
static size_t
|
||||
@ -74,37 +108,51 @@ _dawn_post_json(c3_c* url_c, uv_buf_t lod_u)
|
||||
return buf_u;
|
||||
}
|
||||
|
||||
/* _dawn_oct_to_buf(): +octs to uv_buf_t
|
||||
*/
|
||||
static uv_buf_t
|
||||
_dawn_oct_to_buf(u3_noun oct)
|
||||
{
|
||||
if ( c3n == u3a_is_cat(u3h(oct)) ) {
|
||||
u3_lo_bail();
|
||||
}
|
||||
|
||||
c3_w len_w = u3h(oct);
|
||||
c3_y* buf_y = c3_malloc(1 + len_w);
|
||||
buf_y[len_w] = 0;
|
||||
|
||||
u3r_bytes(0, len_w, buf_y, u3t(oct));
|
||||
|
||||
u3z(oct);
|
||||
return uv_buf_init((void*)buf_y, len_w);
|
||||
}
|
||||
|
||||
/* _dawn_buf_to_oct(): uv_buf_t to +octs
|
||||
/* _dawn_get_jam(): GET a jammed noun from url_c
|
||||
*/
|
||||
static u3_noun
|
||||
_dawn_buf_to_oct(uv_buf_t buf_u)
|
||||
_dawn_get_jam(c3_c* url_c)
|
||||
{
|
||||
u3_noun len = u3i_words(1, (c3_w*)&buf_u.len);
|
||||
CURL *curl;
|
||||
CURLcode result;
|
||||
long cod_l;
|
||||
|
||||
if ( c3n == u3a_is_cat(len) ) {
|
||||
uv_buf_t buf_u = uv_buf_init(c3_malloc(1), 0);
|
||||
|
||||
if ( !(curl = curl_easy_init()) ) {
|
||||
fprintf(stderr, "failed to initialize libcurl\n");
|
||||
u3_lo_bail();
|
||||
}
|
||||
|
||||
return u3nc(len, u3i_bytes(buf_u.len, (const c3_y*)buf_u.base));
|
||||
// XX require TLS, pin default cert?
|
||||
|
||||
curl_easy_setopt(curl, CURLOPT_URL, url_c);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, _dawn_curl_alloc);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)&buf_u);
|
||||
|
||||
result = curl_easy_perform(curl);
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &cod_l);
|
||||
|
||||
// XX retry?
|
||||
if ( CURLE_OK != result ) {
|
||||
fprintf(stderr, "failed to fetch %s: %s\n",
|
||||
url_c, curl_easy_strerror(result));
|
||||
u3_lo_bail();
|
||||
}
|
||||
if ( 300 <= cod_l ) {
|
||||
fprintf(stderr, "error fetching %s: HTTP %ld\n", url_c, cod_l);
|
||||
u3_lo_bail();
|
||||
}
|
||||
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
// throw away the length from the octs
|
||||
//
|
||||
u3_noun octs = _dawn_buf_to_oct(buf_u);
|
||||
u3_noun jammed = u3k(u3t(octs));
|
||||
u3z(octs);
|
||||
|
||||
return u3ke_cue(jammed);
|
||||
}
|
||||
|
||||
/* _dawn_eth_rpc(): ethereum JSON RPC with request/response as +octs
|
||||
@ -268,51 +316,8 @@ u3_dawn_vent(u3_noun seed)
|
||||
}
|
||||
// load snapshot from HTTP URL
|
||||
//
|
||||
// note: some duplicate code with _boot_home() in noun/manage.c
|
||||
//
|
||||
else if ( 0 != u3_Host.ops_u.sap_c ) {
|
||||
c3_c ful_c[2048];
|
||||
CURL *curl;
|
||||
CURLcode result;
|
||||
FILE *file;
|
||||
long cod_l;
|
||||
|
||||
snprintf(ful_c, 2048, "%s/.urb/ethereum.snap", u3_Host.dir_c);
|
||||
printf("dawn: downloading ethereum snapshot: fetching %s to %s\r\n",
|
||||
u3_Host.ops_u.sap_c, ful_c);
|
||||
fflush(stdout);
|
||||
|
||||
if ( !(curl = curl_easy_init()) ) {
|
||||
fprintf(stderr, "failed to initialize libcurl\n");
|
||||
fflush(stderr);
|
||||
exit(1);
|
||||
}
|
||||
if ( !(file = fopen(ful_c, "w")) ) {
|
||||
fprintf(stderr, "failed to open %s\n", ful_c);
|
||||
fflush(stderr);
|
||||
exit(1);
|
||||
}
|
||||
curl_easy_setopt(curl, CURLOPT_URL, u3_Host.ops_u.sap_c);
|
||||
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
|
||||
result = curl_easy_perform(curl);
|
||||
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &cod_l);
|
||||
fclose(file);
|
||||
if ( CURLE_OK != result ) {
|
||||
fprintf(stderr, "failed to fetch %s: %s\n",
|
||||
u3_Host.ops_u.sap_c, curl_easy_strerror(result));
|
||||
fprintf(stderr,
|
||||
"please fetch it manually and specify the location with -E\n");
|
||||
exit(1);
|
||||
}
|
||||
if ( 300 <= cod_l ) {
|
||||
fprintf(stderr, "error fetching %s: HTTP %ld\n", u3_Host.ops_u.sap_c, cod_l);
|
||||
fprintf(stderr,
|
||||
"please fetch it manually and specify the location with -E\n");
|
||||
exit(1);
|
||||
}
|
||||
curl_easy_cleanup(curl);
|
||||
|
||||
u3_noun raw_snap = u3ke_cue(u3m_file(ful_c));
|
||||
u3_noun raw_snap = _dawn_get_jam(u3_Host.ops_u.sap_c);
|
||||
sap = u3nc(u3_nul, raw_snap);
|
||||
}
|
||||
// no snapshot
|
||||
@ -351,7 +356,7 @@ u3_dawn_vent(u3_noun seed)
|
||||
}
|
||||
|
||||
{
|
||||
// +point:constitution:ethe: on-chain state
|
||||
// +point:azimuth: on-chain state
|
||||
//
|
||||
u3_noun pot;
|
||||
|
||||
@ -365,7 +370,7 @@ u3_dawn_vent(u3_noun seed)
|
||||
else if ( c3__pawn == rank ) {
|
||||
// irrelevant, just bunt +point
|
||||
//
|
||||
pot = u3v_wish("*point:constitution:ethe");
|
||||
pot = u3v_wish("*point:azimuth");
|
||||
}
|
||||
else {
|
||||
u3_noun who;
|
||||
@ -478,36 +483,12 @@ u3_dawn_vent(u3_noun seed)
|
||||
return u3nc(c3__dawn, u3nq(seed, pon, zar, u3nq(tuf, bok, url, sap)));
|
||||
}
|
||||
|
||||
/* u3_dawn_come(): mine a comet under star (unit)
|
||||
/* _dawn_come(): mine a comet under a list of stars
|
||||
*/
|
||||
u3_noun
|
||||
u3_dawn_come(u3_noun star)
|
||||
static u3_noun
|
||||
_dawn_come(u3_noun stars)
|
||||
{
|
||||
u3_noun seed;
|
||||
|
||||
if ( u3_nul == star ) {
|
||||
// XX ~marzod hardcoded
|
||||
// choose from list, at random, &c
|
||||
//
|
||||
star = 256;
|
||||
}
|
||||
else {
|
||||
// XX parse and validate
|
||||
//
|
||||
u3_noun tar = u3k(u3t(star));
|
||||
u3z(star);
|
||||
star = tar;
|
||||
}
|
||||
|
||||
{
|
||||
u3_noun sar = u3dc("scot", 'p', u3k(star));
|
||||
c3_c* tar_c = u3r_string(sar);
|
||||
|
||||
fprintf(stderr, "boot: mining a comet under %s\r\n", tar_c);
|
||||
free(tar_c);
|
||||
u3z(sar);
|
||||
}
|
||||
|
||||
{
|
||||
c3_w eny_w[16];
|
||||
u3_noun eny;
|
||||
@ -515,7 +496,9 @@ u3_dawn_come(u3_noun star)
|
||||
c3_rand(eny_w);
|
||||
eny = u3i_words(16, eny_w);
|
||||
|
||||
seed = u3dc("come:dawn", u3k(star), u3k(eny));
|
||||
fprintf(stderr, "boot: mining a comet\r\n");
|
||||
|
||||
seed = u3dc("come:dawn", u3k(stars), u3k(eny));
|
||||
u3z(eny);
|
||||
}
|
||||
|
||||
@ -528,7 +511,16 @@ u3_dawn_come(u3_noun star)
|
||||
u3z(who);
|
||||
}
|
||||
|
||||
u3z(star);
|
||||
u3z(stars);
|
||||
|
||||
return seed;
|
||||
}
|
||||
|
||||
/* u3_dawn_come(): mine a comet under a list of stars we download
|
||||
*/
|
||||
u3_noun
|
||||
u3_dawn_come()
|
||||
{
|
||||
return _dawn_come(
|
||||
_dawn_get_jam("https://bootstrap.urbit.org/comet-stars.jam"));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user