static bool nc_msg_version(struct nc_conn *conn) { if (conn->seen_version){ LOG("version command already seen from:%s", conn->addr_str); return false; } conn->seen_version = true; struct const_buffer buf = { conn->msg.data, conn->msg.hdr.data_len }; struct msg_version mv; bool rc = false; msg_version_init(&mv); if (!deser_msg_version(&mv, &buf)) goto out; if (debugging) { char fromstr[64], tostr[64]; bn_address_str(fromstr, sizeof(fromstr), mv.addrFrom.ip); bn_address_str(tostr, sizeof(tostr), mv.addrTo.ip); fprintf(plog, "net: %s version(%u, 0x%llx, %lld, To:%s, From:%s, %s, %u)\n", conn->addr_str, mv.nVersion, (unsigned long long) mv.nServices, (long long) mv.nTime, tostr, fromstr, mv.strSubVer, mv.nStartingHeight); } if (!(mv.nServices & NODE_NETWORK)) /* require NODE_NETWORK */ goto out; if (mv.nonce == instance_nonce) /* connected to ourselves? */ goto out; conn->protover = MIN(mv.nVersion, PROTO_VERSION); /* acknowledge version receipt */ if (!nc_conn_send(conn, "verack", NULL, 0)) goto out; rc = true; out: msg_version_free(&mv); return rc; }
static cstring *nc_version_build(struct nc_conn *conn) { struct msg_version mv; msg_version_init(&mv); mv.nVersion = PROTO_VERSION; mv.nTime = (int64_t) time(NULL); mv.nonce = *conn->nci->instance_nonce; sprintf(mv.strSubVer, "/picocoin:%s/", VERSION); mv.nStartingHeight = conn->nci->db->best_chain ? conn->nci->db->best_chain->height : 0; cstring *rs = ser_msg_version(&mv); msg_version_free(&mv); return rs; }
static cstring *nc_version_build(struct nc_conn *conn) { struct msg_version mv; msg_version_init(&mv); mv.nVersion = PROTO_VERSION;/* from picocoin.h (60002) */ /* from core.hi: enum { NODE_NETWORK = (1 << 0)}*/ mv.nServices = blocks_fd >= 0 ? NODE_NETWORK : 0; mv.nTime = (int64_t) time(NULL); /* number of seconds since 1970*/ mv.nonce = instance_nonce;/* generated by RAND_bytes (OpenSSL) */ /* VERSION in picocoin-config.h "0.1git" */ sprintf(mv.strSubVer, "/brd:%s/", VERSION); mv.nStartingHeight = db.best_chain ? db.best_chain->height : 0; cstring *rs = ser_msg_version(&mv); msg_version_free(&mv); return rs; }