Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}